{"$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":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"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":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"]}},{"id":"D32","name":"Data Compliance (PII/GDPR)","shortDescription":{"text":"Data Compliance (PII/GDPR)"},"helpUri":"https://codehealth.canine.dev/dimensions/D32","relationships":[{"target":{"id":"CWE-359","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-312","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-200","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-359","CWE-312","CWE-200"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"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"]}],"properties":{"cwe":["CWE-1059"]}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AX7","name":"Slice cohesion","shortDescription":{"text":"Slice cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/AX7"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P5","name":"DR \u0026 Backup","shortDescription":{"text":"DR \u0026 Backup"},"helpUri":"https://codehealth.canine.dev/dimensions/P5"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"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":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured \u2014 JavaScript/TypeScript suite: Coverage NOT MEASURED: the JavaScript/TypeScript half could not be measured \u2014 the repository root runs vitest but declares no coverage provider, so the suite can run and still produce no lcov \u2014 add \u0060@vitest/coverage-v8\u0060 (or \u0060@vitest/coverage-istanbul\u0060) as a devDependency. Coverage is excluded from the score rather than counted as a near-zero. The named suite step is one the repository\u0027s maintainers can perform; once it passes, the real number is measured on the next scan. Alternatively, commit the lcov/Cobertura report your CI produces and it is read without a re-run."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has no unguarded join(homedir(), \u0022.claude\u0022) in runtime TypeScript: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92b0fd530509280e4a837b9572080be449f1b9d419beb614dff84e9fd43679b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has no $HOME/.claude without ${CLAUDE_CONFIG_DIR:-...} guard in scripts: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"05463da22d927b48060709b08f1ee85d07fe0bb5ad43a41a76cb135960e42aa2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: preflights jq before setup files use it for JSON mutation: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"cef0cb254a8224cb9943585d2196151f0fb75fba50070437cf528a9402433d89"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not redirect jq output directly to live setup config/settings files: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"124cbe766e39491eec7bd4b24e26ac0a485ee81a86acba9aa875cf08c0d3c510"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has no join(__dirname, ...) outside getPackageDir() in installer: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e5e8af086a9c5408807c55c7d9fc96ea1c8017f464929e9de953c9ad0c3d31d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: getHooksSettingsConfig() produces no absolute node paths (default config): 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c14403800fac6ee2f8a66621ad9f42b54170b26757dbde5510139d842d876f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: agents/*.md have no unguarded ~/.claude references: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"388fd5c105c85015d31878bfb6430a4db2c56af6b00cea2a692ec9f666e09a7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: docs/CLAUDE.md (the installed template) has no unguarded ~/.claude references: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"939392afb8e6532738062c79ce2a3185e01e8d4676cf409e667d17d3416c5373"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: all hook commands reference ${CLAUDE_PLUGIN_ROOT}: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d26b158eb1e82c090c118d96fcd92f461d3b202ba62a784b3504a9a3d6e522"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: source hook commands do not hardcode /bin/sh so native Windows can spawn them: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"19eaf7c2f88acb985f1ddbf9f6337b934d8df02e06e472665cae68e067ca3ad1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: source hook commands use direct node run.cjs without sh/find-node bootstraps: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"d43c2998b7d5a74a6a8f441e2fd227ea552289fd6f974241115bb0270d0e23ac"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: no hook command contains an absolute node binary path: 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":"src/__tests__/setup-contracts-regression.test.ts"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"41f9210f4b49eda290256491b8ab8afa286bf1568681a0232b4f8469488e95e4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should have no duplicate extension mappings across servers: 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":"src/__tests__/lsp-servers.test.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb74ae70f3f1db44a031b94f2f9a4c37f57deeadbf681668774b9fb5d956cbe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: triggers the dynamic import when OMC_OPENCLAW === \u00271\u0027: 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":"src/hooks/__tests__/bridge-openclaw.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a0ec76f69462e1c943420e75bcfe6a499eee7fd3fb72bbb6e0e70fb38b8756"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: passes context fields through to wakeOpenClaw: 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":"src/hooks/__tests__/bridge-openclaw.test.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4b6140fcf90bed2adabfea23062586ff7e026a5916df1e7b9bf3d25aabf39ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: no command contains an absolute path to a node binary: 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":"src/installer/__tests__/hook-command-portability.test.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a53d5cc67b2279196a5fced7d4567afdfef7f2ffa8ff73d272dbd5e7fe44fda"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: no command contains a hardcoded home directory path: 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":"src/installer/__tests__/hook-command-portability.test.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aafccaa65edab465c56500f2e63fafad78dec33fb275ed5fd72e76430ccc4d9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has no duplicate tool 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":"src/mcp/__tests__/standalone-listtools.test.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"978f1507c410441c8d9183f9fd9a3a1e989e4a82856e42e7cc03d5c6664bc192"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: uses default interval of 3000ms when no opts provided: 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":"src/team/__tests__/worker-commit-cadence.test.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13638b8e971f1356de6327a269592721227fdbd0b0ec00c42a22f36f2975628"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: generated overlay rejects all disallowed control bytes (NUL, BEL, BS, etc.): 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":"src/team/__tests__/worker-bootstrap.test.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"10772af0c3342f4fbe02b9d12f55651233d2deac4abd61da06cf78da8aac95b0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows unset OMC_RUNTIME_V2 because runtime v2 is default-on: 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":"src/team/__tests__/merge-orchestrator.test.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f28aff3aead779106021519f358cd676a08e8175aa6bd26871bd4b2c6793f2d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: no-op for nonexistent team: 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":"src/team/__tests__/heartbeat.test.ts"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7b134b8b98ae03c2bf2471033509cff1489ddb8c99b19d9cd245dc5ffb2662f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does nothing if log does not exist: 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":"src/team/__tests__/audit-log.test.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9a694b4df43fafa62331118885df7a8a22142fda03d6e41f452702de2d5b305"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps every scenario decidable: expected actions or human questions, never silence: 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":"tests/harbor-scenarios.test.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"97d91d24d3a1813f080b33cd99caa0ea2aee0d6b267ba4a8b25a1b4c9595ca6b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: constrains states and forbidden actions to the declared vocabulary: 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":"tests/harbor-scenarios.test.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7164976b5219cbca59bbb7b9183cf5faf7c80c7477d8b3d13eadbb15b07e884"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: requires evidence-carrying sheets: every human question names its ship and decision: 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":"tests/harbor-scenarios.test.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"20e6643c3bfcd3b475f99d092cb027c524c2a0bb61e95c9504ceec39dcfe1a87"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps all Team state examples session-scoped: 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":"tests/lint/team-resume-contract.test.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6726f05b7c7556c51356d1f5b0bd910dffd36b6282905415e0a075b9db2b080"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/runtime-v2.ts: src/team/runtime-v2.ts changed 37 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 238 in runtime-v2.executeRecoverDeadWorkerV2Owner at line 2584. 36 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/runtime-v2.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":"src/team/runtime-v2.ts"},"region":{"startLine":2584}}}],"partialFingerprints":{"codehealthFindingId/v1":"9762551f430d0417363b55a0eafac353fc2618f7e2a36903232bba77496bc6b6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/pre-tool-use.mjs: templates/hooks/pre-tool-use.mjs changed 65 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in pre-tool-use.consumeWrapper at line 959. 64 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/pre-tool-use.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":"templates/hooks/pre-tool-use.mjs"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c75799bd68adc5973b150e611a85f74dba30fff63dd150300d74390f985d59e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/scaling.ts: src/team/scaling.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 230 in scaling.scaleUpOwned at line 277. 13 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/scaling.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":"src/team/scaling.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c520be4238c3c4f08ff059d64ad00a69118b5eb1fb99ad56392ef07c57b11b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/run.cjs: scripts/run.cjs changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in run.createProtocolSink at line 410. 32 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/run.cjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/run.cjs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7c2e5d13b92fc5e69287f94986fa40f881f427ebc6bf69f851d44de3a9d4c0d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/worker-launch-ack.ts: src/team/worker-launch-ack.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 213 in worker-launch-ack.runWorkerLaunchBootstrap at line 1964. 10 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/worker-launch-ack.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":"src/team/worker-launch-ack.ts"},"region":{"startLine":1964}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca071e8ec1d46b4f78c217ada382acbbc4664dd0183d1cc6c7a7bdb62cf2a15"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/lookout/command-parser.ts: src/features/lookout/command-parser.ts changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 81 in command-parser.findExecutableIndex at line 186. 26 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/lookout/command-parser.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":"src/features/lookout/command-parser.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df3aafbe9bcff65313ec25c8eee8e99984a2c48f3d606f7b85d31b8afb5d64b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/verify-epic-3698-closure.mjs: scripts/verify-epic-3698-closure.mjs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 92 in verify-epic-3698-closure.verifyLiveGitHubEvidence at line 352. 21 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/verify-epic-3698-closure.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-epic-3698-closure.mjs"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb4df96126ab59925030bc6c99b472540646b9e3855cba0156e086a5baeca67"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/session-start.mjs: scripts/session-start.mjs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 106 in session-start.main at line 1040. 16 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/session-start.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/session-start.mjs"},"region":{"startLine":1040}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee29add966dd8e377e2791e0ab5529d64268bb9c65fae1d900eb8fa1d673364d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/persistent-mode/index.ts: src/hooks/persistent-mode/index.ts changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 77 in index.checkRalphLoop at line 1144. 20 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/persistent-mode/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":"src/hooks/persistent-mode/index.ts"},"region":{"startLine":1144}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff0d9ba07cfaf9b497633c1aabfd023fb49f3403be3814d16a8d4bde01e06ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/tmux-session.ts: src/team/tmux-session.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 131 in tmux-session.createTeamSession at line 1898. 14 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/tmux-session.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":"src/team/tmux-session.ts"},"region":{"startLine":1898}}}],"partialFingerprints":{"codehealthFindingId/v1":"97d3a6a47610bdf9310e8071ad724159347811656f0bb6feb9be2a1a959f7785"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/persistent-mode.mjs: scripts/persistent-mode.mjs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 163 in persistent-mode.main at line 1113. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/persistent-mode.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b44bf8a1c009fa614121830ec663f9b4b3c20c7f5e28c92ce84425d49181879"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/lookout/index.ts: src/features/lookout/index.ts changed 50 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in index.scanLookout at line 541. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/lookout/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":"src/features/lookout/index.ts"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"3deb24022a6a0465045bbb6b30022a3b12027074fda08ab4d80bd9435c4457fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/pre-tool-enforcer.mjs: scripts/pre-tool-enforcer.mjs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 91 in pre-tool-enforcer.main at line 1666. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/pre-tool-enforcer.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/pre-tool-enforcer.mjs"},"region":{"startLine":1666}}}],"partialFingerprints":{"codehealthFindingId/v1":"48cfcbf2b60b1a0259604ce80d05fe7291683117d2948411691f17bb2fa8b0d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/api-interop.ts: src/team/api-interop.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 255 in api-interop.executeTeamApiOperation at line 659. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/api-interop.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":"src/team/api-interop.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"f63c8664385e04adb8f88264370fbbfd85ad5699a6840af7012a580ce133dc94"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/lib/worktree-paths.ts: src/lib/worktree-paths.ts changed 42 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in worktree-paths.getProjectIdentifier at line 1151. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/lib/worktree-paths.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":"src/lib/worktree-paths.ts"},"region":{"startLine":1151}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c5361f2a312cb267d4db1c6d8ae95349484a35b27d74a67506a269c4542cd6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/installer/index.ts: src/installer/index.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 97 in index.install at line 2443. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/installer/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":"src/installer/index.ts"},"region":{"startLine":2443}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d866df3719ee4656605742fa233943bb3cd238a2228866c7ce1e4f0555c875c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/lib/mode-state-io.ts: src/lib/mode-state-io.ts changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in mode-state-io.recoverDeadEmergencyStateFile at line 1344. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/lib/mode-state-io.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":"src/lib/mode-state-io.ts"},"region":{"startLine":1344}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa60bb811b38ffa575c5df8297db37820e1a6e1bef528f82c787debf9683ca41"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/pre-compact/restore.ts: src/hooks/pre-compact/restore.ts changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in restore.readBoundedFile at line 264. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/pre-compact/restore.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":"src/hooks/pre-compact/restore.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe09a549c7fcc1c3997d06d4c8b6af9ee009f8d8368c7e8902059be15993a3b3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/persistent-mode.mjs: templates/hooks/persistent-mode.mjs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 139 in persistent-mode.main at line 909. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/persistent-mode.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":"templates/hooks/persistent-mode.mjs"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a50f71154f5b8702288842bb4e35405adcaa41f9eb90e81548d188bbe9842f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/bridge.ts: src/hooks/bridge.ts changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 66 in bridge.processPreToolUse at line 2356. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/bridge.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":"src/hooks/bridge.ts"},"region":{"startLine":2356}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f218f42a0ca1b0863e69e1c1538aaa4cc01af2e4825b27938e3bd6201e7a639"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/keyword-detector.mjs: scripts/keyword-detector.mjs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in keyword-detector.main at line 1654. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/keyword-detector.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/keyword-detector.mjs"},"region":{"startLine":1654}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc2d041449624199367094e048e11e75214186634f739b120195de0295edd82a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/precompact-restore.mjs: scripts/lib/precompact-restore.mjs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in precompact-restore.readBoundedFile 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/precompact-restore.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/precompact-restore.mjs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"64160d0d3ebefd9ee71da66c1a86ea2faae1414831d21ac95dc2266e12250d09"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/lib/precompact-restore.mjs: templates/hooks/lib/precompact-restore.mjs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in precompact-restore.readBoundedFile 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/lib/precompact-restore.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":"templates/hooks/lib/precompact-restore.mjs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac60fb41db036ead7ad9a7df82f98872473edfe75e92b9064554a12ace87971"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/keyword-detector.mjs: templates/hooks/keyword-detector.mjs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in keyword-detector.main at line 1497. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/keyword-detector.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":"templates/hooks/keyword-detector.mjs"},"region":{"startLine":1497}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d1663652bf2402134c84ca13d43cc5b983ec806c376541251f79fdbed2f092"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/persistent-mode.cjs: scripts/persistent-mode.cjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 114 in persistent-mode.main at line 903. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/persistent-mode.cjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.cjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a425eb86fadb9b1e4433d0fab1d93e93e1da7d17d120b967b53ec5172a12b01"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/session-start.mjs: templates/hooks/session-start.mjs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in session-start.main at line 589. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/session-start.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":"templates/hooks/session-start.mjs"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"13de43b2e6d64c7113cbaa0941f59d77e4f423749a74c2492a640c117d906383"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/tools/state-tools.ts: src/tools/state-tools.ts changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in state-tools.redactAutopilotPublicState at line 976. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/tools/state-tools.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":"src/tools/state-tools.ts"},"region":{"startLine":976}}}],"partialFingerprints":{"codehealthFindingId/v1":"3392ebc1ca9686bf7ace7001937ff3a0d1c2f37cc622847e079030c82d1a7bb3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/monitor.ts: src/team/monitor.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 57 in monitor.isTeamConfig at line 241. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/monitor.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":"src/team/monitor.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"59601838223478c7ad2812978d117c0a780f3b42313abb3fb7a9648ecf5f63e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/runtime.ts: src/team/runtime.ts changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in runtime.resumeTeam at line 251. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/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":"src/team/runtime.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"228ed2e6aaf050377154346835ec9b165be24abaec800b200987850e8bd6b73d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/graph/runtime/runner.ts: src/graph/runtime/runner.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in runner.runGraph at line 528. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/runner.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":"src/graph/runtime/runner.ts"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"aebeadd0e652950a518031d2f1c1d39f19d83a82852ee15411c7b2f129ea3fee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/team-ops.ts: src/team/team-ops.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in team-ops.isTeamTask at line 270. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/team-ops.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":"src/team/team-ops.ts"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fe52ceddf59c2a37b0150bdffd5eba624755d2928e12ba8de39d51d83f7c8e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hud/usage-api.ts: src/hud/usage-api.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in usage-api.parseUsageResponse at line 1402. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hud/usage-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":"src/hud/usage-api.ts"},"region":{"startLine":1402}}}],"partialFingerprints":{"codehealthFindingId/v1":"a98132cb7630375ef833bbb6bf63a1e31e5537ef0c66cba7ef5739e6ec9c5065"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/post-tool-verifier.mjs: scripts/post-tool-verifier.mjs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in post-tool-verifier.generateMessage at line 924. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/post-tool-verifier.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-verifier.mjs"},"region":{"startLine":924}}}],"partialFingerprints":{"codehealthFindingId/v1":"90a044c9f7d45b3c1819d590fea0e51719a232faf895585189a0ac859e409771"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/generate-inventory-graph.mjs: scripts/generate-inventory-graph.mjs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in generate-inventory-graph.generateInventoryGraph 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/generate-inventory-graph.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/generate-inventory-graph.mjs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"13cb6c84885d7041d8dcf0f49ec77d9118b6e8ee0da465ed7e6e893d6ae97a99"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/runtime-cli.ts: src/team/runtime-cli.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 79 in runtime-cli.runPersistentRecoveryOwnerLoop at line 477. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/runtime-cli.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":"src/team/runtime-cli.ts"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1a44f6fb7e5d6f98a201c20dd3a621ed8b5f2aaf374a371b3f69a94de9dde72"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/ralph/prd.ts: src/hooks/ralph/prd.ts changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in prd.consumeStoryArchitectApproval at line 632. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/ralph/prd.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":"src/hooks/ralph/prd.ts"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"a38d0817f857a31400ffb637ca45e6a9117d55996bc2565af24f5efb5ecc147c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/mode-registry/index.ts: src/hooks/mode-registry/index.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in index.clearModeState at line 459. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/mode-registry/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":"src/hooks/mode-registry/index.ts"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa78acef2ba842e1fd8fbc48153b3d1ad8b42ddf25685fc2fd61b7b341136e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/session-end/index.ts: src/hooks/session-end/index.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in index.cleanupTransientState at line 277. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/session-end/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":"src/hooks/session-end/index.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"90a48dc2653a11f3dca3a5f5605e9118fc7f0112240ce6bd0d3122480b04cc90"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hud/index.ts: src/hud/index.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 65 in index.mainImpl 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hud/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":"src/hud/index.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"c154c5c7ab7e22134e9c35e86c7475838419216634ad434ae405afe0cd56f570"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/auto-slash-command/live-data.ts: src/hooks/auto-slash-command/live-data.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in live-data.parseCommandInvocation 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/auto-slash-command/live-data.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":"src/hooks/auto-slash-command/live-data.ts"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a73469ad590d7ee401e71ee148940da4076833e124bd64cf667eaf43848aafb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/model-contract.ts: src/team/model-contract.ts changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in model-contract.validateWorkerLaunchDescriptor at line 416. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/model-contract.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":"src/team/model-contract.ts"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0cc2e97c788f4d40904e0e2b6c6b204923dfc6182f9f6fd71ee3d47918a1ec2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/state-lock.mjs: scripts/lib/state-lock.mjs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 48 in state-lock.acquireStateFileLockSync at line 374. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/state-lock.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/state-lock.mjs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1a0a72c718db1c723cc00e4e3e267f38625d7574d366e109a43e013ef35d49"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/config/loader.ts: src/config/loader.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in loader.loadEnvConfig at line 284. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/config/loader.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":"src/config/loader.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc16168071ef3ff0e4f356240c208d5f5e8f41ac137fdef6eece256067eb49e1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/worker-activation-gate.ts: src/team/worker-activation-gate.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 72 in worker-activation-gate.runWorkerActivationGate 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/worker-activation-gate.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":"src/team/worker-activation-gate.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec52b967bafeec5e59a7f06230e4f101d3ffb1e06b132e3c57da92973a37f16"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/cli-worker-contract.ts: src/team/cli-worker-contract.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in cli-worker-contract.parseCliWorkerVerdict at line 141. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/cli-worker-contract.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":"src/team/cli-worker-contract.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"3de4b1e4f3901f057729348954b1acc3b861fcd2836e1539223de97fc790ea0d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/utils/frontmatter.ts: src/utils/frontmatter.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in frontmatter.parseFrontmatter 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/utils/frontmatter.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":"src/utils/frontmatter.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"140e14726eb6bfff3ec0879f19703957dbcc6e97f883bbc47ee12017a27de171"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/subagent-tracker/session-replay.ts: src/hooks/subagent-tracker/session-replay.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in session-replay.getReplaySummary at line 368. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/subagent-tracker/session-replay.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":"src/hooks/subagent-tracker/session-replay.ts"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"93015276d93516a130555cf88a48a3fae43efaba9279beb78194486d9e0d1438"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/lib/atomic-write.ts: src/lib/atomic-write.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in atomic-write.atomicWriteBatchSync at line 458. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/lib/atomic-write.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":"src/lib/atomic-write.ts"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49cb2315e57d425e4a85c6949df89cdd51449bfe8b05c702e97a914f807b599"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/atomic-write.mjs: scripts/lib/atomic-write.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in atomic-write.recoverDeadEmergencyStateFile at line 312. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/atomic-write.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/atomic-write.mjs"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"608650c3be6869ddae4e5049fc0009cd475b8132fe9523206bb69331ee17eb02"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/lib/atomic-write.mjs: templates/hooks/lib/atomic-write.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in atomic-write.recoverDeadEmergencyStateFile 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/lib/atomic-write.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":"templates/hooks/lib/atomic-write.mjs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd1a157a8cd18412c079c7f3cd1cfd7adccff184ea7992321124a89b014014c1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/release-boundary.mjs: scripts/release-boundary.mjs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in release-boundary.assertSlsaProvenance at line 884. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/release-boundary.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/release-boundary.mjs"},"region":{"startLine":884}}}],"partialFingerprints":{"codehealthFindingId/v1":"239cd121b48916aa354fb1e049512a6aa65384042037c9972d50b48aa417a5c6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/collect-epic-3698-ci-evidence.mjs: scripts/collect-epic-3698-ci-evidence.mjs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in collect-epic-3698-ci-evidence.collectDirectIssue at line 126. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/collect-epic-3698-ci-evidence.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/collect-epic-3698-ci-evidence.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"646afbfa5a4b68883088b48ac3a799b78f96269e82b01590c12f96e2cbb98163"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/graph/runtime/safe-fs.ts: src/graph/runtime/safe-fs.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in safe-fs.assertSafeContainedFileName 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/safe-fs.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":"src/graph/runtime/safe-fs.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8e1706fc15d35317fdcecf2d9a990793f59cdca35156a215a5e1cd51d35375"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/keyword-detector/index.ts: src/hooks/keyword-detector/index.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in index.isInformationalKeywordContext at line 622. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/keyword-detector/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":"src/hooks/keyword-detector/index.ts"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"256987b4388f8dcce90001e1c8f676b7f4f8d61b238197b723e70cb7b57f4b98"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/state/tasks.ts: src/team/state/tasks.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in tasks.transitionTaskStatus at line 287. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/state/tasks.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":"src/team/state/tasks.ts"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f6013d409723b5cc467c0297d2e2ec45d48d81f1e9472e26a0c26dd7d6430e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/lookout/test-artifact-parser.ts: src/features/lookout/test-artifact-parser.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in test-artifact-parser.collectGitRmTestArtifacts 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/lookout/test-artifact-parser.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":"src/features/lookout/test-artifact-parser.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"50864afc2f5cd548d873afcafeaaa731f2d2496c624f61f2d350fde23612f8c6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/merge-orchestrator.ts: src/team/merge-orchestrator.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 71 in merge-orchestrator.startMergeOrchestrator 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/merge-orchestrator.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":"src/team/merge-orchestrator.ts"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1834dd64e53efc7677826a8d11e2df8080519ce51e232f10826e702759c8f0d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/verify-generated-artifact-authorization.mjs: scripts/verify-generated-artifact-authorization.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in verify-generated-artifact-authorization.authorizeGeneratedArtifactPullRequest at line 460. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/verify-generated-artifact-authorization.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-generated-artifact-authorization.mjs"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef9c58b021d22727cf44dae30acb7e131ba0a780e48194616fb58159031dc9e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hud/transcript.ts: src/hud/transcript.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in transcript.processEntry 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hud/transcript.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":"src/hud/transcript.ts"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"651c1637ed83eb7335d2038b18c817687ea8ff2d8cd557158d8bafc822f814ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/installer/claude-md-transaction.ts: src/installer/claude-md-transaction.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in claude-md-transaction.executeClaudeMdTransaction 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/installer/claude-md-transaction.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":"src/installer/claude-md-transaction.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"0046a9275f5250ee657fbf044c37d1a5fba0165c613de58c2673b503c07a8500"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/types.ts: src/team/types.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in types.isValidTmuxServerIdentity 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/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":"src/team/types.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a4e463edd455405e40ff2067a12cd75bd48857742f222a31bc6d76a5e81bd3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/workflow-drift-guard.mjs: scripts/workflow-drift-guard.mjs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 67 in workflow-drift-guard.maskDecisionNoise at line 210. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/workflow-drift-guard.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow-drift-guard.mjs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"f743a56ee0e03cdc0a9fff15c021345095c439b385a2da51912afd8f310bc882"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/workflow-drift-guard.mjs: templates/hooks/workflow-drift-guard.mjs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 67 in workflow-drift-guard.maskDecisionNoise at line 210. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/workflow-drift-guard.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":"templates/hooks/workflow-drift-guard.mjs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a7d42f15fc28ac03b824862c3dbf242ffe12bf112f883d934e381c1f703afa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/graph/runtime/store.ts: src/graph/runtime/store.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in store.parseStoredEnvelope at line 43. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/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":"src/graph/runtime/store.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ef1f8a2979c3d131081185ccabbd6a97d773df20fef23d79bca355ca439605"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/graph/runtime/fence.ts: src/graph/runtime/fence.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in FileOwnershipFence.acquireAt at line 157. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/fence.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":"src/graph/runtime/fence.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"0754efbfef5c8f8a2f2e4690d1b6359a35fcf47ea9ac52c9a70d8032e9892bd7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/subagent-tracker/index.ts: src/hooks/subagent-tracker/index.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in index.processSubagentStop at line 821. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/subagent-tracker/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":"src/hooks/subagent-tracker/index.ts"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"d474d5be532a10b955f379bdaf5f695106457a2401cf35c5c51c6a1de2a1c53f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/cli/commands/doctor-conflicts.ts: src/cli/commands/doctor-conflicts.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in doctor-conflicts.formatReport at line 704. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/cli/commands/doctor-conflicts.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":"src/cli/commands/doctor-conflicts.ts"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"225dcaaa9e5e2df7b4367e3ec1a492f9d2f092fc5c20798de8ae52706d7096e5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/cli/launch.ts: src/cli/launch.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in launch.refreshRuntimeClaudeJson at line 347. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/cli/launch.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":"src/cli/launch.ts"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ee710aab6b4165c31d5b35e3b1922e1bc4be105d3761f673878d69bbb61c1e9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/graph/runtime/journal.ts: src/graph/runtime/journal.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in journal.envelopeError 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/journal.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":"src/graph/runtime/journal.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a75ef9c3a5f4a4f08967da23f5924016dbcae1a9570e851145d01c214c6a05"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/utils/paths.ts: src/utils/paths.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in paths.purgeStalePluginCacheVersions at line 495. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/utils/paths.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":"src/utils/paths.ts"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"25c790d19025c623c50b29de9f027e7870d176a29361f14a1d680baa29b61d20"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/tools/lsp/client.ts: src/tools/lsp/client.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in LspClient.connect at line 209. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/tools/lsp/client.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":"src/tools/lsp/client.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0adc218a492d7d3fef767e7d8fd3267fdcaa9bff0e496d0ace7a0b69c8623b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/session-end/worker.ts: src/hooks/session-end/worker.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in worker.processSessionEndWorker 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/session-end/worker.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":"src/hooks/session-end/worker.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"418cc91a87e7877b475ed27e6788fc016a59eca6daf0b9eed0b0097c488f16c7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/cli/team.ts: src/cli/team.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in team.executeTeamApiOperation at line 1038. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/cli/team.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":"src/cli/team.ts"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6019e8c697439f1053bd5861af032f148ec23fad1a07b52f70e62ece5dc423e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/session-history-search/index.ts: src/features/session-history-search/index.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in index.collectMatchesFromFile at line 479. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/session-history-search/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":"src/features/session-history-search/index.ts"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"abbde13916f58d3d11ad5f9d15c4e53f9bdd95552439734f694667f318ace1fc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/pre-compact/index.ts: src/hooks/pre-compact/index.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in index.formatCompactSummary at line 413. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/pre-compact/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":"src/hooks/pre-compact/index.ts"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc5751484c81d8b25832c4ec989913fd31b89489a3ad0bc6c5e837ab0b118b4e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/delegation-enforcer.ts: src/features/delegation-enforcer.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in delegation-enforcer.enforceModel 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/delegation-enforcer.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":"src/features/delegation-enforcer.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a853af8e51fefd11158b8689de4055d16b381ba1c0119bac943e304c1f2d39"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/notifications/reply-listener.ts: src/notifications/reply-listener.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in reply-listener.pollLoop at line 937. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/notifications/reply-listener.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":"src/notifications/reply-listener.ts"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"260ac3356f1f3ff833a6e41ee696c5d1887bef4494743747175fa76d91819438"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/skill-state/index.ts: src/hooks/skill-state/index.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in index.writeSkillActiveStateCopies 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/skill-state/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":"src/hooks/skill-state/index.ts"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac44839d2f2c25bdb9cf5826e966697bb56d9ab981deef255cb9b446ebd413ad"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/runtime-owner-client.ts: src/team/runtime-owner-client.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 44 in runtime-owner-client.bootstrapPersistentOwner at line 493. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/runtime-owner-client.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":"src/team/runtime-owner-client.ts"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f730dc0521d3d23cefb29333a41b7c6f2deb995c35aafd55625e4ff71f0c18"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/lib/cache-occupancy.mjs: templates/hooks/lib/cache-occupancy.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in cache-occupancy.readOccupiedPluginRoots 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/lib/cache-occupancy.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":"templates/hooks/lib/cache-occupancy.mjs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"638f066fd8c6a884a616beefe7778511f2ef2b96835f3ab7f71438533bbd22bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/utils/cache-occupancy.ts: src/utils/cache-occupancy.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in cache-occupancy.readOccupiedPluginRoots at line 135. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/utils/cache-occupancy.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":"src/utils/cache-occupancy.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f8b8ff5c89c620f36cdeada0fc0653c627ed7c36cccb526cec274cf6a1e04f4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/cache-occupancy.mjs: scripts/lib/cache-occupancy.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in cache-occupancy.readOccupiedPluginRoots 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/cache-occupancy.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/cache-occupancy.mjs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd0bc4b8163d4ed8bb0c08def7ca213239340497376543ffc01734191fc4ccc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/auto-slash-command/executor.ts: src/hooks/auto-slash-command/executor.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in executor.formatCommandTemplate 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/auto-slash-command/executor.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":"src/hooks/auto-slash-command/executor.ts"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"015815c68dec83ed00e326edf9ad9f1880f5ecc11e15dcf06c002f68585b98f0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/autopilot/cancel.ts: src/hooks/autopilot/cancel.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in cancel.cancelAutopilot 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/autopilot/cancel.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":"src/hooks/autopilot/cancel.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdbf4fcf5fa9175570e966fad55d7fdbf8fbb344e317ec50f165fc83a286a11c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/lookout/substitution-parser.ts: src/features/lookout/substitution-parser.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in substitution-parser.findSubstitutionEnd 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/lookout/substitution-parser.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":"src/features/lookout/substitution-parser.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"43b6e329e9c1146d28ca0d073f2f0bc631960d95bf1d1781e0b71d7f0194deaa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/precompact-publisher.mjs: scripts/lib/precompact-publisher.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in precompact-publisher.checkpointMatches 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/precompact-publisher.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/precompact-publisher.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5eb61512ed0fd06870e37e69209eaf5eac2a2bf1dda0acecbdca78bcd59e96"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: templates/hooks/lib/precompact-publisher.mjs: templates/hooks/lib/precompact-publisher.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in precompact-publisher.checkpointMatches 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/lib/precompact-publisher.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":"templates/hooks/lib/precompact-publisher.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f23d4badff2544adac481eeafa1666d03e4887c7a40068b9597fd7ed4d803f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/team-dispatch-hook.ts: src/hooks/team-dispatch-hook.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in team-dispatch-hook.defaultInjector at line 374. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/team-dispatch-hook.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":"src/hooks/team-dispatch-hook.ts"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b0c4ff4b24c9df19564d9530ba1d4297af020ff01c1d6613f08a4f098b042ff"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/session-end/action-runner.ts: src/hooks/session-end/action-runner.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in action-runner.runSessionEndAction 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/session-end/action-runner.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":"src/hooks/session-end/action-runner.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"efb5a589e6c6e74b509be32f2f375560fb3919d1e8e3ddefc3eaed08b70893a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/ralph/stale-prd.ts: src/hooks/ralph/stale-prd.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in stale-prd.reconcileStalePrd at line 511. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/ralph/stale-prd.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":"src/hooks/ralph/stale-prd.ts"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a5ba39d2c364c5b3abd2e9e1019cad36916717beace61ecfdfdf27a561a212e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/tools/trace-tools.ts: src/tools/trace-tools.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in trace-tools.formatTimelineEvent 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/tools/trace-tools.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":"src/tools/trace-tools.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"350e0c3739ed3e37986424054d40fb53414d5a066938bfa4b933ae418a9762c4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/process-utils.ts: src/platform/process-utils.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in process-utils.dmtfCreationDateToTicks 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/platform/process-utils.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":"src/platform/process-utils.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8de79b7d27da1d615a862cd76b7925b92cb85dfd86c19bb946872b0228f163"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/project-memory/detector.ts: src/hooks/project-memory/detector.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in detector.detectBuildInfo at line 134. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/project-memory/detector.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":"src/hooks/project-memory/detector.ts"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1aea0a83443ad6227d4026fef195da011d886692fcd8d062b320e2e43707dbe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/session-end/cleanup-manifest.ts: src/hooks/session-end/cleanup-manifest.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in cleanup-manifest.reapStaleSessionEndOwner at line 267. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/session-end/cleanup-manifest.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":"src/hooks/session-end/cleanup-manifest.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"706c9bb47e54152f5325274bee5f6b72e4bef6f8c223c55a2520b11cf873a716"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/recovery-request-store.ts: src/team/recovery-request-store.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in recovery-request-store.readRecoveryRequestReservation at line 237. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/recovery-request-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":"src/team/recovery-request-store.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"02037fd1a679b2e429996e42070fb078741097263be7a3ac1ff7fbe6a57583e2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/release.ts: scripts/release.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in release.main at line 329. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/release.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":"scripts/release.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffcfe7701649e8beed96575e2915e0ca978609ce63e3ac25de7d533b89cd460f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/read-budget-preflight.mjs: scripts/lib/read-budget-preflight.mjs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in read-budget-preflight.evaluateReadBudget 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/read-budget-preflight.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/read-budget-preflight.mjs"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d8298e16cd58f4cdbcfb893f65a108cedcd8e1e9302b0185012654bf8fba876"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/team/team-owner-epoch.ts: src/team/team-owner-epoch.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in team-owner-epoch.probeProcessStartIdentityForPlatform 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/team-owner-epoch.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":"src/team/team-owner-epoch.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df5adb3578cac06a95c76d8f23a530ba8e53e23a3c567a7b9966fdc27ce2dd1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/lib/context-usage.mjs: scripts/lib/context-usage.mjs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in context-usage.resolveHudCacheContextPercent at line 102. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/context-usage.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/context-usage.mjs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb806e39b387194dbe7e1cb3355a752f9487f2d50f3c79098e8fb05090e384bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/features/auto-update.ts: src/features/auto-update.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in auto-update.reconcileUpdateRuntime at line 971. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/features/auto-update.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":"src/features/auto-update.ts"},"region":{"startLine":971}}}],"partialFingerprints":{"codehealthFindingId/v1":"3334f0203217c09616a861cd97f0e574a6fd92617a5f06aab253f1c675c1ef42"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/graph/runtime/executors/agent.ts: src/graph/runtime/executors/agent.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in AgentNodeExecutor.execute 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/executors/agent.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":"src/graph/runtime/executors/agent.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce97b7948cc1650bb30c59664b878421f7995388e632a2b7b8170b39d5e0ec5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/wiki/session-hooks.ts: src/hooks/wiki/session-hooks.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in session-hooks.feedProjectMemory at line 278. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/wiki/session-hooks.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":"src/hooks/wiki/session-hooks.ts"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b9f54dfc77fe67f3b65d8ac37edf563daca970050c782b8def1fbd7df42c8ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/project-memory-posttool.mjs: scripts/project-memory-posttool.mjs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in project-memory-posttool.main 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/project-memory-posttool.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/project-memory-posttool.mjs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"d287b9e1cce663b035c0c5bc836eec966b867587eed9b0ad3ec335af5dba9caf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/mcp/tool-registry.ts: src/mcp/tool-registry.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in tool-registry.zodTypeToJsonSchema 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/mcp/tool-registry.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":"src/mcp/tool-registry.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"df9024d5db9fb7f3f7fac94f99c39c64e2ae3f58d08b6dbed01a997db60a5526"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/autopilot/runtime-insight.ts: src/hooks/autopilot/runtime-insight.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in runtime-insight.collectRuntimeInsight 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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/autopilot/runtime-insight.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":"src/hooks/autopilot/runtime-insight.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"359175258a32b450a7ceea9afb740655c741e8a3c37f04d3978aea9950e3e610"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/hooks/session-end/callbacks.ts: src/hooks/session-end/callbacks.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in callbacks.runSessionEndDeferredAction at line 184. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/session-end/callbacks.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":"src/hooks/session-end/callbacks.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"79833eaf2139cf169dcf661982ade3efe9ee0332748c0898d9fb2fb86d826778"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hooks/ralph/loop.ts: src/hooks/ralph/loop.ts changed 10 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 8 (its worst body is loop.createRalphLoopHook at line 228), 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: OMC release-readiness repairs (dependency/credential/lock/lifecycle/security)\u201D; \u201Cfix(build): rebuild retirement closure on post-3830 base\u201D; \u201Cfix(workflows): remove linked ultrawork lifecycle\u201D; \u201Cfix(workflows): retire remaining runtime state surfaces\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/ralph/loop.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":"src/hooks/ralph/loop.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d06f5a2520876bccecfb00a88136f4438e643f3f1fe86b54740c93e52004f1"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: scripts/lib/state-root.cjs: scripts/lib/state-root.cjs changed 9 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 state-root.resolveOmcStateRoot at line 84), 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(hooks): force LC_ALL=C on inline state-root git spawns (#4033) (#4034)\u201D; \u201Cfix(state): restore fallback home isolation\u201D; \u201Cfix(state): close fallback resolver policy gaps\u201D; \u201Cfix(state): align fallback identity policy\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/state-root.cjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/state-root.cjs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"80179df3977741e920db069011a50170536f890bd74576f6624b3629cc17e44c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: scripts/lib/state-root.mjs: scripts/lib/state-root.mjs changed 9 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 state-root.resolveOmcStateRoot at line 92), 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(hooks): force LC_ALL=C on inline state-root git spawns (#4033) (#4034)\u201D; \u201Cfix(state): restore fallback home isolation\u201D; \u201Cfix(state): close fallback resolver policy gaps\u201D; \u201Cfix(state): align fallback identity policy\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/lib/state-root.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/state-root.mjs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0d675f3e4c8dbd7ec25089bc31e4fada6e321b7fa0f9dbeb754da2b77ad807"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: templates/hooks/lib/state-root.mjs: templates/hooks/lib/state-root.mjs changed 9 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 state-root.resolveOmcStateRoot at line 92), 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(hooks): force LC_ALL=C on inline state-root git spawns (#4033) (#4034)\u201D; \u201Cfix(state): restore fallback home isolation\u201D; \u201Cfix(state): close fallback resolver policy gaps\u201D; \u201Cfix(state): align fallback identity policy\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- templates/hooks/lib/state-root.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":"templates/hooks/lib/state-root.mjs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"a775dc6b075500f53c3afd7971c2dfa2a2ce58bce8504ce46b7716a952cea62b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/team/worker-bootstrap.ts: src/team/worker-bootstrap.ts changed 9 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 7 (its worst body is worker-bootstrap.agentTypeGuidance at line 125), 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(team): close cursor reviewer lifecycle gaps\u201D; \u201Cfix(team): consume live cursor reviewer verdicts\u201D; \u201Cfix(team): let cursor reviewers emit the verdict contract (#3880)\u201D; \u201Cfix(state): enforce canonical ownership boundaries\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/worker-bootstrap.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":"src/team/worker-bootstrap.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"379fd84eb113f061860bc7b6e401bd2ac114c9c03a5c54b4775617ae6f2a514c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/team/state-paths.ts: src/team/state-paths.ts changed 6 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 state-paths.canonicalStoragePath at line 58), 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(team): bind native team lifecycle to an immutable instance id (#4059)\u201D; \u201Cfix(state): close canonical ownership gaps\u201D; \u201Cfix(team): align task paths with canonical root\u201D; \u201Cfix(team): make worker startup acknowledgement durable (#3588)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/state-paths.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":"src/team/state-paths.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"af199a4f3c4aa5fa0c6714e029b246f93b2a1b756e4395fc4259755bb0833bd9"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hud/types.ts: src/hud/types.ts 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 6 (its worst body is types.sanitizeHudLabels at line 591), 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(hud): stop usage polls landing in the API\u0027s one-per-hour bucket\u201D; \u201Cfix(hud): expose agent kind and spawn ownership metadata (#3666)\u201D; \u201Cfix(hud): parse per-model weekly quotas from limits[] weekly_scoped entries (#3576) (#3577)\u201D; \u201Cfix(hud): show enterprise billing-period spend for non-USD currencies (#3367)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hud/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":"src/hud/types.ts"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"65577c6e7211e4714ab3e906641c4d74fcd50a979064310d01e6480acc923cc5"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hooks/autopilot/state.ts: src/hooks/autopilot/state.ts 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 10 (its worst body is state.readAutopilotState 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(workflows): remove linked ultrawork lifecycle\u201D; \u201Cfix(autopilot): remove retired QA transition wording\u201D; \u201Cfix(autopilot): remove retired execution transition\u201D; \u201Cfix(workflows): remove retired ultrawork lifecycle surfaces\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/autopilot/state.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":"src/hooks/autopilot/state.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f98fbadcb02e47a502e3f6f05e64f76d073ec3ada1a8dcbfcf76236d987c426"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hooks/ralph/verifier.ts: src/hooks/ralph/verifier.ts 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 verifier.getArchitectVerificationPrompt at line 276), 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(ralph): CAS legacy verification migration\u201D; \u201Cfix(ralph): conditionally compensate terminal cleanup\u201D; \u201Cfix(ralph): preserve live verification requests\u201D; \u201Cfix(ralph): bind approvals to criteria revisions\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/ralph/verifier.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":"src/hooks/ralph/verifier.ts"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8fe031b9703fe2208cb12801a9336629adaca2bff79a2a7d4b1a5c5ab6f631"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/graph/runtime/run-dir.ts: src/graph/runtime/run-dir.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 10 (its worst body is run-dir.resolveRunDirHandle at line 160), 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): use directory-relative filesystem operations on Darwin (#4011, rebased from #4013 without the CI workflow change) (#4021)\u201D; \u201Cfix(graph): support Darwin contained FD traversal\u201D; \u201Cfix(graph): close replay and root integrity gaps\u201D; \u201Cfix(graph): close release containment races\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/run-dir.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":"src/graph/runtime/run-dir.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"946287fcc2bbb70956130db2b44611959b8b8a3ac989b51ce21af02d889eb89b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/graph/runtime/executors/command.ts: src/graph/runtime/executors/command.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 11 (its worst body is CommandNodeExecutor.execute at line 196), 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: OMC release-readiness repairs (dependency/credential/lock/lifecycle/security)\u201D; \u201Cfix(graph): harden runtime authority and persistence\u201D; \u201Cfix(graph): satisfy windows-hide scanner contract via non-reserved helper name\u201D; \u201Cfix(graph): hide spawned command windows on Windows\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/graph/runtime/executors/command.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":"src/graph/runtime/executors/command.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"017a1adbe52e40cf1c166fec6dfb86f04d4f560e739b8ee35d3a92f8d3202034"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/cli/graph.ts: src/cli/graph.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 14 (its worst body is graph.graphCommand at line 227), 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(review): abort-aware gates, denied-only rollback, hardened reply/checkpoint paths\u201D; \u201Cfix(graph): close contained artifact security gaps\u201D; \u201Cfix(graph): harden runtime authority and persistence\u201D; \u201Cfix(graph): contain run directories against traversal and symlinks (P1-3)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/cli/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":"src/cli/graph.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"737087e3333a0aaf2f2360fd30a5f8674783e14e314b93983ae7dfe17a3f1b2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: scripts/plugin-setup.mjs: scripts/plugin-setup.mjs changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is plugin-setup.probeBetterSqliteBinding at line 155), 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: use ${CLAUDE_PLUGIN_ROOT} brace form in hook commands (Windows startup error) (#4042)\u201D; \u201Cfix(state): survive a missing better-sqlite3 native binding with an actionable diagnostic (#4016) (#4020)\u201D; \u201Cfix: remove false Ralph Ruby prerequisite and bad plan citation (#4000)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/plugin-setup.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/plugin-setup.mjs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"09abad1f89c78a1df581647a209c7358288565ea53ed43a1de661f8ad1d55411"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/cli/tmux-utils.ts: src/cli/tmux-utils.ts 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 tmux-utils.resolveTmuxBinaryPath at line 164), 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(launch): keep forwarded credentials off every launch command line (#4022)\u201D; \u201Cfix(launch): exec-replace the tmux pane so the agent binary is the pane process (#4005) (#4019)\u201D; \u201Cfix(windows): avoid Git console flashes in hooks and HUD (#3484)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/cli/tmux-utils.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":"src/cli/tmux-utils.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6ee4f7be8b77266384adb6b6126184a838a3af2d8e6f38a943792b78cae15f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hooks/todo-continuation/index.ts: src/hooks/todo-continuation/index.ts 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 12 (its worst body is index.isExplicitCancelCommand at line 325), 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(team): preserve resumed state and scope cancellation safely (#4015)\u201D; \u201Cfix(hooks): canonical session-state resolver \u002B Stop-hook identity tests (#3732 review)\u201D; \u201Cfix(hooks): resolve task-store identity and session-scoped tracking read (closes #3732)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/todo-continuation/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":"src/hooks/todo-continuation/index.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2e8499b5d69c20f7d1547166c8c7b7efc6b478ebcfe3c576c11090dfba75f5f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: scripts/session-end.mjs: scripts/session-end.mjs changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 3 (its worst body is session-end.runSessionEndHook at line 9), 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: OMC release-readiness repairs (dependency/credential/lock/lifecycle/security)\u201D; \u201Cfix(team): make worker startup acknowledgement durable (#3588)\u201D; \u201Cfix(hooks): make session end shutdown durable and bounded (#3478)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/session-end.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/session-end.mjs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"db4309bc70aa83a88f8a44819c9cf20844e8c59f6f6d906996b287372fc73530"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/index.ts: src/index.ts 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 12 (its worst body is index.createOmcSession at line 299), 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(lookout): publish API and bound SQL context\u201D; \u201Cfix(build): refresh final workflow retirement artifacts\u201D; \u201Cfix(team): recover confirmed-dead runtime-v2 workers (#3462)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/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":"src/index.ts"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"a381ce98948a61d6b77dc8d842326fbfbe5f32f997c1b3a2407e180b1e81e934"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/cli/lookout.ts: src/cli/lookout.ts 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 10 (its worst body is lookout.lookoutCommand at line 78), 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(lookout): harden wrappers and bound parsing\u201D; \u201Cfix(lookout): harden shell wrappers and evidence output\u201D; \u201Cfix(lookout): third review round \u2014 flag-layout variants, suite-type modifiers, usage-error exit code\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/cli/lookout.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":"src/cli/lookout.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e73b5264c8bbddb1b69010a396442783e13a7251681708b0f56d7bbefa49bcd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/tools/ast-tools.ts: src/tools/ast-tools.ts 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 11 (its worst body is ast-tools.getFilesForLanguage at line 208), 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: sync Git cache fix with final dev\u201D; \u201Cfix(ast-tools): surface unavailable languages (#3628)\u201D; \u201Cfix(worktree): anchor .omc state to superproject, not git submodule (#3350)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/tools/ast-tools.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":"src/tools/ast-tools.ts"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"d00e1303e51cf2cd2b06249d8d19aaad27c8000c80430f2decc94593bcb3acf4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hooks/omc-orchestrator/index.ts: src/hooks/omc-orchestrator/index.ts 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 12 (its worst body is index.isTempOrScratchpadPath at line 202), 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(release): close exact-head review blockers\u201D; \u201Cfix(hooks): eliminate delegation false positives (#3911)\u201D; \u201Cfix(windows): avoid Git console flashes in hooks and HUD (#3484)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hooks/omc-orchestrator/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":"src/hooks/omc-orchestrator/index.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7a5d1510ce4548c323538b2b92959f7c58e38f50a5b3117976132cb51e9f609"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/team/stage-router.ts: src/team/stage-router.ts 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 10 (its worst body is stage-router.resolveExternalModel at line 135), 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(team): normalize persisted model defaults\u201D; \u201Cfix(config): give cursor a default-model hook (#3880)\u201D; \u201Cfix(team): allow cursor workers on reviewer roles (#3880)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/team/stage-router.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":"src/team/stage-router.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"6711a37a30b1158e3d345a400050e317605a6a25365592dbd06001521a6f5d1d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/hud/stdin.ts: src/hud/stdin.ts 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 12 (its worst body is stdin.readMostRecentCache at line 148), 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(hud): preserve independent usage backoffs\u201D; \u201Cfix(hud): isolate usage throttling by client context\u201D; \u201Cfix(hud): parse per-model weekly quotas from limits[] weekly_scoped entries (#3576) (#3577)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/hud/stdin.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":"src/hud/stdin.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3a0e9ff4420afe9bef1c0bcec942e9bed81dc5b7862fb5ba3bff3ad035e4cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/tools/wiki-tools.ts: src/tools/wiki-tools.ts 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 2 (its worst body is wiki-tools.resolveWikiRoot 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(wiki): opaque WeakMap roots, fail-closed git probe (#3858)\u201D; \u201Cfix(wiki): sanitize caller-visible workingDirectory rejection paths (#3858)\u201D; \u201Cfix(wiki): reject foreign-repo workingDirectory visibly instead of silent trusted-root substitution (#3858)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- src/tools/wiki-tools.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":"src/tools/wiki-tools.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee32a606af15a1e66b9776b2a5dcea348aef3f3ec92c90e1afd204f4d69c72fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: scripts/code-simplifier.mjs: scripts/code-simplifier.mjs changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is code-simplifier.main at line 82), 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(windows): bound generic-hook runner timeout ownership and nested git (#3493) (#3496)\u201D; \u201Cfix(windows): avoid Git console flashes in hooks and HUD (#3484)\u201D; \u201Cfix: hide nested hook child processes on Windows (#3385)\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-06-24..2026-09-22, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-24 10:11:26 \u002B09:00\u0027 --until=\u00272026-09-22 10:11:26 \u002B09:00\u0027 --full-history --no-merges -- scripts/code-simplifier.mjs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/code-simplifier.mjs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cec642dbc35abf9a426e760ec72f7148b1d80c15b842a11a6bcd92f37bad829"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 99 significant file(s) lose their only recent owner: src/graph/scheduler.ts, templates/hooks/workflow-drift-guard.mjs, src/hooks/session-end/cleanup-manifest.ts, src/team/dispatch-queue.ts, src/graph/descriptor.ts, src/notifications/slack-socket.ts, src/workflow/alias-resolver.ts, src/interop/mcp-bridge.ts (\u002B91 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cda42f20de3fdbb389e84bb13e182431864a4fbdc66f45e024f3deb8e683982c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 3 significant file(s) lose their only recent owner: benchmarks/harsh-critic/run-benchmark.ts, benchmarks/harsh-critic/scoring/parser.ts, benchmarks/harsh-critic/scoring/scorer.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4b2b7736d6c825c4562e2aa9b4602f8065f6b5729b5744145bed7ca2b461d2e1"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 3 significant file(s) lose their only recent owner: src/graph/runtime/executors/command.ts, src/graph/runtime/approval.ts, src/hooks/learner/detection-hook.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"eb8ce86cf9dcdc08c6ff0900113999e0b944e0400ea3e459f8e012312f09e4d3"}},{"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 (109 single-owned of 494 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; 494 of the 656 production source files in this repository met that bar). They are anonymized user #4 (2 file(s)), anonymized user #5 (1 file(s)), anonymized user #6 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // Note: \u0022TODO\u0022 appears intentionally in \u0022Todo_Discipline\u0022, \u0022TodoWrite\u0022 tool, and \u0022TODO OBSESSION\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":"src/__tests__/installer.test.ts"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3252b3c7733b8270ad6c4db12e55ba773d906832c7885ac7f16eeec310a102d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // Check for standalone TODO that looks like a placeholder \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/__tests__/installer.test.ts"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b21921b4b0f4108f1578b03b057ec976af0933b68c5d3c38b8b9f65fe553c83"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // (e.g., \u0022TODO: implement this\u0022 but not \u0022TODO LIST\u0022 or \u0022TODO OBSESSION\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":"src/__tests__/installer.test.ts"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b2f717dcaba347b836f503f764054446474b8ce5f11161a12c0fded005f05d5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: integrate with actual todo tracking to dynamically determine incomplete tasks. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/continuation-enforcement.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"b895819c39a2d2b8c9b411936a751454194ea9ebc8e9253cb5ec883d26fa9c48"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // Todo Continuation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/index.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"c74bb1df69c4bbd50ae4e7ebcc04e2e0fd1f18e7e28d5b84c3cc8edfaeea9076"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO summary \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/pre-compact/index.ts"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"384886cfb84e3168df538fc5c2df0416adb4b79eb567ecf099846b34a8f06f53"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: _provider parameter reserved for future per-provider schema customization \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/mcp/job-management.ts"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee980c692cd15758f38f7ab545c4896c02145300b6dd5e63f9669e5cbff91c8"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The \u0027Purpose\u0027 section names CLAUDE.md as end-user orchestration and features, while REFERENCE.md is a developer API reference. The README does not state what the repository is for or its overall purpose. Add an overview paragraph stating what oh-my-claudecode is (orchestrating Claude Code agents via skill-based routing) so the root README can focus on installation/usage/contributing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/AGENTS.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d63d612215e8ddf8a5b4de5c8a931acda3ed20cbbd457f636e5e9ef62078a3"}},{"ruleId":"D20","level":"warning","message":{"text":"Decision is a thin one-line statement with no context (why replace heuristics with Jev) and no consequences/trade-offs: Add the problem being solved (heuristic judgment points are error-prone under load) and the trade-offs: dependency on an external API, runtime cost of running twins, and how opt-in is enforced"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/adr/03665-jev-degradation-contract.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69d60131fdda7c0357dddda6c7e2fb2e6878b499c007dc6a8c86cd7d52ea58f"}},{"ruleId":"D20","level":"warning","message":{"text":"Decision is real but consequences/trade-offs are unstated: why one-shot child-process over stdin JSON rather than in-process TS imports or a local daemon; what happens if the resolver ever blocks tool execution: Add a Consequences section covering the trade-off of gate-type calls costing 250ms versus fire-and-record, and note how the one-shot model avoids breaking the pre-build invariant"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/adr/03671-script-side-judgment-channel.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9106b0962e75b931130530237db523555869848cdeaefcbb8cc7adb568264f2"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 1 project(s) overshoot their size bounds, lowering Project Cohesion to 0.0/10. The most over is \u0060(repository root)\u0060 (463800 LoC, 2302 public types across 116 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":"18373b4f8905f49c2b4508f8a1bb2d0bcd1f7c85054ca181981933d0d4dc3ef8"},"properties":{"commitSha":"8324d5e62463b7721031d4056e488fc5649513ee"}},{"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":"8e40fe7c23512ac89d293c4d4eeacba0cc2df28d918c10a735203656f0cc6587"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a1f31e3fc38e806c632551480508ae27b2701acddad0a9d80c648ba1fc9463b3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"de24fb5b2f9808dee7349e0f8b4bf4e8fc0b77a05b8578184e5f23b813b48863"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c1bb7814097052b3b9e49cf20adb5ffa3c94da3abc00863955683dc4725b2e91"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4ffcc1b724469248fcd864b1901b4fb0cedf5b911fb5d6075b57cf61232c29e8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ae4b19a624088a80ae967fa19fc6e2d3b4d86bf95f6afb9918729adad8224e32"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56d9371fb2efaf7518ba7ca36b309fcf19a4dd77b8fedb20a641b6ff91c06d3c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"82a1893f62fe8dee3fcdaad2e3da3e94b86729172346ee8d336b86cb9d8780c6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8848ecb9b4899118cc8b8341841112d876be29e865cc3e14990aec7e928c6bbf"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6b562a86ba4fad32d6ccdcd6ca2d4c34c2236a59e5d8276adbfb83a1790cdee0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3ee1818d8255f485c4fe9f8eec7ec14865c030222317516add1ea3f2587ac448"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ab979ab2dc46515c14a5a4f004fc991e04e40404eedb88f91aeaa5242f0df4a2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc16fdf0e4ca3c006dcf9b77d9a081a8b34a38c11900be60f6df82ee11d0b584"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c8381cdd9539330ccdf5f2819fb2f0ec8e0d20d645b1467a3e5e48700a37b69b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c4014e7719155abad9ee780737c6a29d8c31bcf1e70b94286734d74edc799576"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b962eafd3faf0df14ab8267775f92fa432b2670c858a297fbb3786009e64bc8b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ba1bd8cd7cc00ffea37dae7b5e07643f624b23874e3cb0759fc3e4878f73406"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3f3eaefe0c3fa37c6ee51535bf6dc2e94e9e7b8f713ba85a7a9ffcc847ffc081"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1fe915542e9ef9e0e2030d13e5e967c9edc93ad44e0043112709e63c307bce8b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7e9323362030c11a89ee75d7211b2720333c55d8869ae68ed4aebea060c08384"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dd914b1882b8c8000feaa21186742b160c4a00c64ebe3e52b5e9ea10d71146d0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fbb3016e08588da0295feed2d3c1aabf07e14aa98db895f7d8608ac6dac5e7fc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3f4d42f8b2e513c47b0faf0f810f74803f1d18da6af70e547ee280b47ac1413c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ebac61d292e4757946ff83f15293e2fa751db1ae0044345ec1ca160a7804b230"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"17c766048720a8335fe9cee4b5c94d175d687786ce4fe5ac15a7d88cc7deda62"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2e8d4db4de3eb2579e68bf9c1a5bad4b5e1199284ea31c7802136457a878522c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"96f88121b035a898a6759141862415469563ae4858d3bd2449d90d5e5ba04a57"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"982bda03dbfddf0a1223f5c2dede152d885dcb951370bcaa9e9cc1e6403c50f4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"be671396a5bcd865c98de3ffc1b219556ea45951412fd9d2769cf7de494aec0e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b4db6b20db602559a73aa44a2472c419ed5b9f82fbf2e3f83790ce505c0d4cac"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8ec2b1ae2a955f13c9fb09620d426c771688fc4338b86f6ddd63604381e0f944"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0a30a9a0c643aa548b820904b6b573692d248deb934bbd0674036bca9ab5f920"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d044c57593cb7c2191cf1eeeaf8c538d710ed5419ee6dc139e4b60f3a0cde1f9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"31e15292ee7781495cff3025f3779e23aded0d07be93120b45c65e1d6518c389"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4fa3a3025b7a9052cbd7b0d8a17b7d24287898600c95850a4b97997b4072afa"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7adc332f2d68b4a8e35c8868ce3df7038dc1a68ece15e2a5c16dee165f7a002c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"957b150e90b8de065e3fab913d6db8aa84cc38085b4826b482eaabde0c4cf347"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"865c1256b0af6cac7fabd52ec1703a6840a81e82c2cc09619e5e78e47af02756"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ab8d83539c5ebe567cb6deae98d392d6617f9ea4001a34a9a21fb3f393c0be8f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f4cdd8581cc1cedd243709e4a741d2414c5cea9108d7501532e23195acd1df17"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"66409950d15ab2fc8bc01ef01258b9fc0faa7b8234dcd701e8fd96ee74653f16"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"62a94e73b243470c994d443d0f32cb49ab31a566414ae8c82ae7e2002f4b7e14"},"taxa":[{"id":"CWE-95","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bc3860abbcbcfe1328d994efa782ed399426dec5e121106bd6dce52dcdc79355"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b5894b3f45722c91bd67173acc784d2fb93f0b126a9cdd65c7cdc09dd04d464c"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"51697efad3241831aac3b5cee15ba3a94ebcab3ee16ae6792541e123dc717f79"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"59a5bdd64d48e207589b3f402939608570d2f13906aa526f183df92e0a960c82"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8e0fbb996fca1946d070f3cb3ce857cdde216408da3fbb80368bb05b2a989b9a"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"01c1a248ecff5cb0ed0ea7ed64ab1bc3ac091ebb75caa9e0622a9a8e22a26a74"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3a6cd84a82a3753e8f5b9a7ad79a0d6433000d9cabc3537167926f57b224ff39"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef37bbeebe45d4a2b11e126e70dcac14ca7bbc0b0e9bac8f3f89e5d1d33d648a"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7344f90f9b1227b49b76ed5b1de27951545bde78c840a1d35a426347c44475e2"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6d8a308b5575fd65f090a2242fe9af0163b1a0d07c49b5101cb4ad3bf8ce22c8"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f13108a23bb3ec99ec38c2d1e502f7fea69d15aaa86ee20e6b5708eca191ad5"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c4211c5ea0b5d9924d9471a3792d650d40c41f9a136c0517970974881ef8517b"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f9c6658b67ea40023c088fd068a56f2cd286d9f49153f360e8c217e1a71fcf86"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b8d9ce978491b4c347cb1a15c5df3197e57feab1ab22206c95966f5c3bd0a2d4"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e6790f47092b3d0481018c6e93a66886cb82ef8c327b22114f7747d22cd53881"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5f758672e9a1c78df5eef21ef985dc1cdb7872244891a9444ab0e09974b4437d"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"02f58b8c0da12e94d50a501b46ae518afe4769fc47b75d41e53495694773fed3"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"29e8eac0e32d4a1a59f854eb505ee2b6c654a2a653fb73b398888cdc8b195246"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e1f9abf15f0be5be1b9b7d0ba56a14ca65fba910a5abdc12a877b27d52ca6f65"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3e523fc40489e14e73c8fbbc3891c652b270a8f48fda53c306868e0743263587"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ab8febe964385d0f25075364b040879dfbbe8b5c32c795c50c6269e4ff73022c"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3472d915963dab2e00530e56b9a7e94c901ca530e05e73ef8c8cdf5511ea1cad"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"039b485792f3dad84ad985b6aae5b214d507f60f635976d7d5345c887f9182ed"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f25d3e670fc6a6d3b7a86f53186c7144050dc07e474c70e4f78485125a54e27d"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"99807106df46178210861b484400c1749895f39126b781a9021bc34cdbf61b1b"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ecb8587e9647b463b819d6736e9f17775b9e7cc8d228d74d15336a68d77636eb"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"30af6d6fda418a3a8c4c36963496f74d817a4c4b08d57d84d83107ad97dcef4f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"717c9512621efbffcfe47be4179bd8b39f0a986ca5e7891c44b501c2794fbc7f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"88d562b4112b50ce87ea8a6de50586143596063edf9fd51f7615739e5d27fe17"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"792e0597699a2990cf6c294ce700218efde733950e972810cf3c2e738bd327ad"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa640ea98bf2d7912b8a09ed0ec43d4cde0e7d015790c2a1ed203f291d61a19f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43954c29777925b8856a8b89e37162f64810b056ee582ccf4cf6819d10558dc4"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75bc628b4cf9f1f0af11b1bcccea3c8c650a12e53b98c37dfbcb063ce77d98fe"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"77ffbf09b37d3209dc5adb3ba25de39000030b86320e217760ca494348e80da6"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f3229dbf5d93397da4076ac76b7c2a826acd789d59c7bfa25298ea197c3d7e03"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8e28fa02c1850d4d749de225c9a1bb40ffa2466eb06db57ad1b66ad670b815ca"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f9c0c2fd752083038dd97acacb622da3edd32b8713a46f3cdb5197c9deaf60a4"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b1337c66c83dfa9ab4f711ea4d196572fb3b59456b3a58334445c67dd3368b84"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7837c00cb094ef0bdf115fe0f008797044e3465c81224c644da0bad6b2a79a86"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a8d458b4335a5a999791e563a2c1fe57322ba0d4dd435c59b1904d2a27584730"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bd29544c5cc9ffe5b6e1ad23161d284e51322d3a942eb53052032e31314d30ec"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9e245bec8ef03c928001aadfb19800a54d1e453db6635b1ca4926a90ffc56c62"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fa900777b54ee652c20e509c32caeab8e6142cf6a0d879226551663c004dd86a"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4986651ca541503ee1c484e655bb4874093faa1b144350ee0a393b4e21df360"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"97fc95c1bd7716c3a2fe5b510d3446bf2bbc6061d87799ef3c8c6fff4d535d0c"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5b26e47137dbee1887a7073d78557752efc709b0bf5f65afaa113d4a757c2284"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90365688c42c650875647dff315d2037dd6fad4d91bbefe18a485dda98f7bd2f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ae9df5afe86b0de4ad7bc1d46325718f74ca8600afe198c58a684d87161b2d0"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43f0d92ee2daf68c366ad90ae02ee0bb2d7f77bffaa84beabba3500eb9b0dea8"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"897f2ae051643ee67ea38878759bd263c053cc40057da70293d4c7608bcfd895"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3b6b92e511a86e3414b55a8044c616b0f66754b8ffee0b832015ee11832a1870"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1253605aecabe6cd221e41941323efcd964bcb9472c9d542862e3c7a26373123"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0a94a485904d9cf1756462304ec3c959ab69a5a38b7b24db8f67d9ed6611a517"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7a64473b067b85f2887617a240025bc1900a4f06546d1e62d2613624ed4a3c8f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"81b09b731f838858e0b6514289d2f57c753b1a09caf3a8b2928c2b38c72e94ac"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"96c76b41545984e9e125fd5fc82b50460a3db582c9f715a80c48a13e75395b9f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2b1adadf2da64de5b49e5b0e42601088b956a9e8ef2ba514de5001f6e82a8f15"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"db8fbc748ec326ca083527102e3b79e9fab860c3278ea99cc71fa53de9e48e57"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1e8b7db6fa1d4f2521efaf83b5ab0a80abc51471020a64ee522d24664b11c5da"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1af5fa83ef9e7ec00438febeef49a457ba1511e2b470488e1d4ed176def1049a"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d90f7ae2fcf6197cc8f5712c441c33e99a0b7ae016b22662e76c62055ee5279f"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f291dc1707b6aea907e0228646ae2e85c73793c9a47e8ff436aa520e49198271"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c610320a35ef513e14529f35c7509f8856ba609b01d4af8954a47e51a7829120"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8c31c848044b7c70465659ac16084b3ad59c3186d900e83bb9dc9b73b8516683"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"747bc89ae9d7ff7fed8406cf279aff2f6e807e3bd75336b221186ba5b14086bc"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2a106de688e26aa47c06b4978e68aa459dc04670ff59a8a1ade1676a47459259"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"29dba5e9666a3003c38e6abe39248d3a094496ea7f4435e982f2ae049b6e5ff2"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"07a91676fc55ca990bdbfb9a4eb5e3069a3460cc40c1c290a1a43d50241e7316"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"09f34deb2203b30dc4e87213db5f78f5be42d4f79ec5aa10840a39f74e6141b3"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"168edafe87c207070384912f50ac5c539709ea5f71c9262f766be7e10ef9dcc9"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4917b12d2c2fdd8a9b3167765874e2d353f44d5c27694c6a15a66794e7c65607"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"06f4c994c5a6e7efbba8a5cecfc4a52ae437ca3223e54f29117796085713a8c5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e7eeb831979ab47cc8e7b4e0790e929a5c14a59860f8868b7b6c3f31f0feb5f4"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"80077c3dd58060d7a4d205ea25d5874dbaf251b0ffb73bc24674e071d52f4769"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0a7af5c810dfd676b914edc7aeeaf98d5acf2450519f57b25ecd05add6d5894d"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f52029ed829a0172342d05a4aa22b2193c0a68d3bd276697f85e3e83e024bbad"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c389933fb00c14c32a6e0babbc9d20ff3bd9a4076640cf652244cf735b1704ac"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d51321a343a8a42cb12b4cd84ad6fc7b4433b0b0acf6e68329075db9379be4b7"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1788d22a599fc0ffee456b907511d98373776dc5b7e4a296024d62afe75b0329"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D32","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":"0d92fb7efc4371a14abd4e6188c36a4360ec3d59cab31eb79acb289f42d30049"}},{"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":"benchmark/analyze_failures.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ca2994a3076d4e68ef4ea583e766ee8384c7c5991c8e56eebf3eeb8893c8bb"}},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 6 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: benchmark/compare_results.py, benchmark/evaluate.py, src/tools/deepinit-manifest.ts, benchmarks/harsh-critic/scoring/reporter.ts, benchmarks/harsh-critic/scoring/types.ts, src/goal-workflows/claude-goal-snapshot.ts (7 orphaned of 494 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; 494 of the 656 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":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: delegation-categories \u2192 model-routing: \u0060CategoryConfig\u0060 (slice \u0027delegation-categories\u0027) depends on \u0060ComplexityTier\u0060 from slice \u0027model-routing\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/delegation-categories/types.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f15990ec3238a79a660848bba2da69f961492b831cdd5f31583b11ba2debd99"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: delegation-categories \u2192 model-routing: \u0060CategoryContext\u0060 (slice \u0027delegation-categories\u0027) depends on \u0060ComplexityTier\u0060 from slice \u0027model-routing\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/delegation-categories/types.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e81d4c0e371675ed6c7fb46d89beb575cf61a0e586a510628d370da3be5e8e"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 2/3 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060.\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add CodeQL\u0027s javascript-typescript pack, \u0060semgrep --config=p/typescript\u0060, or eslint-plugin-security as a CI step. What was searched, so you can tell an absence from a miss: the 63392 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":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, mkdirSync, writeFileSync \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":"benchmarks/harsh-critic/run-benchmark.ts"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"346ed76711e3c07235b4d3ea4c009347c339fa6170f7eec62b745ecb399f2ef7"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, execSync, readFileSync \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":"benchmarks/run-all.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"65878ccf3c912e5cbdb818beef25394e095858f237f6a14d36b81f6169123103"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, spawnSync, mkdirSync, mkdtempSync, writeFileSync, readFileSync, rmSync \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":"scripts/audit-multirepo-e2e.mjs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9679b1ca2b11b73cc12709249c3862077d8f3132fd938cda3d70cb1b1e69c95"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060resolveOmcStateRoot\u0060 is async and calls existsSync, execFileSync \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":"scripts/lib/state-root.mjs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4ee31e2d765cb84b9baaf894a3eb061f789d43ab4a379f554b384ead046a64"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060resolveSessionStatePathsForHook\u0060 is async and calls existsSync \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":"scripts/lib/state-root.mjs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdfb034adf5b04f3348c618f0607fb3e8597ed73e1a0c1f05d0b76f09319bf78"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, unlinkSync, mkdirSync, writeFileSync \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":"scripts/code-simplifier.mjs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9bcfbaa3b4df1a56d65635715ffc99d9b24b9ef69b7254dfd9de3f384c2e22"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060resolveHudCacheContextPercent\u0060 is async and calls statSync \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":"scripts/lib/context-usage.mjs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfadef31c89ef79798b85bafca2d20e08733a7047102dd1d44a4a092c0326fd0"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060generateInventoryGraph\u0060 is async and calls existsSync \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":"scripts/generate-inventory-graph.mjs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"572fbb4ee46868284bcf74480febf97f8ed5e451dab7dbc8b6032490c064ebb1"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls readFileSync \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":"scripts/generate-inventory-graph.mjs"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"721456edfe498004654d67570fa5e4ec28e1cf508ad3dd142c19186403b8b57e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync \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":"scripts/generate-prompt-projections.mjs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaf0f9c6d8cd73590b82763cc4ea037de740df14cd9c91b7d67881427ceeea94"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync \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":"scripts/jev-eval.mjs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6e89b86e1429ddd928ff299a081641e612d386d949f32107b692ff938e181c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060activateState\u0060 is async and calls mkdirSync, existsSync, readFileSync \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":"scripts/keyword-detector.mjs"},"region":{"startLine":990}}}],"partialFingerprints":{"codehealthFindingId/v1":"169828cb2d6adbb41af3471bfb4946e652a1a563ee5565e1f31281f160c4d547"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060resolveOmcStateRoot\u0060 is async and calls existsSync, execFileSync \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":"scripts/lib/state-root.cjs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"4551b8f34150599e07f4f3146575b7728d15323111cac510c2210d1fe2aa7299"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060resolveSessionStatePathsForHook\u0060 is async and calls existsSync \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":"scripts/lib/state-root.cjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ba4f7b457ac2152c5abe3bf45c912bb465119eec3dbc97bcdc0d785bdae4786"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, unlinkSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.cjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a9f5bcb8e3e71338a7c18c2242ac8e06db4a946214542a95c39e885a93f72f"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync \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":"scripts/persistent-mode.mjs"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf41b537588ce3a0253ff1349bb8fbe37f0ae6c2f26deeb24019441a8654f595"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060initOmcDir\u0060 is async and calls existsSync, mkdirSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-use-failure.mjs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f5a2440836cb56aa307fb344135aed76c6dc18edf7d649524f453ac096b7307"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls mkdirSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-use-failure.mjs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"a36a75e90564147b6d0184160fd075d9a3c687a831c160a21f3e65575ec67947"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getTodoStatus\u0060 is async and calls existsSync, readFileSync \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":"scripts/pre-tool-enforcer.mjs"},"region":{"startLine":891}}}],"partialFingerprints":{"codehealthFindingId/v1":"2025dd874947761f0d5fd996dafcdf5a10bf7199bbc9851598c1c4fcf202b821"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls writeFileSync \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":"scripts/release.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39c108924208dd8b5f5875975a06165483a6c3bad9ebdd71a772d72fe702010"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls spawnSync \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":"scripts/run-provider-advisor.js"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b28e8a49c19605ea9458089544a06821735379bf1468531974596a4f24b123"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060checkNpmUpdate\u0060 is async and calls existsSync, readFileSync \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":"scripts/session-start.mjs"},"region":{"startLine":834}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e06a923370072f48a485f794f9b41191f259d62155a286555dbd1e79bf8e21c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060checkHudInstallation\u0060 is async and calls existsSync, readFileSync, readdirSync \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":"scripts/session-start.mjs"},"region":{"startLine":956}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed05f236def95bf5ad10d9275263ed2c9403e231914cec1e9dc62885d69b952"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync, readdirSync, lstatSync, readlinkSync, symlinkSync, renameSync, unlinkSync, rmSync, mkdirSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/session-start.mjs"},"region":{"startLine":1040}}}],"partialFingerprints":{"codehealthFindingId/v1":"065aeeaf7cc622c57d8087cee0ec8bf06116ed44261e0d3143ebd1fcffe8c43c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060countUserTurns\u0060 is async and calls existsSync \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":"scripts/session-summary.mjs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f78f0fa63ed266be969b7f5d3e75c65ff067c32ec1142991a73cfc5d42ca40"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060extractConversationContext\u0060 is async and calls existsSync \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":"scripts/session-summary.mjs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"7673a8c08343aec0d0e3a85560c80df0032ba9f40f94f07f06c561a20c3d1f48"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060checkProjectSkillTriggers\u0060 is async and calls existsSync, readdirSync, readFileSync \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":"scripts/shipyard-audit.mjs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a71127e3d8c541c8356011682a7142d2ae6f7261467c31f85d310c06a7f6b8d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, statSync \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":"scripts/shipyard-audit.mjs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef51fb937298bba4690c7bb1b2083352112e5f9e2b69db1a630f62228fa6bf4d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync \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":"scripts/verify-deliverables.mjs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e4c55466ee152c03ff6c921602a3b0943fa1b40f84b69fe484d381449f54597"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls readFileSync \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":"scripts/verify-generated-artifact-authorization.mjs"},"region":{"startLine":740}}}],"partialFingerprints":{"codehealthFindingId/v1":"0644895440cff4884dec879b4e3207df81f42d25eb327d722e4048de49d83e9d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060loadAutoresearchMissionContract\u0060 is async and calls existsSync, realpathSync \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":"src/autoresearch/contracts.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ecbc159b6236db0d7f9ee40a4e27686fc4f3ecb428062035afa60700e1cad1"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060writeGitInfoExclude\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"6422317b75c04d94b549bf869e031e982ce9777be3437ba614ad2539c5716ad0"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendDecisionLog\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b74781a236f05767f30aca699e5ca6f1580c7f9c043497646c2ec6b4cf85045"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060ensureAutoresearchWorktreeDependencies\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc26ce47b570d22a2ba4a82ce914a4c1cd5c691a626aa9505e905e9778dcebd0"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060readActiveRunState\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b92012bf11364e222c2f9cc9511b3dccd45f85c94befa176e4bba12f6142173"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060initializeAutoresearchResultsFile\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"5863968c7f766d33236fd9dfa82ff5b0f42da341bb9aeb8e548b32dbef69b42e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendAutoresearchResultsRow\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"3696a89f229430ba608defc8c07609a24ba4f06293a87aa162c666576dd77d6c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendAutoresearchLedgerEntry\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"8849097030911b5bd6acc7f110734e499d8c4f214d28da0856e2a1c91cfe3774"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060readAutoresearchLedgerEntries\u0060 is async and calls existsSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"91504e6b0e79ea4c4a52f041d441979cf916bd69ee872f87ddd787eceec59fb7"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060runAutoresearchEvaluator\u0060 is async and calls spawnSync \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":"src/autoresearch/runtime.ts"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d96bcf25861971688a23cf4d2bcb0698c065453830ad5e8cf5de15cac87eac0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 4 sibling directories (128 clone groups): 128 duplicated blocks under the repository root have copies in at least two of the sibling directories scripts, skills, src, templates \u2014 110 of them are reported below, and 18 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 128 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 128 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 128 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/workflow-drift-guard.mjs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ee8ca3a19a9a696be86e04ddc9a3c2f7c49d4811bbde5c7940d07974dd0678"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 21 sibling directories (96 clone groups): 96 duplicated blocks under src/ have copies in at least two of the sibling directories agents, autoresearch, cli, config, features, graph (\u002B15 more sibling(s) not listed) \u2014 57 of them are reported below, and 39 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 96 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 96 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 96 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/interop/omx-team-state.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"39997c8b1902b902a8bccb9a10ebe8aea3d1d62ad6bcee86e3401307a2316fbf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 19 sibling directories (19 clone groups): 19 duplicated blocks under src/hooks/ have copies in at least two of the sibling directories auto-slash-command, autopilot, comment-checker, directory-readme-injector, empty-message-sanitizer, keyword-detector (\u002B13 more sibling(s) not listed) \u2014 11 of them are reported below, and 8 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 19 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 19 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 19 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/directory-readme-injector/index.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"90e22e171be8eca35b369e688407a3fd2b9bcbe974d9dc25b19fbde011a78a1f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 4 sibling directories (7 clone groups): 7 duplicated blocks under src/features/ have copies in at least two of the sibling directories background-agent, rate-limit-wait, session-friction-report, session-history-search \u2014 6 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 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":"src/features/session-friction-report/index.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"617acdc1428fe7b45168cfb0ce376d2053b1e79da4e49a196f5d6dda5a455326"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (621 identical lines \u00D7 2 files): scripts/workflow-drift-guard.mjs:12 \u00B7 templates/hooks/workflow-drift-guard.mjs:12 \u2014 these 2 files are line-for-line copies of one another \u2014 621 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":"scripts/workflow-drift-guard.mjs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"65745744aa2af4784e66e0c6f36210d44a1510da9714ab0f2d6e30bd14a2df97"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (553 matched lines \u00D7 2 locations): scripts/keyword-detector.mjs:90 \u00B7 templates/hooks/keyword-detector.mjs:43 \u2014 the two spans are one implementation copied and then locally edited \u2014 3419 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/keyword-detector.mjs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f2898f23eb69dfc94ae23e618d462021be952c209a7f45d1022b12024da11c3"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (438 identical lines \u00D7 2 files): scripts/lib/precompact-restore.mjs:17 \u00B7 templates/hooks/lib/precompact-restore.mjs:17 \u2014 these 2 files are line-for-line copies of one another \u2014 438 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":"scripts/lib/precompact-restore.mjs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0fa2a9bf11b3bc35d44dee9ed3107bb52acbe36a06cc7ad9306874aefdf6093"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (344 matched lines \u00D7 2 locations): scripts/lib/state-lock.mjs:101 \u00B7 src/lib/mode-state-io.ts:128 \u2014 the two spans are one implementation copied and then locally edited \u2014 2180 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/state-lock.mjs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceaf2897bda1169efbe995604d8806907ec53ad7e0f7c9312e9fb67c2bd5b693"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (249 identical lines \u00D7 2 files): scripts/lib/precompact-publisher.mjs:16 \u00B7 templates/hooks/lib/precompact-publisher.mjs:16 \u2014 these 2 files are line-for-line copies of one another \u2014 249 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":"scripts/lib/precompact-publisher.mjs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d0538d2de2ee07f117bcec5c1a6211decdd85dc4b8241eb2f2fb040a70509d"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (242 identical lines \u00D7 2 files): scripts/lib/atomic-write.mjs:6 \u00B7 templates/hooks/lib/atomic-write.mjs:6 \u2014 these 2 files are line-for-line copies of one another \u2014 242 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":"scripts/lib/atomic-write.mjs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"22bc7ba6ec6d61970d0b22487434b10598ae88a0ce5182eff991c5ac0f6639d0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (225 matched lines \u00D7 2 locations): scripts/persistent-mode.mjs:789 \u00B7 templates/hooks/persistent-mode.mjs:456 \u2014 the two spans are one implementation copied and then locally edited \u2014 2603 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"3247ed52f84e3de3c39c5654cb49ac6547d47296d592a15a6cd869a6d9637d47"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (217 matched lines \u00D7 2 locations): scripts/persistent-mode.mjs:1330 \u00B7 templates/hooks/persistent-mode.mjs:1022 \u2014 the two spans are one implementation copied and then locally edited \u2014 1710 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"0322b2238cf29abaec16351eb30cc86987507c28d10d535c6ca14836fa3f456c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (182 matched lines \u00D7 2 locations): scripts/post-tool-use-failure.mjs:25 \u00B7 templates/hooks/post-tool-use-failure.mjs:31 \u2014 the two spans are one implementation copied and then locally edited \u2014 1167 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-use-failure.mjs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"67b253a53b6e26b257627d4d67681c1461477c5f9ff4e050e6325c5a1e330a78"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (154 identical lines \u00D7 2 files): scripts/lib/workflow-profile-runtime.mjs:1 \u00B7 templates/hooks/lib/workflow-profile-runtime.mjs:1 \u2014 these 2 files are line-for-line copies of one another \u2014 154 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":"scripts/lib/workflow-profile-runtime.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f570b154f9695f7ab90ad381d950aafc1b48e539cda4bbf6d33595adb771c6c4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (150 matched lines \u00D7 2 locations): src/tools/memory-tools.ts:35 \u00B7 src/tools/notepad-tools.ts:41 \u2014 the two spans are one implementation copied and then locally edited \u2014 777 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/tools/memory-tools.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba8d884f70637277be1e6740cfb951d305454937fe2964af590b3ef1e41ac33a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (141 matched lines \u00D7 2 locations): scripts/pre-tool-enforcer.mjs:166 \u00B7 templates/hooks/pre-tool-use.mjs:158 \u2014 the two spans are one implementation copied and then locally edited \u2014 1095 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/pre-tool-enforcer.mjs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"57150c26dad149884e6262303494c71521a4728f1c15b480853acbb738ef620e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (129 lines \u00D7 2 locations): scripts/keyword-detector.mjs:1258 \u00B7 templates/hooks/keyword-detector.mjs:1206 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/keyword-detector.mjs"},"region":{"startLine":1258}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ca8c68f9fcf79786087ad81a427120108a0b7414d0f176c8fb164f53ecba38"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (114 matched lines \u00D7 2 locations): scripts/persistent-mode.mjs:1155 \u00B7 templates/hooks/persistent-mode.mjs:938 \u2014 the two spans are one implementation copied and then locally edited \u2014 753 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":1155}}}],"partialFingerprints":{"codehealthFindingId/v1":"9917d64a4db0497fb65cdef016c2738b2bfdb9409efecfa1a44d99b09cde5cb4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (97 matched lines \u00D7 2 locations): scripts/post-tool-verifier.mjs:525 \u00B7 templates/hooks/post-tool-use.mjs:42 \u2014 the two spans are one implementation copied and then locally edited \u2014 638 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-verifier.mjs"},"region":{"startLine":525}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc47bfdcca242b815b079c6b85eb5e4f473057142c0288c490115ef3ddcacdb3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (94 matched lines \u00D7 2 locations): src/hooks/omc-orchestrator/index.ts:131 \u00B7 templates/hooks/pre-tool-use.mjs:390 \u2014 the two spans are one implementation copied and then locally edited \u2014 1159 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/omc-orchestrator/index.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a3a982ceb55b10f71e6ea320f09e1e6b7c12fb928661a81fa4987207ca06dc9"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (91 identical lines \u00D7 2 files): scripts/code-simplifier.mjs:19 \u00B7 templates/hooks/code-simplifier.mjs:19 \u2014 these 2 files are line-for-line copies of one another \u2014 91 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":"scripts/code-simplifier.mjs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"718327da23502a82f7e796d87b6946d2b58b7d2fe37d761cd96d9d0a87d53df5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (90 lines \u00D7 2 locations): scripts/persistent-mode.mjs:610 \u00B7 templates/hooks/persistent-mode.mjs:619 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfebb1e9b46b9e22dadd767b3f25e41c8bcb6662774534c6185bdb82876777cb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (80 lines \u00D7 2 locations): scripts/persistent-mode.mjs:404 \u00B7 templates/hooks/persistent-mode.mjs:284 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"b87a65fa8ede9b4ea95c29b893a40cf20f3409e8e88c2f06da5dc3addc420ff0"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (77 identical lines \u00D7 2 files): scripts/lib/stdin.mjs:21 \u00B7 templates/hooks/lib/stdin.mjs:19 \u2014 these 2 files are line-for-line copies of one another \u2014 77 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":"scripts/lib/stdin.mjs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e211022ca7bcd1e6aeec92c20ff9de07c62a77eb2b0a802486acc8469b278e49"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (76 lines \u00D7 2 locations): scripts/persistent-mode.cjs:354 \u00B7 scripts/persistent-mode.mjs:440 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.cjs"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df940dcc2aeccdada3ccc21da7e61ab5487c15262593ab1dca6a5b3fb0ff60f"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (74 identical lines \u00D7 3 files): scripts/lib/state-root.cjs:20 \u00B7 scripts/lib/state-root.mjs:21 \u00B7 templates/hooks/lib/state-root.mjs:21 \u2014 these 3 files are line-for-line copies of one another \u2014 74 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":"scripts/lib/state-root.cjs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a55b60b0307ac79f682ddfa40f933238c7af9350e178a40cdec2e8cafab9419"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (73 lines \u00D7 2 locations): scripts/persistent-mode.cjs:816 \u00B7 scripts/persistent-mode.mjs:1026 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.cjs"},"region":{"startLine":816}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5ed6bf5d68782899bacada381f22f119287ed8f1ea5eeb03508fc629cc2896c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (70 matched lines \u00D7 2 locations): src/hooks/directory-readme-injector/index.ts:70 \u00B7 src/hooks/rules-injector/index.ts:54 \u2014 the two spans are one implementation copied and then locally edited \u2014 401 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/directory-readme-injector/index.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ae55fb48cfafebe41404af1609f6e29630d966dc1d3532f584b161d14a322e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (68 lines \u00D7 2 locations): scripts/post-tool-directory-context-injector.mjs:25 \u00B7 scripts/post-tool-rules-injector.mjs:22 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-directory-context-injector.mjs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"17787c684271d0de7330d0eb8ecfa93c318c24e263a4cd06ee9c009dc58b353a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (65 matched lines \u00D7 2 locations): src/hud/elements/limits.ts:64 \u00B7 src/hud/elements/limits.ts:232 \u2014 the two spans are one implementation copied and then locally edited \u2014 707 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hud/elements/limits.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db961343fad54fc6533e55e0b543ea1f95613b0747bea3d8f641db427ddc0df"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (62 matched lines \u00D7 2 locations): src/hooks/learner/bridge.ts:335 \u00B7 src/hooks/learner/finder.ts:16 \u2014 the two spans are one implementation copied and then locally edited \u2014 416 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/learner/bridge.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"26da03edc466eff04c0a3b4a387e9a63b187983d5b1104d6990761d1bb506682"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (59 matched lines \u00D7 2 locations): scripts/persistent-mode.cjs:102 \u00B7 src/hooks/persistent-mode/idle-repo-state.ts:35 \u2014 the two spans are one implementation copied and then locally edited \u2014 436 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.cjs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"49985fa0b1f1b4e9dba350bb0d202819280b4cd7355fcf0ece88a752630a2593"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (56 lines \u00D7 2 locations): scripts/persistent-mode.mjs:29 \u00B7 templates/hooks/persistent-mode.mjs: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":"scripts/persistent-mode.mjs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"887df16a38bac53562b048583b57a0728e6c47e1dd90dd3e7f2565540c087da7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (54 lines \u00D7 2 locations): scripts/session-start.mjs:1425 \u00B7 templates/hooks/session-start.mjs:776 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/session-start.mjs"},"region":{"startLine":1425}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4eca96a11730b08213f782f69712f6af87e1006f2b035a89114e3fc632db281"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (53 lines \u00D7 2 locations): scripts/persistent-mode.mjs:182 \u00B7 templates/hooks/persistent-mode.mjs:135 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffc87eba5681064451124239abd38da755a00ffac66197421e4f71601f43d4a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): src/team/dispatch-queue.ts:300 \u00B7 src/team/team-ops.ts:867 \u2014 the two spans are one implementation copied and then locally edited \u2014 502 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/dispatch-queue.ts"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b7a6fa385d5e2b4c526793256284e454d7c855c87ae83feb6fbd4faf62e9242"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (50 matched lines \u00D7 2 locations): scripts/skill-injector.mjs:501 \u00B7 src/hooks/learner/index.ts:56 \u2014 the two spans are one implementation copied and then locally edited \u2014 341 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/skill-injector.mjs"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc4c88b4105b177c9ea2c6f862f46eecbc4f056a11e3376c0bb170c8d6ff9db9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (50 matched lines \u00D7 2 locations): src/notifications/reply-listener.ts:611 \u00B7 src/notifications/reply-listener.ts:795 \u2014 the two spans are one implementation copied and then locally edited \u2014 266 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/notifications/reply-listener.ts"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9f3c488c23bfd90d50bc57279e0d349df4e14fc35ab7ffe5a7b13a2430e0912"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (50 matched lines \u00D7 2 locations): src/team/team-ops.ts:779 \u00B7 src/team/tmux-comm.ts:26 \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":"src/team/team-ops.ts"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0fa1082f98d525f675f185f9d706b55940da612673b36929941c35e3fc3d6e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (49 matched lines \u00D7 2 locations): src/tools/shared-memory-tools.ts:81 \u00B7 src/tools/shared-memory-tools.ts:200 \u2014 the two spans are one implementation copied and then locally edited \u2014 325 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/tools/shared-memory-tools.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c52b769dca5dfbe0885687c1ec19c0a45c64f59906dbb08bc1409aae7d9c19"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/__tests__/checkpoint.test.ts:12 imports src/features/checkpoint/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/__tests__/checkpoint.test.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6a5a3e46e2aa0c93122bc63f3bb77370b901e747199033b857fdcdf14078bb7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/__tests__/jev-model-routing.test.ts:15 imports src/features/jev-model-routing.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/__tests__/jev-model-routing.test.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60afb17d54ac0f0f7cdc6c3f921dbee71fe062c2bfaaeb252c301cd1020debf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/__tests__/jev-model-routing.test.ts:16 imports src/features/delegation-enforcer.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/__tests__/jev-model-routing.test.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c40b591a4e9726de15bf526e616e85ce7cbc6f31d72af32b5e937a1b6ce1fbea"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/__tests__/jev-slop-warning.test.ts:5 imports src/features/jev-slop-warning.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/__tests__/jev-slop-warning.test.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec338d61bcd487176c585af5230a6d8affd8d42b6dad7cba08e12dc6549b411f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/__tests__/magic-keywords.test.ts:3 imports src/features/magic-keywords.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/__tests__/magic-keywords.test.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"726bb5cf36839b1078672814c067a6235acdfa1ce4ca54d79f7380b59c1dc12a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/delegation-enforcer.ts:19 imports src/features/delegation-routing/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/delegation-enforcer.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"03aab6075f6d86183150aa4408eb9c1a3f5541dc5b1f4c852c66ae8441b5f654"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/delegation-enforcer.ts:22 imports src/features/builtin-skills/skills.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/delegation-enforcer.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"8abd559b1853758df65521229cba0022078fa470040359f1f3a7a456f492a63b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:55 imports src/features/boulder-state/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d0a629f461909ea903952b34de5a9bab79e2c3eb9896196a5853c5898c66b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:84 imports src/features/context-injector/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"5394dd8f9eb2a7085aee9c2cc29d490bf4fa584758cd033ea2be4105d68512bd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:105 imports src/features/background-agent/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"62b525ccc6d8fde681afb83308806f9992bad4c13136a37b9674f6bab048a960"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:122 imports src/features/builtin-skills/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"254cdd3b6080d5042da5fecdb079607b42beded5a7c9c46263f80237af442c36"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:134 imports src/features/session-friction-report/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"3980e16185c152c28c52a1e29741604680ecde60da7e4b8b60969ed69da3d48c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:143 imports src/features/model-routing/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"c37e4d4474a7e57ab0e9645b8e0091cdb464920378670e3846a193b70f85c6e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:198 imports src/features/notepad-wisdom/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"d52378a54f5f8f215da68e317ee82d36ac5fefceb76c480bcd5ec043290b072c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:214 imports src/features/delegation-categories/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4d2df3490a733a9f5caa181883bc1bafcbed02ef5c9fa8abd5d16e54278fc4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:239 imports src/features/state-manager/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b587a8dfea08a770520576bc0c836b2f78bd701840c10c5f8b86f279896b28"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:272 imports src/features/verification/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"95fcefbc8ddbebf3000a979ae63f29b3096f9089b3899fcdfa26b1f19c367b52"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:295 imports src/features/task-decomposer/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b7cd8ec1cfb8582396127df7800fe922a8a56ff5e92391fba556f38f0a9e15"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:318 imports src/features/session-history-search/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e10c6a473f4874b23bf17fa381655d9f0384c755ca00509389b24b36c9cb55d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:326 imports src/features/agent-addressability/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd72b89334cb71f11c13ea001dc811bd55a65c0f1cf9b6df18d12ab181748aeb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/index.ts:343 imports src/features/lookout/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/index.ts"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"045f57bd41c9f57aea88243e6ed1b97bf0fa2179ae089cbd506a3ae8d4c529ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: src/features/notepad-wisdom/index.ts:11 imports src/features/boulder-state/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/notepad-wisdom/index.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6aa99ecacfbf6e51757432bdd7afdd027742c5789f8fa9195b615c522c4d113"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function executeTeamApiOperation (cyclomatic 258, cognitive 285): executeTeamApiOperation has cyclomatic complexity 258 and cognitive complexity 285; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/api-interop.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"2109b253752d976a7b3fc8407e7dedd4f2dc1539c68e8e2735599fced1b0f21c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 160, cognitive 274): main has cyclomatic complexity 160 and cognitive complexity 274; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.mjs"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65c68b8fc11fdf4e8d704617fd9a82864272a59c08ffea9e9cd6cab255a90df"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 136, cognitive 245): main has cyclomatic complexity 136 and cognitive complexity 245; 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":"templates/hooks/persistent-mode.mjs"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"2461e732592feb115d6e86fa548a90a3d794579cf7c0331fb4f07ed50748476f"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function handler (cyclomatic 133, cognitive 210): handler has cyclomatic complexity 133 and cognitive complexity 210; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/tools/state-tools.ts"},"region":{"startLine":1544}}}],"partialFingerprints":{"codehealthFindingId/v1":"25e767487913e3d757881d628a6237a3da962b87dbac350183dfed7c303444ff"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function render (cyclomatic 133, cognitive 201): render has cyclomatic complexity 133 and cognitive complexity 201; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hud/render.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe25b117a18ae991833c90e260c2e1220bb851336531d2e4a96bf9ba5ed914f"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 127, cognitive 222): main has cyclomatic complexity 127 and cognitive complexity 222; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/persistent-mode.cjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4de8d1f8761ee4e85e5f96026eb47ee2cd6d387a1791637a47184fb848592fd"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function processCliWorkerVerdictsUnderLock (cyclomatic 124, cognitive 244): processCliWorkerVerdictsUnderLock has cyclomatic complexity 124 and cognitive complexity 244; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/runtime-v2.ts"},"region":{"startLine":4735}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4e3b0ce5ede82a010fc52928f9db5b6e0205b8a09e2797bdb1d99f07058f3fa"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function createTeamSession (cyclomatic 113, cognitive 254): createTeamSession has cyclomatic complexity 113 and cognitive complexity 254; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/tmux-session.ts"},"region":{"startLine":1898}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5f7880cce1a85d81f1b57933b189deb962ff24691bfd7769cecea9c3dc917b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 105, cognitive 225): main has cyclomatic complexity 105 and cognitive complexity 225; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/session-start.mjs"},"region":{"startLine":1040}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd69a73b76d5f9b642248759f25329317079e64bbddb799bde784712136d7d76"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 102, cognitive 175): (anonymous) has cyclomatic complexity 102 and cognitive complexity 175; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/scaling.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"62442d77f676ac2b8b71d2fa9d840ef3d53a03726039beb91dd2c1dc5e38b04e"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 100, cognitive 102): (anonymous) has cyclomatic complexity 100 and cognitive complexity 102; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/cli/index.ts"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf83561ea8c858cc8431a5ab1ac7496f3683fb9a493068b29d3cc6755b15f7d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function install (cyclomatic 99, cognitive 156): install has cyclomatic complexity 99 and cognitive complexity 156; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/installer/index.ts"},"region":{"startLine":2443}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e32f9d283a879f534f80e64c32f7241b93f77504884102c40cf98c5be063536"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function runPersistentRecoveryOwnerLoop (cyclomatic 96, cognitive 103): runPersistentRecoveryOwnerLoop has cyclomatic complexity 96 and cognitive complexity 103; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/runtime-cli.ts"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"90e148fe58eff8d368c7c698348521c56b7460c50e98040fd6c46ea226396082"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 94, cognitive 156): (anonymous) has cyclomatic complexity 94 and cognitive complexity 156; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/runtime-v2.ts"},"region":{"startLine":3982}}}],"partialFingerprints":{"codehealthFindingId/v1":"696059916d9b3de20fe0234452f39e2a1f4b9bf56d3c3510838878754e764594"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function verifyLiveGitHubEvidence (cyclomatic 92, cognitive 134): verifyLiveGitHubEvidence has cyclomatic complexity 92 and cognitive complexity 134; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-epic-3698-closure.mjs"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa64a0b20f542e96ba2f706ef6ee2abaa777f2585b001b172ef6c9f2aef7779"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 91, cognitive 130): main has cyclomatic complexity 91 and cognitive complexity 130; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/pre-tool-enforcer.mjs"},"region":{"startLine":1666}}}],"partialFingerprints":{"codehealthFindingId/v1":"51c133424ed5635441c1310b8f34f5f2a222910d17973d0d498dd9ba1e502292"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function checkExactHeadCi (cyclomatic 89, cognitive 149): checkExactHeadCi has cyclomatic complexity 89 and cognitive complexity 149; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-epic-3698-closure.mjs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"985462d8cd762aed6f8f06e4e83b28cf52b52fc442bcc8e14e2c24d14d100547"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 85, cognitive 108): main has cyclomatic complexity 85 and cognitive complexity 108; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/keyword-detector.mjs"},"region":{"startLine":1654}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69ef788c2aa270a5eb3975776ca6397545c352f91224c45a335cb4237a68131"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function shutdownTeamV2 (cyclomatic 79, cognitive 153): shutdownTeamV2 has cyclomatic complexity 79 and cognitive complexity 153; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/runtime-v2.ts"},"region":{"startLine":5667}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffa3a805f73bdd0c259cd902b9303fb46c4dbadb678f8e29ceccc1aa28d3266a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function mainImpl (cyclomatic 79, cognitive 95): mainImpl has cyclomatic complexity 79 and cognitive complexity 95; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hud/index.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cab1467410a2ec33523e331b501ef945797414534c404e0636e8562e9815bca"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 127 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: src/team/runtime-v2.ts (6023), src/team/tmux-session.ts (3767), src/hooks/bridge.ts (3134), src/installer/index.ts (2539), src/tools/state-tools.ts (2442), src/team/worker-launch-ack.ts (2425) (\u002B121 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-epic-3698-closure.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85f9e434d09e0b6117ae4ba81035d21d2f6d6f05bed010b854a833c59f925a0e"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/keyword-detector.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"545ac081a661773846e64754776eabe67e9ab49b9726027549520b3cac5da697"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/precompact-restore.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7167cd7456db08106c6d32c03e2b43fce880baa0925754f83186b5f4da1fd58"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/lib/precompact-restore.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54ebe8285e7836b074da3eb35066923ce04ed14f65f3498d48ed97b577904d0"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/smoke-multirepo.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec293470238eb67076b1f5e7a61f657efbd8bcae287ad435deb14944aaa2c2f3"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/test-notepad-integration.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af49c68692ef4cadeeca523677c343e041fc75b3c71557abaf85068ca1eaa00b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/audit-multirepo-e2e.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30681d28f085d8e9d511e94a8d075c2f1ce9ec79bd8d774fe271f92e89de5091"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/post-tool-use-failure.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"170adc07f406e8cc587546882f9bb04f58207c645335c3394a2341f18b1ff98f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/run-provider-advisor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2adf25df7f17d61b52f14754795430995a64bb5f1f8c195e50f83625a56642e7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/lib/atomic-write.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd6f7d6f95d513089c3f43bb6a4aedc23d5fc531b449c9487a3f7605017ef2e"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/lib/precompact-publisher.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91386dbf85d30f951b2a863d8a6aa416dc82b4c369a70b37a1824abb9b19efd"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/post-tool-use.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede05903475e5b78fb5b27dcc008c76703e63dcc4c82ccd10ae86e89edeaf899"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/collect-epic-3698-ci-evidence.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65b2722655661e065337d3a01747919038e5b66a17e59ce1cf7540ae3bf3f7ab"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/context-guard-stop.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"552f0228fdadc9af30ab681afa960896d32e873b6f35bbe993a4dd595330c779"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/session-summary.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f579c8c3f2121964a556246a5c106e046c34e983f1f55b3a4e2a89b89778b9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/repair-plugin-cache.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04c340a69f1d18512874b185964ed2b3ac0f464c70ff17b91f1286dba839179"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-deliverables.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3e1adbf20f173a01ea71798ea01aeb9363f3e4f717ebf0a3030605a64a14b58"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/agents/prompt-sections/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e564416255a57cb2ea415c52b932515b9be1f810f01d8ec081a4e0dcaac547fa"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"skills/self-improve/scripts/resolve-paths.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a503755fc86b596eaf106f330dc607350b7ca4b69b5679939ca520115c57802e"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/cleanup-orphans.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e792899d66f752bec84bcb4d662a34f86c903c08487e925ed2af9f8196ec7db7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/verify-graph-contained-fs.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0c7e0d542cbbca3611080d491cfa1738ec0710fbf92be949221693972822cca"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/lib/workflow-profile-runtime.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f87b420bcb152e1fda92240e66ad90858070ed2468db9850470d0230aa221161"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/openclaw-gateway-demo.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bed136d771b93107454a76dee3fde5a1b704b770a09464784ff0d5aa31bc15b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/hooks/lib/state-root.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39a3aad13b3a94a2715c687fa1d1229fcda19db9466134342c81fd280f94959"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/tools/resume-session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"664e29e5bee5bfb482feec6f562f460ca5f8a35adf56b1d694a6e50d5bc2f635"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/status.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c3d400908e60a4a8d297c130723c73087ab26101a0ac1e1267b9ef8474cb06c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/mcp/mcp-config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de12eb60765f4a209e64cd369487a2bd393e917336330ee65de6f84cfd70280"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/test-remember-tags.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1bd375eca4753f432554f588d931839b8e5e3d63a46712dd4b55b4f02ac79e5"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/mcp/standalone-server.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b293fd82ffbac382b9b5e7593d04efdf22cebdf28b02a263f6aff030a51de4"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-rules-injector.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73556a088aa4cb012a350dae55884f61538c3d0f31643fe3e11237b1df83f0e2"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/post-tool-directory-context-injector.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"125323a42459d8739d4056735640e59492a41a2e9ed5628cd3c1861ebaef6f6f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/delegation-categories/test-categories.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1425f880a03003303720431242ba4571ad636180cef17072d6d68c8ca859a7d3"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/build-generated-artifact-authorization.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b86a732944b751ba4b58eba2a954a15fce9358ba0b2dca219ee4584466b1c77"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/test-max-attempts.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd3aa22996e6fc5f930711b31d545f9f2c061762a95fcdec61228179e101534"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/measure-prompt-ssot.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9490822f189a376e098bdfaeefff79b334aa61513c32a20b35f87523c692f973"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/project-memory-posttool.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c95f648edf48b7d45476ef72db0616c1b1d50921f2f091870735798fcba1d38"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/team/team-projection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd3f4d9da24d9241e16924cc3d1bf1b9f498f15fb1a62adcd30268320e85335"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/project-memory-session.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d14b5a164d3846ed0e7886ec32ca1b3c1c56471b53d62cbc426025d2b121e15"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/build-prompt-ssot.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0e897712a93fe79231a839a72bd4a172f913848e2c6bd51f5b11f760cea225"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/graph-agent-demo.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a52148665b00683e66aecb0fbc544280a2fdb76055c7356e5a080091b81311c4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~626 LoC): no import path from any entry point (278 application, 93 tooling, 851 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":"scripts/lib/precompact-restore.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef459b7b4e16e6c668addf51882ef0c34a089efff1c4a68feac8f9799f2ff0f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~229 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/agents/prompt-sections/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"69565563d5e93ed266b3d9295f7a7510bf7d031cee2d70685b05c704067946a8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~124 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), but 2 in-repo import(s) from 1 other file(s) do name it (src/mcp/index.ts) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/mcp/mcp-config.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50c1f9427dd418cb1f97491c0e8d478411f44ae4481ce1370d034ef68a248d43"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~121 LoC): no import path from any entry point (278 application, 93 tooling, 851 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":"scripts/test-remember-tags.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b30e7f66c74f6054fbc6950a227bcca3e66947a6ffed2d299e8035369a1bf83f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~79 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/mcp/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d419a977c53753cd413d3bd630c09c51a35c97f935e770e8a89f30dd6da2ae"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~62 LoC): no import path from any entry point (278 application, 93 tooling, 851 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":"scripts/eval-autoresearch-timed-json.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7edaf25b05ed5b568675aa182a940ec17e606c0090017f568e6e4d2ef4ce85d4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~49 LoC): no import path from any entry point (278 application, 93 tooling, 851 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":"scripts/eval-autoresearch-json.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9fd760a2c20e409e13efb41e40f70b15d6ee842f02775856447dbcc5ba41de3"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~41 LoC): no import path from any entry point (278 application, 93 tooling, 851 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":"scripts/test-session-injection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce56555a486ac84e07de6432e4eb0817ae187409f8c0917b78eb6d5f9c496f14"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~39 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/autopilot/transition-helper.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf641d7927fca54c5b7feed15ee0e8f1f4660db695345a0fa0a494cde9acd3a0"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~27 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/config/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98295435bfde569e29acda0579c8fe7fca04a9616138b2a472cf02df004aa481"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~27 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/setup/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ba0a2b943d118267819cabdfdf7a84420944ca0fe7640fb12fb2b57ecadb0cc"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~27 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hud/elements/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"402f0e730ec514d4dd09faf59a766b09eca3650481c09f4db09c7808e1eac95e"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~20 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/agents/prompt-ssot/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e18e9f0bfd9cd5a7cb91144adb70c66b2064c5bd7638ce333c83776848bf974"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~11 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/workflow/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f111f48e01211cb0f2451b4d9ce1d16a3dd9ee19bd09aeef55bb884faf14b9f9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~8 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/graph/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f651d101a9b244b1138df54746ba7a1cc48c37a5eca4446823642c625f962f09"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~4 LoC): no import path from any entry point (278 application, 93 tooling, 851 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/alias-retirement/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33b3429c6ca0d131282c606aeee01564e108e5509b483132321775e2a42a78be"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027SCORING_WEIGHTS\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"benchmarks/shared/types.ts"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dd7303f7c09e89aff9522b059c6110afef19523c08b9cbdf48de868727257b1"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MIN_KEYWORD_MATCHES\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"benchmarks/shared/types.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c76af5830c21da81c07c5d31502376121695abdc73915684adc97849e6d8d83"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027ALLOW_ADJACENT_SEVERITY\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"benchmarks/shared/types.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d76530888ff55285e3910f119a25374d89ae3ca10fb211c2e3e71a200dca35c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isValidWorkflowDescriptor\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/workflow-profile-runtime.mjs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f1dc73b7b617c4ac6fe3750917112a6ee1b261b4b361ecbc2f992d51fb0a1ea"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027advanceWorkflowOnStop\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/workflow-profile-runtime.mjs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"986efa9394673d55faada6fee95d994d79f53ca25586f9bbf51e2485b934420b"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027refreshWorkflowBoundaryForCommit\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/lib/workflow-profile-runtime.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b06ff810323b1c0433be803cb717b50dea95523b46f696d427d6af19acc9e2a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getProjectionSpec\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/agents/prompt-ssot/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 src/agents/prompt-ssot/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/agents/prompt-ssot/manifest.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"da91ec06416bec6b7e24a0c8c6e29a9304bce868c581c2475b86426c9a360e9f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getSection\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/agents/prompt-ssot/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 src/agents/prompt-ssot/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/agents/prompt-ssot/sections.ts"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"9410b971f548776b712eab3fab750d15ebc4f00b413dbf80fa78f3a0045a58cd"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027countTrailingAutoresearchNoops\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/autoresearch/runtime.ts"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f280709b5018a11d65fff2fa4c6e8ff984dfb536ec5eb579f5c51107f20c9cc"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027stopAutoresearchRuntime\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/autoresearch/runtime.ts"},"region":{"startLine":1535}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d3fed9033b5989d28cbd039633b1203b1ce19d141e0fcc9bd502c6c7a70532"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027__capabilitiesTestOnly\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/cli/commands/capabilities.ts"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfc8e321fe1c9f208c126b248f13fa219e13854a1d8141f1b66761bf8cbe5efa"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027hasAtomicParallelizationSignals\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/cli/commands/team.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c9db3e5141a635bc6565e4c9a4653ec8224fb64225058647a2eb083789d42fc"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027DEFAULT_DELEGATION_CONFIG\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/features/delegation-routing/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 src/features/delegation-routing/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/delegation-routing/types.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5d3feb0d7fc09a604ba6c74d6fc12030daf572d3229bd1659f3f347870f35d4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027extractWisdomByCategory\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/notepad-wisdom/extractor.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9cbb7a91371ea1bec21094df0eb8c98de43b31613b6ff894cdd7ac39b9bb84"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027hasWisdom\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/notepad-wisdom/extractor.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"92555a68be9b31787725f6a0f84aa3f9567c54c4b6c0720442a6a241684c5b20"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027prunePendingApprovals\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/graph/runtime/remote-approval.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc76167ee25f2f379a88d06325951ad3ea74bc63b00b32d0b9abb0e4e3d2c640"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027withContainedPath\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/graph/runtime/safe-fs.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"14fdc1aaa14afcf15abd980954fe4e2f9e40043925041b355ce0d952544983a6"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027shouldUseStrictMode\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/hooks/factcheck/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 src/hooks/factcheck/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/factcheck/config.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"63e88f704bd34d94f7233efd0d519eb18989da477bcc1ee44d47e912c6e11f90"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027recordMergeReadinessAnswer\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/hooks/merge-readiness/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 src/hooks/merge-readiness/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/merge-readiness/runtime.ts"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"3314bdc11c5ac2cb808519e050a775b8ce7a560fffbac0fe509f14e5a8b0211c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isLikelyMergeReadinessAnswer\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/hooks/merge-readiness/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 src/hooks/merge-readiness/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/merge-readiness/runtime.ts"},"region":{"startLine":849}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf84bf3bca87553d0b05aa449b8d05d5f8b189a8a43e7d20c9a4bf002efa9c0a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027handleMergeReadinessPromptSubmit\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/hooks/merge-readiness/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 src/hooks/merge-readiness/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/merge-readiness/runtime.ts"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ff3bbc8fc6f48ebb9b1f1f9cd0c44ec010b31bf78081211b47184120082572"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getAuditSummary\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/omc-orchestrator/audit.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b5ff6cbc4dfcb38a4e8340edba3c75b38cc7a6b7e3911b274829bbdcc2e0b12"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027DISPATCH_TELEMETRY_MAX_BYTES\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in src/hooks/registry/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 src/hooks/registry/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/registry/cutover.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"759fd7d8351184c94b83b8bacc27283b590eebe555f6484755e16cf64f088c52"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (4 files): src/features/builtin-skills/runtime-guidance.ts \u2192 src/team/model-contract.ts \u2192 src/features/delegation-enforcer.ts \u2192 src/features/builtin-skills/skills.ts \u2192 src/features/builtin-skills/runtime-guidance.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/features/builtin-skills/runtime-guidance.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3125384dffbf552b84dad0cdc1f66aea5761b10c0a56b5a73a56e7b1e8b834db"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): src/hooks/autopilot/enforcement.ts \u2192 src/hooks/persistent-mode/index.ts \u2192 src/hooks/autopilot/enforcement.ts (one verified cycle inside a mutually-dependent group of 3 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/autopilot/enforcement.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0290ac0c708e7f275d9254c8a78cd5fc1e56e3d37d0eb9e3efdf9219e5f11b"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): src/hooks/autopilot/named-workflow-resume-validator.ts \u2192 src/hooks/autopilot/pipeline.ts \u2192 src/hooks/autopilot/named-workflow-resume-validator.ts (one verified cycle inside a mutually-dependent group of 3 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/autopilot/named-workflow-resume-validator.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc6f09e07dcde6b244a153b7dbb90fcf924b62676c68df3bbe63f71d617701b1"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): src/hooks/code-simplifier/index.ts \u2192 src/hooks/code-simplifier/jev-shadow.ts \u2192 src/hooks/code-simplifier/index.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/code-simplifier/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e4a42f36b5e4db62a0784372b585012603e571b0c91995712cade4bab62d2ad"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): src/hooks/learner/detection-hook.ts \u2192 src/hooks/learner/index.ts \u2192 src/hooks/learner/detection-hook.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hooks/learner/detection-hook.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ad3c8f505f52d0e69c07dbf78c7a67e3dc2b305cdd97d2cf479678358c1f3d"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): src/hud/background-cleanup.ts \u2192 src/hud/state.ts \u2192 src/hud/background-cleanup.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/hud/background-cleanup.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5077fcf40c2ac7579e2b76b84175654047b4b5a3ff266140dd40d68bd7881096"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): src/tools/diagnostics/index.ts \u2192 src/tools/diagnostics/lsp-aggregator.ts \u2192 src/tools/diagnostics/index.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/tools/diagnostics/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12505a153b54a6a1b1d9fd54e4068882d32ebfb0e383140bb25205e39e076793"}}],"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-1104","guid":"4c918cb5-b2a6-6c55-9963-a44ee464305e","name":"CWE-1104","shortDescription":{"text":"CWE-1104"},"helpUri":"https://cwe.mitre.org/data/definitions/1104.html"},{"id":"CWE-125","guid":"98717707-96bf-ca5b-9568-8d1d257574c1","name":"CWE-125","shortDescription":{"text":"CWE-125"},"helpUri":"https://cwe.mitre.org/data/definitions/125.html"},{"id":"CWE-1352","guid":"5257f322-5cfc-6b52-bedd-0b9a526b4c7d","name":"CWE-1352","shortDescription":{"text":"CWE-1352"},"helpUri":"https://cwe.mitre.org/data/definitions/1352.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-200","guid":"b0ce3b1d-7a29-fe50-8aab-9aba899d2988","name":"Exposure of Sensitive Information to an Unauthorized Actor","shortDescription":{"text":"Exposure of Sensitive Information to an Unauthorized Actor"},"helpUri":"https://cwe.mitre.org/data/definitions/200.html"},{"id":"CWE-214","guid":"b10ad120-fb22-1351-9348-aa23b453e815","name":"CWE-214","shortDescription":{"text":"CWE-214"},"helpUri":"https://cwe.mitre.org/data/definitions/214.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-312","guid":"96724ece-b0b2-a45c-83f9-0869fa3f6bea","name":"Cleartext Storage of Sensitive Information","shortDescription":{"text":"Cleartext Storage of Sensitive Information"},"helpUri":"https://cwe.mitre.org/data/definitions/312.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-359","guid":"b7dfe5b0-0351-645b-a311-b936102c2929","name":"Exposure of Private Personal Information to an Unauthorized Actor","shortDescription":{"text":"Exposure of Private Personal Information to an Unauthorized Actor"},"helpUri":"https://cwe.mitre.org/data/definitions/359.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"CWE-522","shortDescription":{"text":"CWE-522"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"},{"id":"CWE-95","guid":"400bba4e-483c-5c50-a695-114fa9168003","name":"CWE-95","shortDescription":{"text":"CWE-95"},"helpUri":"https://cwe.mitre.org/data/definitions/95.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":127,"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."]}]}