{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"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":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"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":"AC1","name":"Text alternatives","shortDescription":{"text":"Text alternatives"},"helpUri":"https://codehealth.canine.dev/dimensions/AC1"},{"id":"AC2","name":"Forms \u0026 labels","shortDescription":{"text":"Forms \u0026 labels"},"helpUri":"https://codehealth.canine.dev/dimensions/AC2"},{"id":"AC3","name":"Page structure","shortDescription":{"text":"Page structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AC3"},{"id":"AC4","name":"Keyboard semantics","shortDescription":{"text":"Keyboard semantics"},"helpUri":"https://codehealth.canine.dev/dimensions/AC4"},{"id":"AC5","name":"ARIA correctness","shortDescription":{"text":"ARIA correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/AC5"},{"id":"AC6","name":"Visual \u0026 motion safety","shortDescription":{"text":"Visual \u0026 motion safety"},"helpUri":"https://codehealth.canine.dev/dimensions/AC6"},{"id":"AC7","name":"A11y enforcement","shortDescription":{"text":"A11y enforcement"},"helpUri":"https://codehealth.canine.dev/dimensions/AC7"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"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":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF2","name":"Allocation hygiene","shortDescription":{"text":"Allocation hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF2"},{"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":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"scan.main (cyclomatic 191): scan.main has cyclomatic complexity 191 (threshold 15). Of this number, 146 points are the body\u0027s own statements and 45 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7273dbd83acd2f30a69b20ea21b74c78c12a208a2deb6af14e38f52084a9546"}},{"ruleId":"D1","level":"warning","message":{"text":"scan-ats-full.main (cyclomatic 140): scan-ats-full.main has cyclomatic complexity 140 (threshold 15). Of this number, 92 points are the body\u0027s own statements and 48 belong to 12 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c3a1db034d165d1f40b581e0e2faf6e81063e08c35a677656d337c4363b5d41"}},{"ruleId":"D1","level":"warning","message":{"text":"runSelfTest (cyclomatic 111): runSelfTest has cyclomatic complexity 111 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c59605726c3b3998745223d0059900f7fe9371dac72351ee7d18c21f3a3ece2"}},{"ruleId":"D1","level":"warning","message":{"text":"explore-provider.ExploreProvider (cyclomatic 110): explore-provider.ExploreProvider has cyclomatic complexity 110 (threshold 15). Most of this is not in the body itself: 1 of the 110 points is its own statement and the rest belongs to 15 function literals inside it that branch (lines 157, 419, 538, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explore-provider.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"26406bea9828bbc18d7c4731f198cb945ace16f5508b100aa0c6e4aa46829d5f"}},{"ruleId":"D1","level":"warning","message":{"text":"assistant-console.AssistantConsole (cyclomatic 100): assistant-console.AssistantConsole has cyclomatic complexity 100 (threshold 15). Of this number, 55 points are the body\u0027s own statements and 45 belong to 16 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/assistant-console.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"c57cd8fad9af9d4fcaec20ec3d99908abf4d584cd57e36c89050cefcc9914073"}},{"ruleId":"D1","level":"warning","message":{"text":"apply-provider.ApplyProvider (cyclomatic 90): apply-provider.ApplyProvider has cyclomatic complexity 90 (threshold 15). Most of this is not in the body itself: 1 of the 90 points is its own statement and the rest belongs to 13 function literals inside it that branch (lines 213, 98, 348, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply/apply-provider.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b50e109fe711af16da1ba151baaea70a9699da8d221accc07c584d99cb884bd"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 85): route.POST has cyclomatic complexity 85 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 54 belong to 15 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/run/route.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"36876f0db7abfc94000bdb8c4468445afb73acf527d333ede7aacdbf5a5f2167"}},{"ruleId":"D1","level":"warning","message":{"text":"runSelfTest (cyclomatic 83): runSelfTest has cyclomatic complexity 83 (threshold 15). Of this number, 80 points are the body\u0027s own statements and 3 belong to 10 function items inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"652bd69cbfcc4564117e992136a14793a5e65b51b638fc784bc185b688a83433"}},{"ruleId":"D1","level":"warning","message":{"text":"update-system.apply (cyclomatic 80): update-system.apply has cyclomatic complexity 80 (threshold 15). Of this number, 78 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3276}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b756f9ca866a7ef70b1c7885922a5777ffa6ca8394bed7c448db5d718235ae8"}},{"ruleId":"D1","level":"warning","message":{"text":"inbox-triage.InboxTriage (cyclomatic 77): inbox-triage.InboxTriage has cyclomatic complexity 77 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 57 belong to 23 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/inbox/inbox-triage.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9d463415d0ac64e812a76e8289ff9a77bf40ffd1b9a1b37c89f366cb58fbe5"}},{"ruleId":"D1","level":"warning","message":{"text":"extract.extractForm (cyclomatic 68): extract.extractForm has cyclomatic complexity 68 (threshold 15). Most of this is not in the body itself: 1 of the 68 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 23, 29, 24, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/extract.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"3df89acd8ac18401a75c2b9c7af8741e115721790391a5512708f14bcedb5331"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 64): route.POST has cyclomatic complexity 64 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 43 belong to 11 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/explore/ai/route.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe3cf67738fe82459bab0bca5e99973cc4cd393de823a55b0842bf57b5f8ac5"}},{"ruleId":"D1","level":"warning","message":{"text":"data.NormalizeStatus (cyclomatic 63): data.NormalizeStatus has cyclomatic complexity 63 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d1716df7318468b8e4eaf1dc79e21a7f906a9beb3bb6576b96a9a1541d32dc"}},{"ruleId":"D1","level":"warning","message":{"text":"upskill.runSelfTest (cyclomatic 61): upskill.runSelfTest has cyclomatic complexity 61 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a74831fd3aedf2bc5d274c0d9549f3fc15c700090787a901689913351933ab2"}},{"ruleId":"D1","level":"warning","message":{"text":"PipelineModel.handleKey (cyclomatic 58): PipelineModel.handleKey has cyclomatic complexity 58 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4f8d508d49dd66b4b5c55c93a5d83a17a4a7d4134d9325a911da9a33a23505d"}},{"ruleId":"D1","level":"warning","message":{"text":"export-ats-text.formatAtsText (cyclomatic 56): export-ats-text.formatAtsText has cyclomatic complexity 56 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 31 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"07549c78a2f2074be0bf683d7c7484da8e740853e90ebd6dd3042a017a5715a4"}},{"ruleId":"D1","level":"warning","message":{"text":"data.CanonicalizeArchetype (cyclomatic 53): data.CanonicalizeArchetype has cyclomatic complexity 53 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"31155111a179db51401834cb7038e533d82d46e6fa1277b0fa4e92c2a827e8bd"}},{"ruleId":"D1","level":"warning","message":{"text":"salary-gap.selfTest (cyclomatic 52): salary-gap.selfTest has cyclomatic complexity 52 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 20 belong to 8 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"08131e93f67b56470f464d04f326b4f4ebb89b1b6bb137ff6acfb8acc5df1285"}},{"ruleId":"D1","level":"warning","message":{"text":"explorer-view.ExplorerView (cyclomatic 52): explorer-view.ExplorerView has cyclomatic complexity 52 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 13 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explorer-view.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"36a54f919e4e8e63579e440a5def48161a7a4f8e82f28edc5f48e584459f68f4"}},{"ruleId":"D1","level":"warning","message":{"text":"runSelfTest (cyclomatic 51): runSelfTest has cyclomatic complexity 51 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 6 belong to 13 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-latex.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb9ed79b1531421e40c9aa548f308440fcdf8dc3546e01bce289c7dd04d6a728"}},{"ruleId":"D1","level":"warning","message":{"text":"doImport (cyclomatic 51): doImport has cyclomatic complexity 51 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 24 belong to 12 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c843d4ebc8586de1461502136444bee1af9071a7ef7e08e3315e41841534f27"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze-patterns.parseReport (cyclomatic 50): analyze-patterns.parseReport has cyclomatic complexity 50 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":954}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c4de3c6ecf5c6e0dee1f23e8d015bf63e8e44c145cf7d9d7ad9bb21f592359"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze-patterns.analyze (cyclomatic 49): analyze-patterns.analyze has cyclomatic complexity 49 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 16 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1281}}}],"partialFingerprints":{"codehealthFindingId/v1":"d70ad3a58b1e64e5e57e9a899d2718a858e8a7bad65fa3524f7f7e7336165f55"}},{"ruleId":"D1","level":"warning","message":{"text":"_engine.validateManifest (cyclomatic 49): _engine.validateManifest has cyclomatic complexity 49 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_engine.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"5de62eebb332ba3d4a692f15c40e29a413acda5b2e123e939f8325317f5c6dff"}},{"ruleId":"D1","level":"warning","message":{"text":"acquirePipelineLock (cyclomatic 49): acquirePipelineLock has cyclomatic complexity 49 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 14 belong to 2 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pipeline-lock.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"920617bc8f679ce1bcbeb15dcb1f588788b071e878b7307b883d7f11afadff5f"}},{"ruleId":"D1","level":"warning","message":{"text":"update-system.locallyModifiedSystemFiles (cyclomatic 48): update-system.locallyModifiedSystemFiles has cyclomatic complexity 48 (threshold 15). Of this number, 41 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1861}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c54b2df2106fe40e64d27fb0f0dae2ef7424a1ad9ecf6fd8b6f84feafd34fd7"}},{"ruleId":"D1","level":"warning","message":{"text":"aggregate-tokens.main (cyclomatic 47): aggregate-tokens.main has cyclomatic complexity 47 (threshold 15). Of this number, 46 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"batch/aggregate-tokens.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b94bdf3caf426b1633faba4fde95b8c9b509006d9d325ed3dde900770b9638"}},{"ruleId":"D1","level":"warning","message":{"text":"cv-ingest.CvIngest (cyclomatic 47): cv-ingest.CvIngest has cyclomatic complexity 47 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 31 belong to 8 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5058daa99d2b887b41bbcce02f804ee097f222e423c32ce89caa89aafa6c4283"}},{"ruleId":"D1","level":"warning","message":{"text":"followups-view.FollowupsView (cyclomatic 47): followups-view.FollowupsView has cyclomatic complexity 47 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 29 belong to 11 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"0473ceb696a91fd60128f34704da459691e3abdfe7cf0175f90e3a72cfc753b5"}},{"ruleId":"D1","level":"warning","message":{"text":"fold (cyclomatic 47): fold has cyclomatic complexity 47 (threshold 15). Of this number, 43 points are the body\u0027s own statements and 4 belong to 11 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c4c4229d80cd5381f4231fbcda324749945e8f1c9c4f050fac0e196c4fa79c5"}},{"ruleId":"D1","level":"warning","message":{"text":"checkUrlLiveness (cyclomatic 47): checkUrlLiveness has cyclomatic complexity 47 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 22 belong to 10 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-browser.mjs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc435c07bc9f2d04ca13799338217da6637f5efd09002555b8b7fde4c4549c8f"}},{"ruleId":"D1","level":"warning","message":{"text":"validate-portals.validatePortalsConfig (cyclomatic 46): validate-portals.validatePortalsConfig has cyclomatic complexity 46 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 18 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a104742b4060bbccac3a9e06c105f546328ba33cd898d0541d5db78c2d5599d"}},{"ruleId":"D1","level":"warning","message":{"text":"parseCompensation (cyclomatic 45): parseCompensation has cyclomatic complexity 45 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 19 belong to 6 function items inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ashby.mjs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"08c9b1b410c81ddbe2aee2f804aab357c5cb7c63cece0909a0d4aedfbad21585"}},{"ruleId":"D1","level":"warning","message":{"text":"computePortalRecommendations (cyclomatic 44): computePortalRecommendations has cyclomatic complexity 44 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 5 belong to 3 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd2c57a7b0382d5c1b13ebc5bca206a779eb0b9dbc083c3179909614f709c97"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 44): fetch has cyclomatic complexity 44 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/radancy.mjs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"27ee4bae5ec3d876f24f8bb27dbae37b7c8ed9e215e254296f94e0441e21757b"}},{"ruleId":"D1","level":"warning","message":{"text":"update-system.configuredTemplateVariantsFromProfileSource (cyclomatic 43): update-system.configuredTemplateVariantsFromProfileSource has cyclomatic complexity 43 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 25 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1331}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c5040fd068b8d75f97d084c2fb3e40bbc8bee3fb6c788475a8526b16e239081"}},{"ruleId":"D1","level":"warning","message":{"text":"generate-pdf.generatePDF (cyclomatic 42): generate-pdf.generatePDF has cyclomatic complexity 42 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1367}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7a1d7baf1e440592d218d28449ab8b377300870cb81819c848dd31b16dac36"}},{"ruleId":"D1","level":"warning","message":{"text":"export-ats-text.normalizeProfile (cyclomatic 42): export-ats-text.normalizeProfile has cyclomatic complexity 42 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"6798d519c116a577fbe5eb7f5f3b304ac6ef792f4977571f914b165152c46174"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 42): route.POST has cyclomatic complexity 42 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 19 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/cv/ingest/route.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e474d71723ccbddfe226c692e59f9dddb3c33ea84d23d131ab5da8f9facfeac"}},{"ruleId":"D1","level":"warning","message":{"text":"data.ComputeStatsMetrics (cyclomatic 42): data.ComputeStatsMetrics has cyclomatic complexity 42 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"df3d66a2ed33ab089ac46720f9710fa56e011e9ed5c0d302f4be9083b0117019"}},{"ruleId":"D1","level":"warning","message":{"text":"export-ats-text.parseCvMarkdown (cyclomatic 41): export-ats-text.parseCvMarkdown has cyclomatic complexity 41 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"2766d70128a3c999736b4d21fe1ff1e1570e3c4ce132b7fe7851493ae6d71874"}},{"ruleId":"D1","level":"warning","message":{"text":"diagnose.verifyFill (cyclomatic 41): diagnose.verifyFill has cyclomatic complexity 41 (threshold 15). Most of this is not in the body itself: 7 of the 41 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 218, 214, 219). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/diagnose.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"50adcdbddfeea7d557f4494493004b606496bf51d74888f89e8a8066d6a401b7"}},{"ruleId":"D1","level":"warning","message":{"text":"followup-cadence.extractContacts (cyclomatic 40): followup-cadence.extractContacts has cyclomatic complexity 40 (threshold 15). Most of this is not in the body itself: 11 of the 40 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 669, 735). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"deeb007f69ec8faced618784d78c536eb6bf48311ba0a493e43738eb7f253213"}},{"ruleId":"D1","level":"warning","message":{"text":"apply-view.ApplyView (cyclomatic 39): apply-view.ApplyView has cyclomatic complexity 39 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7bd062db77c07891d33d3f8c331052289e4ec6571c0d7af6c05f2c07d1812a9"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 39): fetch has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/peoplesoft.mjs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"81bc450b179081af4b2f4c09ac496564b8aabe5f823229129d4fbb5ceb378526"}},{"ruleId":"D1","level":"warning","message":{"text":"reply-matcher.matchCandidates (cyclomatic 38): reply-matcher.matchCandidates has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65c7ce162d34d18afc751747477e00ed74f557f30da3c1caba714f68f11aab7"}},{"ruleId":"D1","level":"warning","message":{"text":"reply-matcher.classifyReply (cyclomatic 38): reply-matcher.classifyReply has cyclomatic complexity 38 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc9f890e2570f075326ff20751fba855929bb24e5da67201cbc34addcb381c61"}},{"ruleId":"D1","level":"warning","message":{"text":"discover-ats.resolveCompany (cyclomatic 38): discover-ats.resolveCompany has cyclomatic complexity 38 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffbb40107ac1c3278a951c1fd2b09c4a387bf33f2f509939cff86612f937bdb4"}},{"ruleId":"D1","level":"warning","message":{"text":"job-store.JobsProvider (cyclomatic 38): job-store.JobsProvider has cyclomatic complexity 38 (threshold 15). Most of this is not in the body itself: 1 of the 38 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 114, 142, 65, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/job-store.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41d87b964c0fb1ccefb11266c2992be9d4c4e18bcd32545fd83a8e76256d184"}},{"ruleId":"D1","level":"warning","message":{"text":"audit-portals.main (cyclomatic 37): audit-portals.main has cyclomatic complexity 37 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c8c37d5b648821116cb82b2def5ebe456aaf8ae873edcb2bd9afd4279521f2b"}},{"ruleId":"D1","level":"warning","message":{"text":"contact-extract.main (cyclomatic 37): contact-extract.main has cyclomatic complexity 37 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contact-extract.mjs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e8fa1473279d0bf3e5f9686d86419de6b4a90b2d982d39eb74d57e5cb8149b"}},{"ruleId":"D1","level":"warning","message":{"text":"update-system.checkMainChannel (cyclomatic 36): update-system.checkMainChannel has cyclomatic complexity 36 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":2929}}}],"partialFingerprints":{"codehealthFindingId/v1":"20365628c6d9c3f724bc6e86d54d339fff111584074cf4c04b6f447c0f598dbf"}},{"ruleId":"D1","level":"warning","message":{"text":"drive.driveSession (cyclomatic 36): drive.driveSession has cyclomatic complexity 36 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/drive.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d494ef9958c27c02c5ca68c7c240ae54dd9bae56a94dfd54772ea548eadced"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.runScanner (cyclomatic 36): scan.runScanner has cyclomatic complexity 36 (threshold 15). Most of this is not in the body itself: 1 of the 36 points is its own statement and the rest belongs to 10 function literals inside it that branch (lines 283, 363, 196, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/scan.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"dffb1ccde8f26ae6cd7c819e25aa83cb8ad178db5e6916c0c39eda427af920ef"}},{"ruleId":"D1","level":"warning","message":{"text":"appModel.Update (cyclomatic 36): appModel.Update has cyclomatic complexity 36 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/main.go"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"768486a7afb563f75471b4b33bc9af80f2e5954e7f7f5b0919adec2cd4499b47"}},{"ruleId":"D1","level":"warning","message":{"text":"company-history.buildCompanyCards (cyclomatic 35): company-history.buildCompanyCards has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"60a5487086db9f245c18c97cc9adf2de1a55dd92f3c99dc1754a1d746e383ded"}},{"ruleId":"D1","level":"warning","message":{"text":"reply-watch.main (cyclomatic 35): reply-watch.main has cyclomatic complexity 35 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 19 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-watch.mjs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"39955b256a146804097a71312fa526f85b070c278d55153ecde3b29cadf242d4"}},{"ruleId":"D1","level":"warning","message":{"text":"scan-dayforce.main (cyclomatic 35): scan-dayforce.main has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-dayforce.mjs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a82408deba30944eea0ae8758fbb0252fb492a1534bafc417125f4a3267920e"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 35): route.POST has cyclomatic complexity 35 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 19 belong to 8 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/assistant/route.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1280228be28a368cadf7c7a5520bccf42bade27dd9cba8feb1cfbb1071a672e"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 35): fetch has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cba1e7f0a5d7d05de7dacd682429650e7852d408f29caaf091bce1dac760591"}},{"ruleId":"D1","level":"warning","message":{"text":"build-cv-latex.main (cyclomatic 34): build-cv-latex.main has cyclomatic complexity 34 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-latex.mjs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"40bf83b6e904a6fa501f204c027edc518474565ea6a772f508662b586711e04f"}},{"ruleId":"D1","level":"warning","message":{"text":"wttj.normalizeWttjHit (cyclomatic 34): wttj.normalizeWttjHit has cyclomatic complexity 34 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/wttj.mjs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a8287e712bae83ae9baf9bd766b91411e7da68c045b56c3d42cd322d7dce8b5"}},{"ruleId":"D1","level":"warning","message":{"text":"createCachedLookup (cyclomatic 34): createCachedLookup has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 9 of the 34 points are its own statements and the rest belongs to 8 function items inside it that branch (cachedLookup, cachedLookup::resolve::(anonymous), guarded::(anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_dns-cache.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5375243cbc358efc1985198b5459445807916953273e5f0a824b2fcc26ef5b"}},{"ruleId":"D1","level":"warning","message":{"text":"pipeline-view.PipelineView (cyclomatic 33): pipeline-view.PipelineView has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 11 of the 33 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 95, 70, 84, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/pipeline-view.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ab419abf10ef2d2751364a5bcf8462a23500084884b3a703cc51e4cd3b6401"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 33): fetch has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f4b360abe181413ebeee5d9ff3f0e105c8082a28e59fcd8b49e6415cf9d95a2"}},{"ruleId":"D1","level":"warning","message":{"text":"normalizeProfile (cyclomatic 33): normalizeProfile has cyclomatic complexity 33 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"e576ebeab43886a1ae1054d0b6065d020852c77236f6c08affff95266f3ffec4"}},{"ruleId":"D1","level":"warning","message":{"text":"tracker-utils.acquireTrackerLock (cyclomatic 32): tracker-utils.acquireTrackerLock has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-utils.mjs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"b24490261cb1c9dc5e9307157447c2df6e98d63ff5c345079c1ce37ec3de1bd4"}},{"ruleId":"D1","level":"warning","message":{"text":"discover-ats.parseCompanyInput (cyclomatic 32): discover-ats.parseCompanyInput has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 14 of the 32 points are its own statements and the rest belongs to one function literal inside it that branches (line 186). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ab66f9d09941a92eb03a0c438c738b8f6ddf8ca8370ce6662f7836dd35483dd"}},{"ruleId":"D1","level":"warning","message":{"text":"verify-ats.auditAts (cyclomatic 32): verify-ats.auditAts has cyclomatic complexity 32 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-ats.mjs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d1bcdb69a7c324233a29e5ae2bd3071f6624a540d9efb573adefaecd74599de"}},{"ruleId":"D1","level":"warning","message":{"text":"session.fillSession (cyclomatic 32): session.fillSession has cyclomatic complexity 32 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"95847bd4efb862e82008096ef3f45919e961a7da0a722d3840a0d1afa640b7e9"}},{"ruleId":"D1","level":"warning","message":{"text":"extract-json-object.extractJsonObject (cyclomatic 32): extract-json-object.extractJsonObject has cyclomatic complexity 32 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/extract-json-object.mjs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd7eee534f17c865d5f22781f88ca64f607f9250b9dcda198931214d57c4cb42"}},{"ruleId":"D1","level":"warning","message":{"text":"data.deriveNoteFields (cyclomatic 32): data.deriveNoteFields has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/derive.go"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"72e2c87c0ea3fb3b65f4d6ed7e981d50f9e7d01a7e0ce4e66215a0684b66b40b"}},{"ruleId":"D1","level":"warning","message":{"text":"data.CanonicalizeLocation (cyclomatic 32): data.CanonicalizeLocation has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"8931fedf7a2359b2c1ab0500302cf5750bae91aede72ca4428156e06a03550b2"}},{"ruleId":"D1","level":"warning","message":{"text":"printSummary (cyclomatic 32): printSummary has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1585}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9ebdbd40816ee3b22d073673f451ea370a899e08924545710ebae7b562ba57"}},{"ruleId":"D1","level":"warning","message":{"text":"extractContacts::add (cyclomatic 32): extractContacts::add has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d73024c8143e33e7cd3b689f2c403316e806e8906df4db6750d2b5852484d29"}},{"ruleId":"D1","level":"warning","message":{"text":"parseCv (cyclomatic 32): parseCv has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 12 of the 32 points are its own statements and the rest belongs to 4 function items inside it that branch ((anonymous), addFact, (anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eaecccc5ac0b549ac72ad15aa5ce3909e7bb5ffc3cc77a4d9d211c5ede39c6f"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 32): fetch has cyclomatic complexity 32 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 12 belong to 6 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/vdab.mjs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a01737052944c50b687caadb6dea73849e21e6cdcdd1f374d6946a0947b397"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 32): fetch has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/getro.mjs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a12c7ef20c6fd7f8d435f9d33fca056150ebd544d3f76214e317b87a7afec88"}},{"ruleId":"D1","level":"warning","message":{"text":"career-profile.validateProfile (cyclomatic 31): career-profile.validateProfile has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 12 of the 31 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 155, 172). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc46cf7b898f86431625fba59ca84138c90634ab19a63d53544003c422441853"}},{"ruleId":"D1","level":"warning","message":{"text":"runBatchFromManifest (cyclomatic 31): runBatchFromManifest has cyclomatic complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1633}}}],"partialFingerprints":{"codehealthFindingId/v1":"7853195292994624767a4f7c4232c40a482da2399549067bbac3cdf7a422ecd3"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 31): fetch has cyclomatic complexity 31 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 4 belong to 5 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/arbeitsagentur.mjs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa7b037de29c8dde80bedb3e1a70f136d39472b3d97c68add6cc0576e76d5572"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 31): fetch has cyclomatic complexity 31 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/occ.mjs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d2d23698e3e6f9944717b17c2e0e6918e977e5c4f3f88ff82b71fb697b87172"}},{"ruleId":"D1","level":"warning","message":{"text":"cv-payload-schema.validatePayload (cyclomatic 30): cv-payload-schema.validatePayload has cyclomatic complexity 30 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cv-payload-schema.mjs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6e0138cffa8638aaa293a300f3d45bd0cff1748781cc753c345ca8136bdc508"}},{"ruleId":"D1","level":"warning","message":{"text":"session.openSession (cyclomatic 30): session.openSession has cyclomatic complexity 30 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"17f7648bbb5e175baac64b4431c5053e437b78dcec738b56cb39279938031f1f"}},{"ruleId":"D1","level":"warning","message":{"text":"buildSalaryFilter (cyclomatic 30): buildSalaryFilter has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 13 of the 30 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 969, 950, 959, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":949}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec82e7bd5cd061cbdb8a4978bbe4527df6335715569ba463a22118007a706f53"}},{"ruleId":"D1","level":"warning","message":{"text":"parseMarkdownRows (cyclomatic 30): parseMarkdownRows has cyclomatic complexity 30 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 2 belong to 6 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf3cf717a53a295254e9ad464e62209753d5ad274b3e4db4618a73d53f51c5e"}},{"ruleId":"D1","level":"warning","message":{"text":"computePortalStats (cyclomatic 30): computePortalStats has cyclomatic complexity 30 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6effc7262d2dd2e72dc1c9682b4a53525059481748658af42f52e46aa9d430b"}},{"ruleId":"D1","level":"warning","message":{"text":"cmdRun (cyclomatic 30): cmdRun has cyclomatic complexity 30 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 3 belong to 7 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins.mjs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"f834e8a65948dbd311c6a33ca84a36a09423ff277f3876c000b3e28dd64a3f28"}},{"ruleId":"D1","level":"warning","message":{"text":"layoutSankey (cyclomatic 30): layoutSankey has cyclomatic complexity 30 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 7 belong to 13 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/pipeline-sankey.mjs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"be6d73fb741921e3fc87b44ac6194fb75586c3b22506b3a8e34ce14e5924af84"}},{"ruleId":"D1","level":"warning","message":{"text":"check-liveness.main (cyclomatic 29): check-liveness.main has cyclomatic complexity 29 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-liveness.mjs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"217a972a5304b15d355a9f27fde5e4194a471d2455dee9d1b93677598926c9b6"}},{"ruleId":"D1","level":"warning","message":{"text":"rejection-latency.computeRejectionLatency (cyclomatic 29): rejection-latency.computeRejectionLatency has cyclomatic complexity 29 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rejection-latency.mjs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6bb2895076c48d64e190ebdcee2a61bde36b306e4330c9a1452946a0004dc1"}},{"ruleId":"D1","level":"warning","message":{"text":"report-view.ReportView (cyclomatic 29): report-view.ReportView has cyclomatic complexity 29 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 11 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/report-view.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"80861c67a09f6f2c6c5337f6e9e7bbabe1bd3d8aa9ec99f230dc04d7ed22b833"}},{"ruleId":"D1","level":"warning","message":{"text":"computeResponsiveness (cyclomatic 29): computeResponsiveness has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"9337e9e32f18008d45b1ff6722563bcdb262a72521d5a72096ffc1c2aedce1af"}},{"ruleId":"D1","level":"warning","message":{"text":"api.requestJson (cyclomatic 28): api.requestJson has cyclomatic complexity 28 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 13 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"c132e3e6a6c853b83be94b86244d284fa42dce52f9d5635228fd2411f6879954"}},{"ruleId":"D1","level":"warning","message":{"text":"salary-gap.printSummary (cyclomatic 28): salary-gap.printSummary has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aa921a9030caf0209d39bf9a973cd6e3c36d5ec9e7b9b050506386161f6da05"}},{"ruleId":"D1","level":"warning","message":{"text":"vc-portfolios.parseA16zPayload (cyclomatic 28): vc-portfolios.parseA16zPayload has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"seeds/vc-portfolios.mjs"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f460b1a455f0844a2b21aa97792f41ad4247eb9b5a1a028669f4faa712d278"}},{"ruleId":"D1","level":"warning","message":{"text":"scan-interamt.main (cyclomatic 28): scan-interamt.main has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-interamt.mjs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"d33fc7f4dd2fca8f7c9de71fad530a62321b15e28a8133e829dd107d029e69a9"}},{"ruleId":"D1","level":"warning","message":{"text":"apply-view.FieldRow (cyclomatic 28): apply-view.FieldRow has cyclomatic complexity 28 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d5009b4205f4ba0f2e24269d17b955bf66f1bef4a47fe1c1a67d1f7361f36e"}},{"ruleId":"D1","level":"warning","message":{"text":"first-score-view.FirstScoreView (cyclomatic 28): first-score-view.FirstScoreView has cyclomatic complexity 28 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 13 belong to 5 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/first-score-view.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f33dca4724b0776306a16ed50a61aea5f7bd48eb42fbf794ac385fe3b3c5d93"}},{"ruleId":"D1","level":"warning","message":{"text":"agent-interpret.captureCandidates (cyclomatic 28): agent-interpret.captureCandidates has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 1 of the 28 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 28, 54, 29). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/agent-interpret.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"75333c59243004e89c0ade5f74fa26027f10a8d01cd63feafc637c6310e4b1c8"}},{"ruleId":"D1","level":"warning","message":{"text":"renderSummary (cyclomatic 28): renderSummary has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a24d8de1fcf4df56e812e68998388ac4f2975a32bdf6a6e86a41b407adac6b"}},{"ruleId":"D1","level":"warning","message":{"text":"discover-ats.runSelfTest (cyclomatic 27): discover-ats.runSelfTest has cyclomatic complexity 27 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":826}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27678b6df62a1e2306b2e653fe421022c49439506e1f0408262e91184395f83"}},{"ruleId":"D1","level":"warning","message":{"text":"_registry.validateRegistryEntry (cyclomatic 27): _registry.validateRegistryEntry has cyclomatic complexity 27 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_registry.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0104d2066891c8bd4170073f73507aae43fe5311e745127823c6000bd5f6e9a"}},{"ruleId":"D1","level":"warning","message":{"text":"data.ParseApplications (cyclomatic 27): data.ParseApplications has cyclomatic complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0f1ae4ad32f03596a74e2d8f692251108690d503eab6ca753948affde6ca752"}},{"ruleId":"D1","level":"warning","message":{"text":"data.UpdateApplicationStatusAndNotes (cyclomatic 27): data.UpdateApplicationStatusAndNotes has cyclomatic complexity 27 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbd71081bdcff5d06d5f4b41429b337d5852b270eb4845d438ac49981f086f4"}},{"ruleId":"D1","level":"warning","message":{"text":"callOpenRouter (cyclomatic 27): callOpenRouter has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"6889a3ef4698877b4884606b22c8a7d58df8c40405c27054285368322055142b"}},{"ruleId":"D1","level":"warning","message":{"text":"roleFuzzyMatch (cyclomatic 27): roleFuzzyMatch has cyclomatic complexity 27 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"role-matcher.mjs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9eabe0e802f254942620f6fe6bf6cfedb6e713df61d739937e2bf2e5d733aa"}},{"ruleId":"D1","level":"warning","message":{"text":"acquirePortalHealthLock (cyclomatic 27): acquirePortalHealthLock has cyclomatic complexity 27 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 6 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"portal-health-lock.mjs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9d809e8dc90feee6610083aedc44dfaba95c86a4c57d435832088276c82dd8"}},{"ruleId":"D1","level":"warning","message":{"text":"company-funded.buildCandidates (cyclomatic 26): company-funded.buildCandidates has cyclomatic complexity 26 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"311b603e466bc2c4a9587b426a204ffb285f6ba5140acbb473ac3bcc84254dcc"}},{"ruleId":"D1","level":"warning","message":{"text":"worker-card.WorkerCard (cyclomatic 26): worker-card.WorkerCard has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/worker-card.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e17b33cb4453608173952d6bd23b19deb3e439f5a919b1a6c41db2d07421675"}},{"ruleId":"D1","level":"warning","message":{"text":"renderInPage (cyclomatic 26): renderInPage has cyclomatic complexity 26 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 3 belong to 5 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1930}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d8b72be0f6f7f7379fd8f2568781610970a7cf5fb6f8f3d99bb13a30457c78f"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch::runQuery (cyclomatic 26): fetch::runQuery has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8b15f17a736c98f9efafaf37d4f308815009961cab1fe1870623e149746e91e"}},{"ruleId":"D1","level":"warning","message":{"text":"scanBoard (cyclomatic 26): scanBoard has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-dayforce.mjs"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d8db250f320cd7f31366a77e934ca174455f69a186f7f4450772da8bdb6515"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 26): fetch has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad4fa8f5967d9de16e7fc9db912338ccd14acd66c8151c6ccbcba13cf8e44c96"}},{"ruleId":"D1","level":"warning","message":{"text":"funnel-velocity.selfTest (cyclomatic 25): funnel-velocity.selfTest has cyclomatic complexity 25 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"b383abe15dddca3194945bb24ab81e00fbdf10b591ccf4a056a3a7b71451943e"}},{"ruleId":"D1","level":"warning","message":{"text":"contact-extract.appendContact (cyclomatic 25): contact-extract.appendContact has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 2 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 153, 169, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contact-extract.mjs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ceaba9e655cfe39b8980a21d83bb11fcab8c2dd83cdc3ede2cce1d805085751"}},{"ruleId":"D1","level":"warning","message":{"text":"ashby.formatLocation (cyclomatic 25): ashby.formatLocation has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ashby.mjs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ecfc0b95b315e0e3b11615d86440aa9775d6ab01e62cc9965faecf53c0e996"}},{"ruleId":"D1","level":"warning","message":{"text":"verify-cv-facts.runCli (cyclomatic 25): verify-cv-facts.runCli has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":1385}}}],"partialFingerprints":{"codehealthFindingId/v1":"9680e39085b3a5a95ea4ac96b728c3bfe1dcc29a744a4c8612499d12d8416d10"}},{"ruleId":"D1","level":"warning","message":{"text":"hired-share.main (cyclomatic 25): hired-share.main has cyclomatic complexity 25 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"hired-share.mjs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"94503242c6bef52ed1add19ea756a8829fa111de815d5d257bf4896887cbe411"}},{"ruleId":"D1","level":"warning","message":{"text":"intake.listSourceFiles (cyclomatic 25): intake.listSourceFiles has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 2 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 212, 200, 219, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23f986f4c8d768f1a14c3357f3cff0e27d73721eca1518fa1fc626f44ec1379"}},{"ruleId":"D1","level":"warning","message":{"text":"remotli.normalizeRemotliJob (cyclomatic 25): remotli.normalizeRemotliJob has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/remotli.mjs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"23ea1c6a348a28ae0aef1407d8d192a9e7e79783b2e43f209e4ee11321cbe6a9"}},{"ruleId":"D1","level":"warning","message":{"text":"config-form.ConfigForm (cyclomatic 25): config-form.ConfigForm has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 11 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 48, 160, 78, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"421e6aae0be40594d0914c5d5363a918a55d0f016d05be49f36f81192e8241ff"}},{"ruleId":"D1","level":"warning","message":{"text":"discovery-card.DiscoveryCard (cyclomatic 25): discovery-card.DiscoveryCard has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/discovery-card.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5f7567f4bebf3971514444ac3677a9d51984c21f7e073967a97d76a84c14d1d"}},{"ruleId":"D1","level":"warning","message":{"text":"agent-interpret.interpretFormWithAgent (cyclomatic 25): agent-interpret.interpretFormWithAgent has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 162, 179, 161, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/agent-interpret.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"6370b633c075ff2aa5b2fd0476551b569ef1a71068983f646b8b53b419248acc"}},{"ruleId":"D1","level":"warning","message":{"text":"clauseBounds (cyclomatic 25): clauseBounds has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 8 of the 25 points are its own statements and the rest belongs to 2 function items inside it that branch (isBoundary, isSentenceEnd). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"29098dd35edb6c2685c35bbaac34d9e08fa9cb20dd724819dca4c38a3b0345a0"}},{"ruleId":"D1","level":"warning","message":{"text":"main (cyclomatic 25): main has cyclomatic complexity 25 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 1 belongs to 4 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rank-pipeline.mjs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"988f44ca1983ad8ad23f2a883eacf64f41f09e105016bfa0fca5fde100c60263"}},{"ruleId":"D1","level":"warning","message":{"text":"findCrossListings (cyclomatic 25): findCrossListings has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fingerprint-core.mjs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa8713c451b19d96178a48937cf70d904baf3bca0aadb368808c91938c4a9784"}},{"ruleId":"D1","level":"warning","message":{"text":"browser-extract.readDom (cyclomatic 24): browser-extract.readDom has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 1 of the 24 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 730, 744, 750, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"browser-extract.mjs"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31646a6f63bd9bfe0aed9c9b9698d9231e129be4b87890057ccc6f4ff7e2e3d"}},{"ruleId":"D1","level":"warning","message":{"text":"stats.printSummary (cyclomatic 24): stats.printSummary has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":724}}}],"partialFingerprints":{"codehealthFindingId/v1":"041cff5a4cebe5a000a3691f4eaab1d06490a62aad74fb4692fa261934b7af7f"}},{"ruleId":"D1","level":"warning","message":{"text":"smartrecruiters.parseSmartRecruitersResponse (cyclomatic 24): smartrecruiters.parseSmartRecruitersResponse has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 2 of the 24 points are its own statements and the rest belongs to one function literal inside it that branches (line 197). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/smartrecruiters.mjs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f09656f2da9f8a015ed5567ec5dedc5d1befef9f0a51b5f787a5df26ade75e0"}},{"ruleId":"D1","level":"warning","message":{"text":"linkedin-join.renderSummary (cyclomatic 24): linkedin-join.renderSummary has cyclomatic complexity 24 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"345842c4bd529414d9c48a63aaf2046a01bd8bcc2de94fa732fb813e032e9c1c"}},{"ruleId":"D1","level":"warning","message":{"text":"4dayweek.normalize4dwJob (cyclomatic 24): 4dayweek.normalize4dwJob has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/4dayweek.mjs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0f11ef1f3271f6b8758cb2a64e15d5ed85d98acf04ee7fe93f02ce070721c3"}},{"ruleId":"D1","level":"warning","message":{"text":"prevueaps.parsePrevueapsResponse (cyclomatic 24): prevueaps.parsePrevueapsResponse has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/prevueaps.mjs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"62f725339beae4680533851c1a50c3c69606a4a00bf96687f095d0f11136fe68"}},{"ruleId":"D1","level":"warning","message":{"text":"run-cli-support.parseCodexEvent (cyclomatic 24): run-cli-support.parseCodexEvent has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/run-cli-support.mjs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"591a0f6dc0840ad2c386d901a9555f22caaeb87b8ebee281b7f8fd8ed167309c"}},{"ruleId":"D1","level":"warning","message":{"text":"run-cli-support.parseClaudeEvent (cyclomatic 24): run-cli-support.parseClaudeEvent has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/run-cli-support.mjs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"c72b2e7954b5f2b862ca3cffea52c042aa25a26ddd6fd8114e1321c5b188dfcc"}},{"ruleId":"D1","level":"warning","message":{"text":"weekly-digest.runSelfTest (cyclomatic 24): weekly-digest.runSelfTest has cyclomatic complexity 24 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"a771d3ad42da6945f34f6e8feeedcba94ea919ca0992356155bd89a0cb8b3d58"}},{"ruleId":"D1","level":"warning","message":{"text":"ViewerModel.styleLine (cyclomatic 24): ViewerModel.styleLine has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccae93388245896a38b9d7187d67c7210054d32e8a9be514a7ce0eedfe876f7f"}},{"ruleId":"D1","level":"warning","message":{"text":"collectSeenCompanyRoles (cyclomatic 24): collectSeenCompanyRoles has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 10 of the 24 points are its own statements and the rest belongs to one function item inside it that branches (add). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a994e834ceaddf3fa933793dd5a98926e230c4236b9e9015974df875d17d303"}},{"ruleId":"D1","level":"warning","message":{"text":"configuredTemplateVariantsFromProfileSource::parseScalar (cyclomatic 24): configuredTemplateVariantsFromProfileSource::parseScalar has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1335}}}],"partialFingerprints":{"codehealthFindingId/v1":"9640f4c53127f8d0eea550a1db4479b197033a72c81c855edc1c9c159bd60f60"}},{"ruleId":"D1","level":"warning","message":{"text":"writeVcf (cyclomatic 24): writeVcf has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ac98dc4679b102599ca3746f01487aaf189f9def964ca1c66eea85e92d807d"}},{"ruleId":"D1","level":"warning","message":{"text":"parseCliArgs (cyclomatic 24): parseCliArgs has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"archive-posting.mjs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7388f72d3d41c55a12e76042b7890771881126bcdc71dad3ecc33c4548e372"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 24): fetch has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/taleo.mjs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fe154cc2e24bafa711e9248037a783897be963a7309279eac1ceb58594a6cfa"}},{"ruleId":"D1","level":"warning","message":{"text":"build-cv-html.buildProjects (cyclomatic 23): build-cv-html.buildProjects has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 4 of the 23 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 425, 399). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90f7a7c9d4827d76a277e17b0f9ddeba0e9af96228d2eed1afeec8cd11f9bb7"}},{"ruleId":"D1","level":"warning","message":{"text":"check-jd-archive.checkJdArchive (cyclomatic 23): check-jd-archive.checkJdArchive has cyclomatic complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe611505c73b3381f5b9ebf241c95d30c3734cf58666b2c51af5102d0e24a744"}},{"ruleId":"D1","level":"warning","message":{"text":"company-funded.fetchHnDiscovery (cyclomatic 23): company-funded.fetchHnDiscovery has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e159ff8ae5515ff94d73c5dfdb4ae9c98ff07b3a69403c40fba3804b19f27e"}},{"ruleId":"D1","level":"warning","message":{"text":"company-history.parseArgs (cyclomatic 23): company-history.parseArgs has cyclomatic complexity 23 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"c07ecd3f43fe3172d6a2ba4a0f21d116937f9fedfd8da71ff6ec2a5aecf55f09"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.verifyOffers (cyclomatic 23): scan.verifyOffers has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":3112}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ca8152559aab2e836bb54952325c05b0eb051d78889b39d69f11f99d70437e"}},{"ruleId":"D1","level":"warning","message":{"text":"linkedin-join.main (cyclomatic 23): linkedin-join.main has cyclomatic complexity 23 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"7098f242dc2b0136ca6347593a6e1659f67a5b8b3e063213e160a71524a53a8f"}},{"ruleId":"D1","level":"warning","message":{"text":"tier.classifyTier (cyclomatic 23): tier.classifyTier has cyclomatic complexity 23 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/tier.mjs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e17079d64bd7848d0c262256848f115255be600a0bfc63aab90a2013a25b0d1"}},{"ruleId":"D1","level":"warning","message":{"text":"getonbrd.normalizeGetonbrdJob (cyclomatic 23): getonbrd.normalizeGetonbrdJob has cyclomatic complexity 23 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/getonbrd.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b78a943c98295bb4491e028844f8ea894bd41fe24d902446bfed139b28e1e8db"}},{"ruleId":"D1","level":"warning","message":{"text":"torre.normalizeTorreOpportunity (cyclomatic 23): torre.normalizeTorreOpportunity has cyclomatic complexity 23 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/torre.mjs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"08ffe1e4080519426b2b04e0f157a40a80f5fc92a42a8851b7e2edcf9de5f92b"}},{"ruleId":"D1","level":"warning","message":{"text":"today-dashboard.TodayDashboard (cyclomatic 23): today-dashboard.TodayDashboard has cyclomatic complexity 23 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/home/today-dashboard.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c3f8c9c1a110be1d77c2a2d2740b23fafe025497ef01a22a659638643a4cfd"}},{"ruleId":"D1","level":"warning","message":{"text":"data.ComputeProgressMetrics (cyclomatic 23): data.ComputeProgressMetrics has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":990}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c7223c804165ff5028b0ec75c9148fe779c8cd5e849345550009f3c1a679812"}},{"ruleId":"D1","level":"warning","message":{"text":"fuzzyTierMatch (cyclomatic 23): fuzzyTierMatch has cyclomatic complexity 23 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":1619}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0bea57ebea51bb65c9d19a3fae5dc62093918c512da32bbb0416c06863dd483"}},{"ruleId":"D1","level":"warning","message":{"text":"analyzeFromContent (cyclomatic 23): analyzeFromContent has cyclomatic complexity 23 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 4 belong to 9 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":829}}}],"partialFingerprints":{"codehealthFindingId/v1":"887b17e250c666d32902e062cfdf3c78983ae4b1dfb46d5cf1fdf60310e2b238"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 23): fetch has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/mokahr.mjs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"1596895022e1abe92cdc0cd1e8ae6ed4872c15dde609448e404852cadd97c49d"}},{"ruleId":"D1","level":"warning","message":{"text":"application-answers.main (cyclomatic 22): application-answers.main has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"application-answers.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3a5a9a5ba281f12d376981d5451279cb69fa2ef5535408ebcf4c7d0065ff35"}},{"ruleId":"D1","level":"warning","message":{"text":"company-funded.parseArgs (cyclomatic 22): company-funded.parseArgs has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"86ac404b501d1b954208707c4fb5266c4e7083ea0e1eedf8c4013147aff7b983"}},{"ruleId":"D1","level":"warning","message":{"text":"_net.isBlockedV4 (cyclomatic 22): _net.isBlockedV4 has cyclomatic complexity 22 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_net.mjs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f6a4495acd7d674d37ea6eb59f5914f96ea14796103a8aff5d0596b65e85c34"}},{"ruleId":"D1","level":"warning","message":{"text":"jsonc-parse.stripJsoncSyntax (cyclomatic 22): jsonc-parse.stripJsoncSyntax has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jsonc-parse.mjs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"001b17a0ebdffa72e35c844b9fa62894ff99eabc6a539ec401feae5e0aeaac8e"}},{"ruleId":"D1","level":"warning","message":{"text":"linkedin-join.joinConnections (cyclomatic 22): linkedin-join.joinConnections has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 9 of the 22 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 572, 567, 523, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"7edca9f86438848eb545aee7f24715331dd40525c0760cf66974b71c019674d7"}},{"ruleId":"D1","level":"warning","message":{"text":"echojobs.normalizeEchojobsJob (cyclomatic 22): echojobs.normalizeEchojobsJob has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/echojobs.mjs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7c36600b8d2817c54e5651b7bd32b71454bdecc1ee6c39e8a1f951585d2c5ac"}},{"ruleId":"D1","level":"warning","message":{"text":"successfactors.fetchCsb (cyclomatic 22): successfactors.fetchCsb has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/successfactors.mjs"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbcd427a63405dcffc54bf7a2ba9a89afb2185d7a91d941eb72cd52cc9b164e0"}},{"ruleId":"D1","level":"warning","message":{"text":"ultipro.parseListPage (cyclomatic 22): ultipro.parseListPage has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"8da0e0e6aafb0375d88901fae309d5aa75e799bc1408919e64773457b4a705a5"}},{"ruleId":"D1","level":"warning","message":{"text":"results-list.ResultsList (cyclomatic 22): results-list.ResultsList has cyclomatic complexity 22 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/results-list.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"69faa0b60b89c627099a6b429e05ab894eb80d1fa05e68f339326fef799b25e9"}},{"ruleId":"D1","level":"warning","message":{"text":"data.acquireTrackerLock (cyclomatic 22): data.acquireTrackerLock has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/tracker_lock.go"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"2afb364f65d9074325d79492138b53c74443d4bae23f391118e4d07948094694"}},{"ruleId":"D1","level":"warning","message":{"text":"seedBackfill (cyclomatic 22): seedBackfill has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"c247bf6f605ec6dbe4f7a5817ee382055c5fd813e6f0da8d38763df21cfa10ff"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 22): fetch has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/builtin.mjs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f3498bd9dc676c371f0fe1fee0916abdc9c9706fd2b211e0bb922bd7ec0750"}},{"ruleId":"D1","level":"warning","message":{"text":"computeCalibration (cyclomatic 22): computeCalibration has cyclomatic complexity 22 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 3 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"calibrate.mjs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"03de46d328dc218aa2fc7dd0f0b3a6870a96fee77048c1dacc41cbc5220fe22f"}},{"ruleId":"D1","level":"warning","message":{"text":"buildSvg (cyclomatic 22): buildSvg has cyclomatic complexity 22 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 3 belong to 3 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"hired-wall-build.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"863c0fe4b14388a0bbe46ded05e288dfc7d1d4700a3e27570f979fe1f4a47c98"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 22): fetch has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobbankca.mjs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"97fd8d83f13591008a4688184899be01231b41d1e4b1621af8a14fa3bc00f428"}},{"ruleId":"D1","level":"warning","message":{"text":"parseEightfoldResponse (cyclomatic 22): parseEightfoldResponse has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/eightfold.mjs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac82db44d8d0a7a3858945c548b3361bf97e26bf27efaaf2c72bcf1e173bf6e"}},{"ruleId":"D1","level":"warning","message":{"text":"analyze-patterns.buildPatternSignals (cyclomatic 21): analyze-patterns.buildPatternSignals has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1206}}}],"partialFingerprints":{"codehealthFindingId/v1":"9933d6daf157ac2012306597ec6f668e982b0ba6d499fe5bab088d69bf157678"}},{"ruleId":"D1","level":"warning","message":{"text":"invite-match.runSelfTest (cyclomatic 21): invite-match.runSelfTest has cyclomatic complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invite-match.mjs"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6fb3071cdeddc1ff3437f4e9e874e889d29f339754dec71ef790166a56b7d6"}},{"ruleId":"D1","level":"warning","message":{"text":"detect-reposts.detectReposts (cyclomatic 21): detect-reposts.detectReposts has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 10 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 316, 352). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"detect-reposts.mjs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f1c22f372396ec033f0b9ff814769b6f6f7e908c7aade6f63b249513cfe3df1"}},{"ruleId":"D1","level":"warning","message":{"text":"company-history.runSelfTest (cyclomatic 21): company-history.runSelfTest has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd8b43803cb7c5a2e5052b36e674b98a2dab069f7ec8a19a29723e78dd553e1"}},{"ruleId":"D1","level":"warning","message":{"text":"recruitee.assembleLocation (cyclomatic 21): recruitee.assembleLocation has cyclomatic complexity 21 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/recruitee.mjs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"443fa7c355f909ba71c8c2d1c72bc7bb4dace48064af6a3ac33e947a56b88a16"}},{"ruleId":"D1","level":"warning","message":{"text":"discover-ats.main (cyclomatic 21): discover-ats.main has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":1060}}}],"partialFingerprints":{"codehealthFindingId/v1":"4702882e2f499c8d9c84d3ed3b13a90561b67e144e7dd03d0d86b7e31ca14ab7"}},{"ruleId":"D1","level":"warning","message":{"text":"landingjobs.normalizeLandingJob (cyclomatic 21): landingjobs.normalizeLandingJob has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/landingjobs.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be0c3add820c9fd0de24c67ece39d2b2bbb90dc135372818200a3b536d69293"}},{"ruleId":"D1","level":"warning","message":{"text":"peoplesoft.parseFormState (cyclomatic 21): peoplesoft.parseFormState has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/peoplesoft.mjs"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7ce52f0813d91bec9ba690d057408b2b5cde45d8d3b30396d0d3fdffb7a977"}},{"ruleId":"D1","level":"warning","message":{"text":"thehub.normalizeHubJob (cyclomatic 21): thehub.normalizeHubJob has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/thehub.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a261dd948704393b2fde81eca731b7412a1f677fc51587a8253225dde23e30ff"}},{"ruleId":"D1","level":"warning","message":{"text":"scan-ats-full.runSeedScan (cyclomatic 21): scan-ats-full.runSeedScan has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 5 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 662, 654). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ec205845845eb836c36fa153e19203f0c8b24eb40d36f284df59dfd76adf88"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 21): route.POST has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/status/route.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"de7b04c82230b8aa33ca0d18b55f9d510f975147362cdcbe8973181b8921344b"}},{"ruleId":"D1","level":"warning","message":{"text":"data.loadJobURLs (cyclomatic 21): data.loadJobURLs has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"24758daf9626c85b7a46154fce59a0c264e43c70b34ab3cf67387d1f6d74ed88"}},{"ruleId":"D1","level":"warning","message":{"text":"data.enrichAppURLsByCompany (cyclomatic 21): data.enrichAppURLsByCompany has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f07a3e338c91b7f657a72fb4149acbda02184e87c56a2b1aaac8df6d00899c"}},{"ruleId":"D1","level":"warning","message":{"text":"trackerLock.release (cyclomatic 21): trackerLock.release has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/tracker_lock.go"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d9e36e04e09db2020970b598be9abda9e6f5b1d51a5ca401a21c91b448cc24"}},{"ruleId":"D1","level":"warning","message":{"text":"ViewerModel.Update (cyclomatic 21): ViewerModel.Update has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"f053029dbec60ac68fdb7d84b2410fc6e59daaec93780b77e1fcd44ce1d0aedb"}},{"ruleId":"D1","level":"warning","message":{"text":"ViewerModel.renderAll (cyclomatic 21): ViewerModel.renderAll has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b629a06e71d222049745640d87a128a9eccf541edbf00cb9a563e80eeb7b8ec"}},{"ruleId":"D1","level":"warning","message":{"text":"parseTsvContent (cyclomatic 21): parseTsvContent has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":985}}}],"partialFingerprints":{"codehealthFindingId/v1":"628f944baec0ec42b2c72ac0aafa7f3285a332d7de320ca3bc8b9bbab7693f1b"}},{"ruleId":"D1","level":"warning","message":{"text":"computeScanStats (cyclomatic 21): computeScanStats has cyclomatic complexity 21 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 1 belongs to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"5afa3f1caf16351640b32d6bc5dbd0f7a2675f773f07704ceb0a4c675e23dc54"}},{"ruleId":"D1","level":"warning","message":{"text":"parseSessionFile (cyclomatic 21): parseSessionFile has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b4c2c2a68c70d1ab3c0c5c2a76c1ab949645fd399760428b0b4c969b437ded"}},{"ruleId":"D1","level":"warning","message":{"text":"acquireFollowupsLock (cyclomatic 21): acquireFollowupsLock has cyclomatic complexity 21 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 5 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b661b22426f064dcfce9973f820583b030f029777c416c647b55f68b66c6fbd"}},{"ruleId":"D1","level":"warning","message":{"text":"seedFollowup (cyclomatic 21): seedFollowup has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"0232d81f59f118f21636ce3aa0efb481f3e87dd0667e38b67f43ef2474e8395b"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 21): fetch has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/phenom.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"43c47ea88d3d46fcb1fc77006fca13ff6a58fc231169840cfe3ba80efacd328f"}},{"ruleId":"D1","level":"warning","message":{"text":"contacts.printSummary (cyclomatic 20): contacts.printSummary has cyclomatic complexity 20 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd5cbd795282d9a26296e47dbb71ec6fe1a3f0e6366ac6ef921afd57c17d363"}},{"ruleId":"D1","level":"warning","message":{"text":"workday.chooseSplitFacet (cyclomatic 20): workday.chooseSplitFacet has cyclomatic complexity 20 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"b54e91018419a0480cd4b9c302701fba80d9fafe14b5785a95932e96844963ae"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.buildLocationFilter (cyclomatic 20): scan.buildLocationFilter has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 6 of the 20 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 536, 544). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f82bf5adf8ab2e16774bc87f515d184daab033c6774c618624d41fc4df9085"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.loadReApplyWindows (cyclomatic 20): scan.loadReApplyWindows has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1177}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c1060599eb7e2bfbf7017cb90ba9fa13cc856d20bb22357230abdd1742b8e56"}},{"ruleId":"D1","level":"warning","message":{"text":"reserve-report-num.runCli (cyclomatic 20): reserve-report-num.runCli has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reserve-report-num.mjs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c3a79d2e50aa6e807c04bf9e0afa22de7d8dca28251e014c78f1e4955f2691f"}},{"ruleId":"D1","level":"warning","message":{"text":"normalize-statuses.normalizeStatus (cyclomatic 20): normalize-statuses.normalizeStatus has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"normalize-statuses.mjs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"60cb3ed87acf7ef088d9b513bbac37394dfa3bbd5130ef76a0d7f7e38af9d0fe"}},{"ruleId":"D1","level":"warning","message":{"text":"dassault.parseHits (cyclomatic 20): dassault.parseHits has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/dassault.mjs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc5a4bc770dcb86b8c4ab7583901824a835850a6f2856e8247e4fae5262d20b"}},{"ruleId":"D1","level":"warning","message":{"text":"mycareersfuture.normalizeJob (cyclomatic 20): mycareersfuture.normalizeJob has cyclomatic complexity 20 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/mycareersfuture.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"43c8d7a88a661e7f0bdc9cb21b1a5eafa4307e69dcd5d455ac140187c83b3727"}},{"ruleId":"D1","level":"warning","message":{"text":"cli.main (cyclomatic 20): cli.main has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scaffolder/bin/cli.mjs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"8da2bf8018eb096d372b511e03a3aab00be57eb328d56dadc20d63890c9351aa"}},{"ruleId":"D1","level":"warning","message":{"text":"vc-portfolios.parseYCPayload (cyclomatic 20): vc-portfolios.parseYCPayload has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"seeds/vc-portfolios.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"4919d29929e3ad2dbdda77cd9889d8c08e4b8a057931b228d226b88955405fc0"}},{"ruleId":"D1","level":"warning","message":{"text":"mobile-nav.MobileNav (cyclomatic 20): mobile-nav.MobileNav has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 4 of the 20 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 54, 153, 88, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/mobile-nav.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"df9cd0a6747fa83b91041601c15d9db4d862654f5104e2668157a3902bb392b2"}},{"ruleId":"D1","level":"warning","message":{"text":"data.deriveSeniority (cyclomatic 20): data.deriveSeniority has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b4bf70b3705f301cef1b136585ac3e97145ce3370e2adceb73503547bd603c"}},{"ruleId":"D1","level":"warning","message":{"text":"searchInteramt (cyclomatic 20): searchInteramt has cyclomatic complexity 20 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-interamt.mjs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"312e330a57c4a5b580dfdde367980045f0a878ff47d40a07b59008c8433c7aed"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 20): fetch has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/csod.mjs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5987724cdf11b6787dccfcc0ef1dd97fb9ec52407a3a59dbdf013373599cfae"}},{"ruleId":"D1","level":"warning","message":{"text":"cli-flags.validateFlags (cyclomatic 19): cli-flags.validateFlags has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 7 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 122, 148, 116). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cli-flags.mjs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a53e32d70568274d86733a0b9a8e55a7ac5a51f39b3a48faa7ad53697be57d"}},{"ruleId":"D1","level":"warning","message":{"text":"audit-portals.auditCompanies (cyclomatic 19): audit-portals.auditCompanies has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 2 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 224, 219, 258). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff439d774ea7a73d12f62fe50e530869a1c32e68267089dab46d706923638335"}},{"ruleId":"D1","level":"warning","message":{"text":"check-table-freshness.runSelfTest (cyclomatic 19): check-table-freshness.runSelfTest has cyclomatic complexity 19 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 6 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba50da892bfb3fc152879cabf92a876ffa8c8deb4b282f4ce336e9916ac7c42e"}},{"ruleId":"D1","level":"warning","message":{"text":"verify-portals.verifyCompanies (cyclomatic 19): verify-portals.verifyCompanies has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"5740b079e0dfac4e1bb2c17301e26bddad824ac357fab4416b78778f2034cfc3"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.collectSeenUrls (cyclomatic 19): scan.collectSeenUrls has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1667}}}],"partialFingerprints":{"codehealthFindingId/v1":"c534ff10b2b4486d7beada9a6c65d83a789f97078fc614f85688bdd04167023d"}},{"ruleId":"D1","level":"warning","message":{"text":"generate-pdf.scanNesting (cyclomatic 19): generate-pdf.scanNesting has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"252b55e3f3b2c83906d0778ae9e7eeaa23c89e298aed5b773a4add679db0b7c3"}},{"ruleId":"D1","level":"warning","message":{"text":"history-ats-seeds.atsBoardUrlOf (cyclomatic 19): history-ats-seeds.atsBoardUrlOf has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"history-ats-seeds.mjs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9998a4e73805a899a6e751fcf5f3c6cd66dbb5d6d999e98c6640c354d3b64b8d"}},{"ruleId":"D1","level":"warning","message":{"text":"garena.parseGarenaResponse (cyclomatic 19): garena.parseGarenaResponse has cyclomatic complexity 19 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/garena.mjs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"5736e7a7905a6f7ef77f677f44f1ff8f32a6cf3a013d6207ee73825a6f787706"}},{"ruleId":"D1","level":"warning","message":{"text":"oraclecloud.parseOracleResponse (cyclomatic 19): oraclecloud.parseOracleResponse has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/oraclecloud.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c66b476eb3f67a2b85f389af54d0e599556b6edccd982b17ccc788613dec0c1"}},{"ruleId":"D1","level":"warning","message":{"text":"redrover.parseRedRoverResponse (cyclomatic 19): redrover.parseRedRoverResponse has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/redrover.mjs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"436206f2f7859745ba6cea10cdaa476a209e485917d907e2622a21642ff9e2ed"}},{"ruleId":"D1","level":"warning","message":{"text":"ultipro.extractCandidateOpportunityDetail (cyclomatic 19): ultipro.extractCandidateOpportunityDetail has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d7fa2e40b44f7ce679998986c50209281c96180dc2bfdb3b380c8ae269b31de"}},{"ruleId":"D1","level":"warning","message":{"text":"scan-hn.main (cyclomatic 19): scan-hn.main has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-hn.mjs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e15204d78988d6f345b8f2c7988447890a9ea946b178c9a69e68bbdb1aa1f7"}},{"ruleId":"D1","level":"warning","message":{"text":"export-ats-text.loadProfile (cyclomatic 19): export-ats-text.loadProfile has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"38035612e5326ec837ea502088faf2233426335c2fd07fed898edbb2701ceb33"}},{"ruleId":"D1","level":"warning","message":{"text":"tracker.exportMd (cyclomatic 19): tracker.exportMd has cyclomatic complexity 19 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"7821be78ff64f2f030631f8f1f874904268f9b7769b99b8e44ed8865a8a2a536"}},{"ruleId":"D1","level":"warning","message":{"text":"validate-plugin-registry.validateRegistry (cyclomatic 19): validate-plugin-registry.validateRegistry has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-plugin-registry.mjs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d89009a887c4025fd818f9925359765af6f74a3a359d562418b42f52b1e413a"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 19): route.POST has cyclomatic complexity 19 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/apply/prefill/route.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3d864ab477cea65a83f0df3b2c931086d1061f712ba899e9ce09b235f405b5"}},{"ruleId":"D1","level":"warning","message":{"text":"portals-view.PortalsView (cyclomatic 19): portals-view.PortalsView has cyclomatic complexity 19 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/portals-view.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6404c3ef8ea7cabb9815cd0c7e3f087e21afbaf1bc324c8392f16a9d515e36d1"}},{"ruleId":"D1","level":"warning","message":{"text":"drive.snapshot (cyclomatic 19): drive.snapshot has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 31, 33, 32). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/drive.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d568afffc68fff04115d8054b2a4bb1e86b161a4293508eea060c20e9ab7767"}},{"ruleId":"D1","level":"warning","message":{"text":"pipeline-sort.sortRows (cyclomatic 19): pipeline-sort.sortRows has cyclomatic complexity 19 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 9 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/pipeline-sort.mjs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7747c83328f3c5ea1ea1e3953be6e462a788b625cb4da40406e7180105fc7944"}},{"ruleId":"D1","level":"warning","message":{"text":"PipelineModel.renderPreview (cyclomatic 19): PipelineModel.renderPreview has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"de024f7e10144ed2eb4a8ed8d55d5cb00096963a49d8431dbcccca6a2f14fd47"}},{"ruleId":"D1","level":"warning","message":{"text":"main::processJobs (cyclomatic 19): main::processJobs has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":1127}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e8226c571e94db10f9925a070282eb309ad2cfe40cc44ff6812a921bf15240"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch::split (cyclomatic 19): fetch::split has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":899}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ac2e9c904e478f5686069237a7a3cad49b64d609b6bbd73bd1c56596c8e7e85"}},{"ruleId":"D1","level":"warning","message":{"text":"parseCompanyInput::add (cyclomatic 19): parseCompanyInput::add has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2fb7cd14d796d56762a14c53425ab32fc1a77aa1665bf8b33f08e84a7492450"}},{"ruleId":"D1","level":"warning","message":{"text":"fetchTextMeta (cyclomatic 19): fetchTextMeta has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"075f47e1ce53b66aa936fee4cac59632235dd8ff6fa375e7bb9b6db7d893e70d"}},{"ruleId":"D1","level":"warning","message":{"text":"validatePortalsConfig::validateEntryList (cyclomatic 19): validatePortalsConfig::validateEntryList has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2279388182090acb7cc08da897f5213c5367e927f6f8b3af561d6340de81392"}},{"ruleId":"D1","level":"warning","message":{"text":"installIndex (cyclomatic 19): installIndex has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/install-h1b-index.mjs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c0460dce944d1b372383d95bb2c2e308a96ab45dec919c142d338b486923c3"}},{"ruleId":"D1","level":"warning","message":{"text":"liveness-core.classifyLiveness (cyclomatic 18): liveness-core.classifyLiveness has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-core.mjs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"8855ff8a238eec4f264983eaff4be428ae4d8e4de05dad1abea29e6a43bbe75e"}},{"ruleId":"D1","level":"warning","message":{"text":"liveness-browser.createHeadedPageProvider (cyclomatic 18): liveness-browser.createHeadedPageProvider has cyclomatic complexity 18 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 6 belong to one function literal inside it that branches. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-browser.mjs"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd0deef4ac987835bd32faf678e7360225068dc1c41da95b0dea2909d6c73d23"}},{"ruleId":"D1","level":"warning","message":{"text":"archive-posting.main (cyclomatic 18): archive-posting.main has cyclomatic complexity 18 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"archive-posting.mjs"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d3cfd0ce08ae0c65a813f43e8a2eb21aa239ab29089c5ef5d88d4af56cb796"}},{"ruleId":"D1","level":"warning","message":{"text":"build-cv-html.buildExperience (cyclomatic 18): build-cv-html.buildExperience has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 4 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 377, 353). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"9332c9f5345d4e42bb395c70fc67e08c34100cc3b9891142084c319ad40acf0d"}},{"ruleId":"D1","level":"warning","message":{"text":"stats.computeAllStats (cyclomatic 18): stats.computeAllStats has cyclomatic complexity 18 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0472362bcd950e8072e028b0e393520fc1220d3704048fe1838877f7d7c3fa"}},{"ruleId":"D1","level":"warning","message":{"text":"verify-portals.printResults (cyclomatic 18): verify-portals.printResults has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8a287a9caf9a6a7b674bc1b38f18dd327f86cf905fce4b19fa54b1f4ed0b979"}},{"ruleId":"D1","level":"warning","message":{"text":"fix-slugs.appendNote (cyclomatic 18): fix-slugs.appendNote has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fix-slugs.mjs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff96a37663d662d179746824bb40e1d901d80c19ca032d8e733e5870c7b91a5e"}},{"ruleId":"D1","level":"warning","message":{"text":"generate-latex.validateLatexContent (cyclomatic 18): generate-latex.validateLatexContent has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-latex.mjs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d5ea88271d3d870b479a7cd4360ce8f3caf5869dcbf49f9ba155eb53442ba8"}},{"ruleId":"D1","level":"warning","message":{"text":"check.main (cyclomatic 18): check.main has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/check.mjs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"91566f9eceb6066881dc4a6d32e6e637b8dadc1ebee2e3b9da0d4376dcaf4289"}},{"ruleId":"D1","level":"warning","message":{"text":"a16z-speedrun-talent.normalizeSpeedrunJob (cyclomatic 18): a16z-speedrun-talent.normalizeSpeedrunJob has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/a16z-speedrun-talent.mjs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"66667b32a9e857b40389e917069308d47029a6d754fc676c50b281ea794637c6"}},{"ruleId":"D1","level":"warning","message":{"text":"comeet.parseComeetResponse (cyclomatic 18): comeet.parseComeetResponse has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 2 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 118, 149). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/comeet.mjs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f5cb7dca71b93be014d7c0a5889b8a0cbe0357bf6f57580bc2e3272b2a4138"}},{"ruleId":"D1","level":"warning","message":{"text":"jobicy.parseJobicyResponse (cyclomatic 18): jobicy.parseJobicyResponse has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 3 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 53, 46). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobicy.mjs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe9d1fb257b396212ce73e834c758c2777fc191083a2396ae35d959016aecac"}},{"ruleId":"D1","level":"warning","message":{"text":"pythonorg.parsePythonOrgFeed (cyclomatic 18): pythonorg.parsePythonOrgFeed has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/pythonorg.mjs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0cbbdea822d358e251650f0564a23946cce7a141025f6f877c2c45e61c967f"}},{"ruleId":"D1","level":"warning","message":{"text":"upskill.aggregateGaps (cyclomatic 18): upskill.aggregateGaps has cyclomatic complexity 18 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"d03755e816423ecffa203d5063b9756444285392dc232682fe273882626d0834"}},{"ruleId":"D1","level":"warning","message":{"text":"cadence-settings.CadenceSettings (cyclomatic 18): cadence-settings.CadenceSettings has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 7 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 52, 34, 45, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/cadence-settings.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"73e7d55aefc941c3c558321dd2648640417521788c5a429c8e8e859fe0c93077"}},{"ruleId":"D1","level":"warning","message":{"text":"profile-patch.profilePatchError (cyclomatic 18): profile-patch.profilePatchError has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/profile-patch.mjs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae6bb7661bb61a17c0fc2b9e6c91e505ac0101340c9e469914624092f037d1b"}},{"ruleId":"D1","level":"warning","message":{"text":"report.issueBody (cyclomatic 18): report.issueBody has cyclomatic complexity 18 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/report/report.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc1ec7ab8d6b1433eec210ffa38436219c521984691c6ce5f0dd2b526c22780f"}},{"ruleId":"D1","level":"warning","message":{"text":"StatsModel.renderPieChart (cyclomatic 18): StatsModel.renderPieChart has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/stats.go"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8548674e5f836af29bf24388b6682df935baa70d38e6272a18a32e00c22fde"}},{"ruleId":"D1","level":"warning","message":{"text":"parseHeadedAddition (cyclomatic 18): parseHeadedAddition has cyclomatic complexity 18 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 6 belong to 8 function items inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"f308b61ce4f5f10c40ec1f26eff1c3dee1904d703b051409bab49bf0c59b954e"}},{"ruleId":"D1","level":"warning","message":{"text":"findUnarchivedApplications (cyclomatic 18): findUnarchivedApplications has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0c05677ecec597f54facd911f7e182bb304840236c89821b914795a25b3d19"}},{"ruleId":"D1","level":"warning","message":{"text":"renderTable (cyclomatic 18): renderTable has cyclomatic complexity 18 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 9 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eae2e2f1aac0d4ecfcb4be9ff4ae68a3677807f56ba5dfee7ab25b17ea1fc0a"}},{"ruleId":"D1","level":"warning","message":{"text":"computeTrackerStats (cyclomatic 18): computeTrackerStats has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"df34439287dcf4a3366715e908c0b40ab59c18294b5b1c0d769a46f1b0af12a1"}},{"ruleId":"D1","level":"warning","message":{"text":"checkFreshness (cyclomatic 18): checkFreshness has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"884a5954ae780f57a596054d06603d1f98947d5505ddcad9bd4a2a987d6e35b5"}},{"ruleId":"D1","level":"warning","message":{"text":"extractTrackerReportNumbers (cyclomatic 18): extractTrackerReportNumbers has cyclomatic complexity 18 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 6 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-parse.mjs"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80e088bb1ea19b38d9919b6f4d3466b878c68e342e3a885c4942795fea5ec04"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 18): fetch has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/avature.mjs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd466e7336487c89af97efd9a0080c6f8abe0e6a3c49f850d44e94d0fdf85431"}},{"ruleId":"D1","level":"warning","message":{"text":"add-entry.applyAdd (cyclomatic 17): add-entry.applyAdd has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"add-entry.mjs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c687b7e61b54285f847e78f68cacc512e37770e89fb988a4df654fd8fbf2bf"}},{"ruleId":"D1","level":"warning","message":{"text":"assessment-log.selfTest (cyclomatic 17): assessment-log.selfTest has cyclomatic complexity 17 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"assessment-log.mjs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"84619f261ce63e241d6532ec07434d586c39b3ba178b1782265bfe36fee06f84"}},{"ruleId":"D1","level":"warning","message":{"text":"assessment-log.printSummary (cyclomatic 17): assessment-log.printSummary has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"assessment-log.mjs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb26ff4dc16f3869ffcf089e3aca203e809f247467972944c2860f719f1c2513"}},{"ruleId":"D1","level":"warning","message":{"text":"build-cv-html.prepareCandidatePhoto (cyclomatic 17): build-cv-html.prepareCandidatePhoto has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"03b200d653fd28ec9ff584cb5d68119f8647827621912a27bb1cd9391e3a3250"}},{"ruleId":"D1","level":"warning","message":{"text":"build-cv-html.main (cyclomatic 17): build-cv-html.main has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c292e02de7d28f711e6b96a3b729f2cdbe41910faf51964c137725b6dbbe46"}},{"ruleId":"D1","level":"warning","message":{"text":"calibrate.loadLedgerReached (cyclomatic 17): calibrate.loadLedgerReached has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"calibrate.mjs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"879138de0a8d4e9b980c4700f855494b5187fd4fceb0f1c6de78f647adf8f3ec"}},{"ruleId":"D1","level":"warning","message":{"text":"classify-tier.classifyTier (cyclomatic 17): classify-tier.classifyTier has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"classify-tier.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1e72e2dd512e23bebe8b7247ed0cef5f88cbc57b7b8199406be1e70832fe30"}},{"ruleId":"D1","level":"warning","message":{"text":"followup-cadence.computeUrgency (cyclomatic 17): followup-cadence.computeUrgency has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22fe2a44dfab112c7cf38c6956bae85d2b5e62d7fdaae32891293bb9055ab6e"}},{"ruleId":"D1","level":"warning","message":{"text":"company-history.loadStatusLogSource (cyclomatic 17): company-history.loadStatusLogSource has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a199a20d2bd5ce62e747e38db9db1c65031d1c45b671f244b073473fb83dcb8"}},{"ruleId":"D1","level":"warning","message":{"text":"contacts.selfTest (cyclomatic 17): contacts.selfTest has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"593836d9cdd5624821849406334d2232959d6d5fa710754d73693bd15ecc5463"}},{"ruleId":"D1","level":"warning","message":{"text":"breezy.parseBreezyResponse (cyclomatic 17): breezy.parseBreezyResponse has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/breezy.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c61ba51470e0bdc71912c0773f66fc4e3bdf55c72c52edf381ceb4ab372a55"}},{"ruleId":"D1","level":"warning","message":{"text":"rippling.parseRipplingPage (cyclomatic 17): rippling.parseRipplingPage has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 6 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 133, 154). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/rippling.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"147e924c3ebcc05bba9dc19ef70248505c0682f9d0367467fe67ee8d17fd1730"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.buildContentFilter (cyclomatic 17): scan.buildContentFilter has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 8 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 768, 778). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"7768c615d8253614c1868974e0e5ed86d77553563de3ab9f092141a2b8b4346d"}},{"ruleId":"D1","level":"warning","message":{"text":"scan.buildCooldownFilter (cyclomatic 17): scan.buildCooldownFilter has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 3 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1212, 1243, 1241). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1205}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53a61ed9f78949c781df00c7b935820755dcf849493b6c57c199adab4bc2861"}},{"ruleId":"D1","level":"warning","message":{"text":"intake.main (cyclomatic 17): intake.main has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc7e336927c397f9d3b6e47c2277b9428b4051aeca24f3dc49db73a1be9ab6a"}},{"ruleId":"D1","level":"warning","message":{"text":"applitrack.parseApplitrackOutput (cyclomatic 17): applitrack.parseApplitrackOutput has cyclomatic complexity 17 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/applitrack.mjs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"145f3ba2b8003525713db37b9b3bbf5641b652782bd5f9265b9cb23ba5c78d29"}},{"ruleId":"D1","level":"warning","message":{"text":"arbeitnow.normalizeArbeitnowJob (cyclomatic 17): arbeitnow.normalizeArbeitnowJob has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/arbeitnow.mjs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3f75a435f0d5ff805332ce1e38e0be52cfb4b99926ac3bca7e3fff40ea7ce32"}},{"ruleId":"D1","level":"warning","message":{"text":"beesite.parseSearchResult (cyclomatic 17): beesite.parseSearchResult has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/beesite.mjs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"adfa2540be96c34f45d49b67af10f2896220011f082631bfc6fe3b728dd1e2c2"}},{"ruleId":"D1","level":"warning","message":{"text":"flowxtra.normalizeFlowxtraJob (cyclomatic 17): flowxtra.normalizeFlowxtraJob has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/flowxtra.mjs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae608d8d2074f01fdacba84a2df01f76e9f96804c11c907762269f2c621c25d"}},{"ruleId":"D1","level":"warning","message":{"text":"generalist-world.stripNonRendered (cyclomatic 17): generalist-world.stripNonRendered has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/generalist-world.mjs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc53d33456fec4b375aa0dc15ffc70a2443da9f6f51c739c6bd434c5327f4f1"}},{"ruleId":"D1","level":"warning","message":{"text":"jobstreet.parseJobstreetItem (cyclomatic 17): jobstreet.parseJobstreetItem has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobstreet.mjs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e621f7c34831398838aff3079da12134832faf2f6d9365a77bc49a8f596d4cd"}},{"ruleId":"D1","level":"warning","message":{"text":"neogov.parseNeogovPage (cyclomatic 17): neogov.parseNeogovPage has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/neogov.mjs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e7a95f5fe3255bfcfce3d3d5b3cd947eb1e19b716629db00ad496a27b79634"}},{"ruleId":"D1","level":"warning","message":{"text":"oraclecloud.resolveSite (cyclomatic 17): oraclecloud.resolveSite has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/oraclecloud.mjs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"243f9b9cfed90cfa3e87e6762aee8bf6ef4bac92f151ff5e86f028461ee39df1"}},{"ruleId":"D1","level":"warning","message":{"text":"taleo.parseTaleoResponse (cyclomatic 17): taleo.parseTaleoResponse has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/taleo.mjs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b7ba5247f3c76ac7710df271072ff0d22fdc4de7cba2dc64a7b74ac3e1957e"}},{"ruleId":"D1","level":"warning","message":{"text":"telegram-channel.classifyLink (cyclomatic 17): telegram-channel.classifyLink has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"abd561acac955e65ba49db6781a67bb1abd4fdecad3142e0f96d9fa2496edab5"}},{"ruleId":"D1","level":"warning","message":{"text":"telegram-channel.parseChannelPage (cyclomatic 17): telegram-channel.parseChannelPage has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4e0dd0c0f165cfaf252b3bebe76e5def20aa80c3ebd0dcbbda3d966a0b0b87c"}},{"ruleId":"D1","level":"warning","message":{"text":"tracker-sync-check.runSelfTest (cyclomatic 17): tracker-sync-check.runSelfTest has cyclomatic complexity 17 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-sync-check.mjs"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa6b310ad8fc577a4382b1f79b879665df3434e444780fff2c6ebf370580445f"}},{"ruleId":"D1","level":"warning","message":{"text":"update-system.rejectUserLayerPaths (cyclomatic 17): update-system.rejectUserLayerPaths has cyclomatic complexity 17 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"486605e5b213ea815897a24df7e919c3208a93d429de3dc9360b0963ee061be7"}},{"ruleId":"D1","level":"warning","message":{"text":"validate-portals.validateParser (cyclomatic 17): validate-portals.validateParser has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"09cc0fe21d768d3fe0a46f6eeb0c508e8026230b9c694294f9f68a2149b1ad00"}},{"ruleId":"D1","level":"warning","message":{"text":"beta-banner.BetaBanner (cyclomatic 17): beta-banner.BetaBanner has cyclomatic complexity 17 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 8 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/beta/beta-banner.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"5968c3a96231ce2203e9a3a11b67d2d85019118c4b72dacd4c5ca5188b972ab2"}},{"ruleId":"D1","level":"warning","message":{"text":"career-ops.readLanguageConfig (cyclomatic 17): career-ops.readLanguageConfig has cyclomatic complexity 17 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/career-ops.ts"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ea1d89f88a6a5d648c4b20f2b0b274ef9077a4a56bfd166cab4d75a0ebe32d"}},{"ruleId":"D1","level":"warning","message":{"text":"states.readCanonicalStates (cyclomatic 17): states.readCanonicalStates has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/states.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5b926dee80d297320b1dd07ffb5322b9d11b916dce154ed36a865fdd92c3e4"}},{"ruleId":"D1","level":"warning","message":{"text":"PipelineModel.Update (cyclomatic 17): PipelineModel.Update has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"3748fdf398f96bea5d11fc9be0542d9a4e5fc41504a2b933fa6ef090807203bc"}},{"ruleId":"D1","level":"warning","message":{"text":"PipelineModel.handleDiscardPicker (cyclomatic 17): PipelineModel.handleDiscardPicker has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"f400f0644c1ce0c0d0a3b1bc03a1b67ebdd019b4f32d02ccf9d654c2911f021d"}},{"ruleId":"D1","level":"warning","message":{"text":"PipelineModel.renderAppLine (cyclomatic 17): PipelineModel.renderAppLine has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":1794}}}],"partialFingerprints":{"codehealthFindingId/v1":"62ecaa52b2f7619392c7febe93750aecfe7e57dd92016828126ac923b04e9b3a"}},{"ruleId":"D1","level":"warning","message":{"text":"buildRow (cyclomatic 17): buildRow has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 2 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"6496df20af6f3221f58fe4eec441a49406b83aa00fb0ff4a7690f997d8097f62"}},{"ruleId":"D1","level":"warning","message":{"text":"runHistorySeedScan (cyclomatic 17): runHistorySeedScan has cyclomatic complexity 17 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 8 belong to 9 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"86f6bb9a624bc6b14523539c863e7c7a6516722aa3e2783618c545a9662ab0b7"}},{"ruleId":"D1","level":"warning","message":{"text":"isPrivateIpv4 (cyclomatic 17): isPrivateIpv4 has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"6213afbee3cc19d58459fd9af58f4247439a066ac4496ac63bec30382aa99c81"}},{"ruleId":"D1","level":"warning","message":{"text":"acquireTrackerLock::release (cyclomatic 17): acquireTrackerLock::release has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-utils.mjs"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"f719328e6cfad3c0a3b7630fd65b0cdce31f1a9421fd5d3e1da025bdf459ca62"}},{"ruleId":"D1","level":"warning","message":{"text":"proxyFor (cyclomatic 17): proxyFor has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_http.mjs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c99129bb9e6b16aee9274a607a0a783e34414d9084513abedbae0aae4f01da6f"}},{"ruleId":"D1","level":"warning","message":{"text":"fetchInContext (cyclomatic 17): fetchInContext has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_http.mjs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"392c53ccc9c6a6a50479d1e75c105615103621009eb64d7dd976dcdb2963a65b"}},{"ruleId":"D1","level":"warning","message":{"text":"readBoundedText (cyclomatic 17): readBoundedText has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc726d092487026263dc1c741a684dfa5f0258eb3e5dfdfef75cac1da355b48"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 17): fetch has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/remotli.mjs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1681dceefb9144f4d8cb3410ba7c738f1ad971cc38c0613cf4e76b63c8881b"}},{"ruleId":"D1","level":"warning","message":{"text":"main (cyclomatic 17): main has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to 2 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"hired-wall-build.mjs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"32a91da2d851c44330276837c2e1b0b7a672a4443fa574374a79eae88a0ed981"}},{"ruleId":"D1","level":"warning","message":{"text":"parseListingPage (cyclomatic 17): parseListingPage has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/careerviet.mjs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"268ad3506b480ebb3cf3f52193bd77b78f734f7f5b6041e2f2ebf707d21a06d8"}},{"ruleId":"D1","level":"warning","message":{"text":"add-entry.main (cyclomatic 16): add-entry.main has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"add-entry.mjs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a43c620bc7027078d4fe33ccbad5f1376053bd0609f7d5c151f8cbb62d26382"}},{"ruleId":"D1","level":"warning","message":{"text":"audit-portals.findUnclaimedEntries (cyclomatic 16): audit-portals.findUnclaimedEntries has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bca8740565d86424a5a8a0db56f4febc3ba6e23bf9580961f9652885b2aca1c"}},{"ruleId":"D1","level":"warning","message":{"text":"build-cv-html.buildEducation (cyclomatic 16): build-cv-html.buildEducation has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 488, 468). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca16a6bd5f45beae523f12631bbcfed8138f6b12e758ece741c2ecefb746b59b"}},{"ruleId":"D1","level":"warning","message":{"text":"check-table-freshness.extractRows (cyclomatic 16): check-table-freshness.extractRows has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"55674112f4d8457ae2bc0c290b641b6667b587c5e4a1a1238d85639dba3ea329"}},{"ruleId":"D1","level":"warning","message":{"text":"clean-markers.processFile (cyclomatic 16): clean-markers.processFile has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"clean-markers.mjs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"507f54680ab8c975fef77efde59db11eabb986374e33304e1f19c07e05890748"}},{"ruleId":"D1","level":"warning","message":{"text":"funnel-velocity.parseStatusLog (cyclomatic 16): funnel-velocity.parseStatusLog has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"e280de98032882ab99f23a3d8a1a410c51354a5b74adb110e490cf2a8cf0ca5d"}},{"ruleId":"D1","level":"warning","message":{"text":"contacts.parseContacts (cyclomatic 16): contacts.parseContacts has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"7433b3db538525fe16b57096aa833a436bebe5d82f3a5cfbbbfc7e8b429f9502"}},{"ruleId":"D1","level":"warning","message":{"text":"pinpoint.parsePinpointResponse (cyclomatic 16): pinpoint.parsePinpointResponse has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 128). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/pinpoint.mjs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b35370377eb7d11eb5e135da53323f410491606949e16fa9d7b37f2cab78853"}},{"ruleId":"D1","level":"warning","message":{"text":"discover-ats.dedupeAgainstPortals (cyclomatic 16): discover-ats.dedupeAgainstPortals has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"260e932cfb2a1b165ffd266afeae3a4296a98b1665ce438d5aecc031792794fd"}},{"ruleId":"D1","level":"warning","message":{"text":"discover-ats.parseArgs (cyclomatic 16): discover-ats.parseArgs has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 1018, 1005, 1011, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":996}}}],"partialFingerprints":{"codehealthFindingId/v1":"8403f22561e042bf251cd9a9ef2a603d7792d7fa978de589d2806c2a3c6d2e97"}},{"ruleId":"D1","level":"warning","message":{"text":"doctor.onboardingState (cyclomatic 16): doctor.onboardingState has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"doctor.mjs"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa3c442c8c4fc342d672f67d8c51783c994baf70a55a8a5a1feda54d894a6b1e"}},{"ruleId":"D1","level":"warning","message":{"text":"followup-seed.parseCliArgs (cyclomatic 16): followup-seed.parseCliArgs has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":701}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7de75223b739b312c0aaaee4e8925c98e9a00c534b50d95bda145cb0d2bd85"}},{"ruleId":"D1","level":"warning","message":{"text":"keyword-match.runSelfTest (cyclomatic 16): keyword-match.runSelfTest has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"keyword-match.mjs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"7559a3a81b861b3e2c0fe94aac6f9e484bc4db925d745784b1e55483bd02034e"}},{"ruleId":"D1","level":"warning","message":{"text":"plugin-audit.auditPlugin (cyclomatic 16): plugin-audit.auditPlugin has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugin-audit.mjs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd320e4bc0e3de3ae54353202ac47c06d2ab5f30a14d27c19ee2baf06d787bb"}},{"ruleId":"D1","level":"warning","message":{"text":"token.mintToken (cyclomatic 16): token.mintToken has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/token.mjs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"54e8d0b5999489454b2d4450ccb0c2c69ee73707899b8fa65cb0e74cf3b2fc24"}},{"ruleId":"D1","level":"warning","message":{"text":"_notion.createNotionClient (cyclomatic 16): _notion.createNotionClient has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/notion/_notion.mjs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"3853cee45ab9235fc6072e9afc13eabc054a83809a0f46a9eac3dde3d63bdf08"}},{"ruleId":"D1","level":"warning","message":{"text":"process-quality.aggregateProcessQuality (cyclomatic 16): process-quality.aggregateProcessQuality has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"process-quality.mjs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fbe044c260777d3b33d31b79216440b53d4eb2056f78a9a6361d3318f8c7855"}},{"ruleId":"D1","level":"warning","message":{"text":"hiringroom.parseJsonLdJobs (cyclomatic 16): hiringroom.parseJsonLdJobs has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/hiringroom.mjs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"393d18e6fb0232e38f3a0568daab34436e3defef604eb0613690884820213515"}},{"ruleId":"D1","level":"warning","message":{"text":"jazzhr.parseJazzHRList (cyclomatic 16): jazzhr.parseJazzHRList has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jazzhr.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf4a002f6cff460cedbf4e03da03df5612a1d518565c8b8783fabb0e4c36588"}},{"ruleId":"D1","level":"warning","message":{"text":"jibeapply.parseJibeapplyResponse (cyclomatic 16): jibeapply.parseJibeapplyResponse has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 64). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jibeapply.mjs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"946a2967ea22294a44df6b3408157244bda97bf89ac18d61a36d6d570c15b2c3"}},{"ruleId":"D1","level":"warning","message":{"text":"vdab.normalizeJob (cyclomatic 16): vdab.normalizeJob has cyclomatic complexity 16 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/vdab.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bfdd504f1dab92d14e2ea2b392ff34f7f560d9279146be5dc9ac520559ef239"}},{"ruleId":"D1","level":"warning","message":{"text":"tracker.parseTracker (cyclomatic 16): tracker.parseTracker has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaa71a5d69de4170932a4214405e22b123a7bc2c89df1eb30e1f9ca774bc1855"}},{"ruleId":"D1","level":"warning","message":{"text":"update-system.reconcileGitignore (cyclomatic 16): update-system.reconcileGitignore has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3171}}}],"partialFingerprints":{"codehealthFindingId/v1":"085a5334edecdcff7a97bfa510b6b95607428d08aa4db6176215c0d70b59509d"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 16): route.POST has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 73). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/followups/log/route.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"9603083fa3d20f5d1df419bfd241b7de76443c814518d7936da8aea64abba981"}},{"ruleId":"D1","level":"warning","message":{"text":"route.POST (cyclomatic 16): route.POST has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/tracker/delete/route.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9444b47ef80f3e0d18551877ada23a2bc831c14fbc2c20c524e436943fe5ca07"}},{"ruleId":"D1","level":"warning","message":{"text":"route.compute (cyclomatic 16): route.compute has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/usage/route.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"13d61975730dcdc5cbe8a6042bb0b8409aa29351f86c81fa31343416598a9fce"}},{"ruleId":"D1","level":"warning","message":{"text":"origin-guard.checkRequest (cyclomatic 16): origin-guard.checkRequest has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/origin-guard.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"7948e8fb670b73c84c814ff60f614fca624d1c7dd41dd872939793be7cfdfa8c"}},{"ruleId":"D1","level":"warning","message":{"text":"data.enrichFromScanHistory (cyclomatic 16): data.enrichFromScanHistory has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcdbfbff988da361011891cfe0822f05e7dcc93d2240c71616862d0e4f7db5f8"}},{"ruleId":"D1","level":"warning","message":{"text":"buildCompanyCanonicalizer (cyclomatic 16): buildCompanyCanonicalizer has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1806}}}],"partialFingerprints":{"codehealthFindingId/v1":"21360f740ae54a0cab9bc53553c907bfce65922fb8aedfa1bc2a02c6c13ccfb3"}},{"ruleId":"D1","level":"warning","message":{"text":"requisitionIdsForDedup (cyclomatic 16): requisitionIdsForDedup has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":2195}}}],"partialFingerprints":{"codehealthFindingId/v1":"994512fd290bdfa9d100038184ab410f65ca9a6ab1319e1b723118152a759e51"}},{"ruleId":"D1","level":"warning","message":{"text":"parseBlacklist (cyclomatic 16): parseBlacklist has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":2797}}}],"partialFingerprints":{"codehealthFindingId/v1":"086fe9aedc238144c244d3923cd2990ccd29a445648246073ca8df87c666f50b"}},{"ruleId":"D1","level":"warning","message":{"text":"main::resolveEntries (cyclomatic 16): main::resolveEntries has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":3418}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f1e26ec21d4ce94b891222996cbb2cef581b546dde33e715d0a8b88a8c6792"}},{"ruleId":"D1","level":"warning","message":{"text":"parseArgs (cyclomatic 16): parseArgs has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 7 function items inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ec967cb8188f11ea309f5e672f4df91513d311b0ac8060fffc3cb73a2ff29b"}},{"ruleId":"D1","level":"warning","message":{"text":"computeRunStats (cyclomatic 16): computeRunStats has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to 9 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"4096b1893d35ca3c3ab444c5027e123af2b3f01ecc5249a3ba607fef1a7c08ae"}},{"ruleId":"D1","level":"warning","message":{"text":"cmdEvaluate (cyclomatic 16): cmdEvaluate has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c4cd43dd077ef4417ac5d28c7c976a22dc10d9c220ef7af41adacd3feca1581"}},{"ruleId":"D1","level":"warning","message":{"text":"readConfig (cyclomatic 16): readConfig has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to one function item inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/builtin.mjs"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"55e6b05e2a774b97e4bc14dffd98359a1dbaabc7841e3e1a9905b2b43d35b7c8"}},{"ruleId":"D1","level":"warning","message":{"text":"parseGrokEvent (cyclomatic 16): parseGrokEvent has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/run-cli-support.mjs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9fbb7d3c8163f1243b0ec9fc00a5ce0689728dce8c971292ada5b80f7aaa56"}},{"ruleId":"D1","level":"warning","message":{"text":"validateProfile::checkFact (cyclomatic 16): validateProfile::checkFact has cyclomatic complexity 16 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e0319c28895067b227fbc7c897980a1f8e9ad85df947314c84a6e14b715aad7"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 16): fetch has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/gem.mjs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf81948cf5d80ff416d2a3d4bf6f617ce801c333cc7e25476643d071f3b9198"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch (cyclomatic 16): fetch has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/oraclecloud.mjs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"0192d358fc0412cf1b474826ff4ed29d74d62b538bf509d0d4c492bc0493a47e"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.main (cognitive 271): scan.main has cognitive complexity 271 (threshold 15). Drivers by points: if/else 97 (150 pts), boolean chains 49, ternaries 16 (34 pts), loops 18 (33 pts), error handling 4 (5 pts) (nesting depth added 87). Of this number, 196 points are the body\u0027s own statements and 75 belong to 6 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f82be62cd1952a6a69310505132c44b75ddb5072db0a21f222c15db6cd19fd"}},{"ruleId":"D2","level":"warning","message":{"text":"scan-ats-full.main (cognitive 225): scan-ats-full.main has cognitive complexity 225 (threshold 15). Drivers by points: if/else 63 (121 pts), ternaries 24 (43 pts), boolean chains 38, error handling 5 (14 pts), loops 6 (9 pts) (nesting depth added 89). Of this number, 134 points are the body\u0027s own statements and 91 belong to 12 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c16f58ea8e56c2e243151f8a616386cb2d78196d6bca66049d1ad9471c292b"}},{"ruleId":"D2","level":"warning","message":{"text":"explore-provider.ExploreProvider (cognitive 157): explore-provider.ExploreProvider has cognitive complexity 157 (threshold 15). Drivers by points: if/else 46 (82 pts), ternaries 17 (30 pts), boolean chains 17, error handling 10 (13 pts), loops 7 (11 pts), match/switch 1 (4 pts) (nesting depth added 59). Most of this is not in the body itself: 0 of the 157 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 157, 419, 538, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explore-provider.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"345e0ae84d1d93d4941060ca11280397c73d74eba044f2f472fd6a4e9aca307e"}},{"ruleId":"D2","level":"warning","message":{"text":"apply-provider.ApplyProvider (cognitive 138): apply-provider.ApplyProvider has cognitive complexity 138 (threshold 15). Drivers by points: if/else 53 (83 pts), ternaries 6 (18 pts), error handling 8 (14 pts), boolean chains 13, loops 7 (10 pts) (nesting depth added 51). Most of this is not in the body itself: 0 of the 138 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 213, 98, 348, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply/apply-provider.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"084492e09555a50a8329ee0838d03fa4844e5fac15da1e1c44dea13d9d30e9c1"}},{"ruleId":"D2","level":"warning","message":{"text":"runSelfTest (cognitive 135): runSelfTest has cognitive complexity 135 (threshold 15). Drivers by points: if/else 72 (97 pts), boolean chains 15, loops 9, ternaries 3 (6 pts), error handling 2 (4 pts), other 4 (nesting depth added 30). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"796c67000c378758d061829036571243f424e14f7022c114e431aa2a2b2bf22e"}},{"ruleId":"D2","level":"warning","message":{"text":"apply (cognitive 129): apply has cognitive complexity 129 (threshold 15). Drivers by points: if/else 38 (60 pts), error handling 17 (25 pts), loops 9 (17 pts), ternaries 7 (15 pts), boolean chains 12 (nesting depth added 46). Of this number, 127 points are the body\u0027s own statements and 2 belong to 15 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3276}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0b0912419160d4d2c88883854759c403bb1c13dc4360b5af83048ef9b1ea00"}},{"ruleId":"D2","level":"warning","message":{"text":"aggregate-tokens.main (cognitive 126): aggregate-tokens.main has cognitive complexity 126 (threshold 15). Drivers by points: if/else 36 (106 pts), loops 6 (11 pts), ternaries 3 (5 pts), boolean chains 4 (nesting depth added 77). Of this number, 123 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"batch/aggregate-tokens.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb48cbc333f7dfdcd3abecdd810a0b8f6dced21e22ec4dee03f02859136d254d"}},{"ruleId":"D2","level":"warning","message":{"text":"assistant-console.AssistantConsole (cognitive 108): assistant-console.AssistantConsole has cognitive complexity 108 (threshold 15). Drivers by points: if/else 38 (51 pts), boolean chains 28, loops 7 (11 pts), error handling 8 (10 pts), ternaries 7 (8 pts) (nesting depth added 20). Of this number, 63 points are the body\u0027s own statements and 45 belong to 16 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/assistant-console.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1de4ce0144e1334afc6b6bdfdbeb96c9dfcf79e51f5d0383080d75c0e95ab20"}},{"ruleId":"D2","level":"warning","message":{"text":"validate-portals.validatePortalsConfig (cognitive 104): validate-portals.validatePortalsConfig has cognitive complexity 104 (threshold 15). Drivers by points: if/else 39 (79 pts), boolean chains 9, loops 3 (9 pts), ternaries 2 (7 pts) (nesting depth added 51). Of this number, 72 points are the body\u0027s own statements and 32 belong to one function literal inside it that branches. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"369a6570cb8aa0c9aca48cfda03031639fdcbda651c96bf09a9c41ab39528591"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.locallyModifiedSystemFiles (cognitive 103): update-system.locallyModifiedSystemFiles has cognitive complexity 103 (threshold 15). Drivers by points: if/else 15 (47 pts), loops 8 (22 pts), error handling 9 (18 pts), boolean chains 11, ternaries 2 (5 pts) (nesting depth added 58). Of this number, 86 points are the body\u0027s own statements and 17 belong to 2 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1861}}}],"partialFingerprints":{"codehealthFindingId/v1":"f50256795ccaa80282e6a8fb75eae0a064a244628c14a4b6d971718d66663f60"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 99): route.POST has cognitive complexity 99 (threshold 15). Drivers by points: if/else 49 (59 pts), ternaries 12 (16 pts), boolean chains 13, error handling 7 (8 pts), loops 3 (nesting depth added 15). Of this number, 34 points are the body\u0027s own statements and 65 belong to 15 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/run/route.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"b76e97ef3908eeccf333beefe5a68c55c57f64328c5526e9b586a8d44a2cb569"}},{"ruleId":"D2","level":"warning","message":{"text":"doImport (cognitive 99): doImport has cognitive complexity 99 (threshold 15). Drivers by points: if/else 23 (44 pts), ternaries 6 (22 pts), loops 9 (17 pts), other 7, boolean chains 6, error handling 2 (3 pts) (nesting depth added 46). Of this number, 45 points are the body\u0027s own statements and 54 belong to 12 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe8a7c21e03d488d3c8634b0b1382852fdaa440b1137874bf9df2821763a747"}},{"ruleId":"D2","level":"warning","message":{"text":"acquirePipelineLock (cognitive 95): acquirePipelineLock has cognitive complexity 95 (threshold 15). Drivers by points: if/else 18 (56 pts), error handling 8 (17 pts), boolean chains 8, ternaries 7, other 6, loops 1 (nesting depth added 47). Of this number, 75 points are the body\u0027s own statements and 20 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pipeline-lock.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"55bf77797c171a681c71ac6d20188dc111db0ca9483ba12a1a022eb85f4eaa23"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 95): fetch has cognitive complexity 95 (threshold 15). Drivers by points: if/else 20 (56 pts), ternaries 5 (13 pts), loops 4 (9 pts), boolean chains 8, error handling 3 (8 pts), other 1 (nesting depth added 54). Of this number, 88 points are the body\u0027s own statements and 7 belong to one function item inside it that branches. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/radancy.mjs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"a55560e78fc8e4be4d10184dc49b7ef04e3ceb8d916322809b5f9c70b75029d7"}},{"ruleId":"D2","level":"warning","message":{"text":"runSelfTest (cognitive 89): runSelfTest has cognitive complexity 89 (threshold 15). Drivers by points: if/else 50 (59 pts), boolean chains 16, loops 9, error handling 5 (nesting depth added 9). Of this number, 86 points are the body\u0027s own statements and 3 belong to 10 function items inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"0baedfb815ae59fde2c7f3f073f8ed8096b41caf8ae75baf830f4b5357937b8b"}},{"ruleId":"D2","level":"warning","message":{"text":"tracker-utils.acquireTrackerLock (cognitive 86): tracker-utils.acquireTrackerLock has cognitive complexity 86 (threshold 15). Drivers by points: if/else 21 (64 pts), error handling 6 (15 pts), boolean chains 4, ternaries 1 (2 pts), loops 1 (nesting depth added 53). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-utils.mjs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a770bf63209d7fbcba917383c533f7958a709fda9a9b9f813b0ba681fb4030"}},{"ruleId":"D2","level":"warning","message":{"text":"extract.extractForm (cognitive 86): extract.extractForm has cognitive complexity 86 (threshold 15). Drivers by points: if/else 27 (49 pts), boolean chains 25, ternaries 4 (8 pts), loops 3 (4 pts) (nesting depth added 27). Most of this is not in the body itself: 0 of the 86 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 23, 29, 24, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/extract.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"076aaee63822e275ffc9cbaf1053e5a600c0e18c0f97a0981cdf74c673a8ae1c"}},{"ruleId":"D2","level":"warning","message":{"text":"export-ats-text.parseCvMarkdown (cognitive 85): export-ats-text.parseCvMarkdown has cognitive complexity 85 (threshold 15). Drivers by points: if/else 19 (39 pts), loops 9 (25 pts), ternaries 4 (14 pts), boolean chains 7 (nesting depth added 46). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42e170cb3d581ebe8d5c8a921b2b0ed5645d8f81cea1d14b0596916ab9d43fa"}},{"ruleId":"D2","level":"warning","message":{"text":"PipelineModel.handleKey (cognitive 84): PipelineModel.handleKey has cognitive complexity 84 (threshold 15). Drivers by points: if/else 30 (73 pts), loops 2 (6 pts), boolean chains 4, match/switch 1 (nesting depth added 47). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef477095ca35aa8e4391c642c4c6e732bc41525d017fa48b176551cf10a91f50"}},{"ruleId":"D2","level":"warning","message":{"text":"inbox-triage.InboxTriage (cognitive 82): inbox-triage.InboxTriage has cognitive complexity 82 (threshold 15). Drivers by points: if/else 24 (29 pts), boolean chains 25, ternaries 12 (16 pts), loops 7, error handling 3 (5 pts) (nesting depth added 11). Of this number, 17 points are the body\u0027s own statements and 65 belong to 23 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/inbox/inbox-triage.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e37aacaca9951ebc7c42aaef63df607eaba0bc40debe87a030f41933e73767"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 80): route.POST has cognitive complexity 80 (threshold 15). Drivers by points: if/else 32 (40 pts), error handling 12 (17 pts), boolean chains 11, ternaries 7 (11 pts), loops 1 (nesting depth added 17). Of this number, 24 points are the body\u0027s own statements and 56 belong to 11 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/explore/ai/route.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"34af8edae4a1e04da391e68c4fa97ce33f73b62dd678d29c8bdc22eb6e4018f2"}},{"ruleId":"D2","level":"warning","message":{"text":"export-ats-text.formatAtsText (cognitive 77): export-ats-text.formatAtsText has cognitive complexity 77 (threshold 15). Drivers by points: if/else 22 (37 pts), ternaries 9 (21 pts), boolean chains 19 (nesting depth added 27). Of this number, 31 points are the body\u0027s own statements and 46 belong to 7 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"862be5b20e2bdcbbb1ee3dbda9dab8eed8c21dc9a48ceac09fae628c548dfa9d"}},{"ruleId":"D2","level":"warning","message":{"text":"followups-view.FollowupsView (cognitive 77): followups-view.FollowupsView has cognitive complexity 77 (threshold 15). Drivers by points: ternaries 22 (51 pts), if/else 13 (14 pts), boolean chains 10, error handling 1, loops 1 (nesting depth added 30). Of this number, 23 points are the body\u0027s own statements and 54 belong to 11 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb72280c009a399fd0c195ebb22a0eaa64e4c43475ae678ef1190a00b07e46a"}},{"ruleId":"D2","level":"warning","message":{"text":"upskill.runSelfTest (cognitive 76): upskill.runSelfTest has cognitive complexity 76 (threshold 15). Drivers by points: if/else 49 (62 pts), boolean chains 5, error handling 3 (5 pts), loops 4 (nesting depth added 15). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b3cfa8c86ffdc7e4e5f68bfbf1d578a63ddf7c7a9ec504082c719a4b8f1b72"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 76): fetch has cognitive complexity 76 (threshold 15). Drivers by points: if/else 9 (33 pts), ternaries 7 (20 pts), loops 4 (10 pts), boolean chains 9, error handling 1 (4 pts) (nesting depth added 46). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/occ.mjs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcca9b5dd9dfeaf26c06f155f63b7c99cfba850455d5376ae4a21d7efbe6b8e3"}},{"ruleId":"D2","level":"warning","message":{"text":"session.fillSession (cognitive 75): session.fillSession has cognitive complexity 75 (threshold 15). Drivers by points: if/else 21 (41 pts), error handling 8 (21 pts), boolean chains 5, ternaries 1 (5 pts), loops 2 (3 pts) (nesting depth added 38). Of this number, 68 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4d797ae1a2ac6e69f610c846d3bd47fe6d2f1f3a42e16757272d01289ca005"}},{"ruleId":"D2","level":"warning","message":{"text":"main (cognitive 69): main has cognitive complexity 69 (threshold 15). Drivers by points: if/else 20 (40 pts), loops 5 (13 pts), boolean chains 9, ternaries 3 (5 pts), error handling 1 (2 pts) (nesting depth added 31). Of this number, 68 points are the body\u0027s own statements and 1 belongs to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b99142cb5846380945882057be7c232a071654065faaa583bb1ef5a1a32f0db"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.configuredTemplateVariantsFromProfileSource (cognitive 68): update-system.configuredTemplateVariantsFromProfileSource has cognitive complexity 68 (threshold 15). Drivers by points: if/else 26 (50 pts), boolean chains 10, loops 3 (4 pts), error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 27). Of this number, 34 points are the body\u0027s own statements and 34 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1331}}}],"partialFingerprints":{"codehealthFindingId/v1":"860e93c4365dcf100b7245a846781f075d2a1ecbddb139c1368f5cd35903aa64"}},{"ruleId":"D2","level":"warning","message":{"text":"checkUrlLiveness (cognitive 68): checkUrlLiveness has cognitive complexity 68 (threshold 15). Drivers by points: if/else 17 (27 pts), boolean chains 14, error handling 5 (10 pts), ternaries 3 (7 pts), loops 3 (6 pts), other 4 (nesting depth added 22). Of this number, 38 points are the body\u0027s own statements and 30 belong to 10 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-browser.mjs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"40a1a31abd6381099dadc20d691719ca5295f0fb42b955b0fe82a33221485510"}},{"ruleId":"D2","level":"warning","message":{"text":"scan-dayforce.main (cognitive 66): scan-dayforce.main has cognitive complexity 66 (threshold 15). Drivers by points: if/else 20 (39 pts), loops 10 (19 pts), boolean chains 3, error handling 1 (3 pts), ternaries 1 (2 pts) (nesting depth added 31). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-dayforce.mjs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a99ce9c82d2ff5b9bb7dd3580c8fc94dec5b56b03c5545e4927070711d9aad"}},{"ruleId":"D2","level":"warning","message":{"text":"discover-ats.resolveCompany (cognitive 64): discover-ats.resolveCompany has cognitive complexity 64 (threshold 15). Drivers by points: if/else 18 (32 pts), ternaries 7 (22 pts), boolean chains 9, loops 1 (nesting depth added 29). Of this number, 63 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f1d195ade778d721c763ad01c67c2403e66bfcab4389e91b809fe4d567a317"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 62): fetch has cognitive complexity 62 (threshold 15). Drivers by points: if/else 37 (77 pts), ternaries 19 (43 pts), boolean chains 15, loops 5 (11 pts), error handling 4 (10 pts), other 2 (nesting depth added 76). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"484e1a8fbcc4e2a2606ccbacc76297387fa3ae2e3116e0a1926f4e0f0ec30350"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 62): fetch has cognitive complexity 62 (threshold 15). Drivers by points: if/else 19 (32 pts), boolean chains 9, ternaries 4 (9 pts), loops 5 (7 pts), error handling 2 (5 pts) (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/peoplesoft.mjs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"857066a05aba50b1b195d1c53f8c7619d835bcb9168292bba19578c0ac39d76c"}},{"ruleId":"D2","level":"warning","message":{"text":"salary-gap.printSummary (cognitive 61): salary-gap.printSummary has cognitive complexity 61 (threshold 15). Drivers by points: ternaries 8 (22 pts), if/else 15 (19 pts), loops 8 (18 pts), boolean chains 2 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf6fabd91daccb7e6c68904dc80cd437d535060eba4fece40e9e1cfba2f1816"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze-patterns.analyze (cognitive 60): analyze-patterns.analyze has cognitive complexity 60 (threshold 15). Drivers by points: if/else 21 (33 pts), boolean chains 14, ternaries 6 (7 pts), loops 5 (6 pts) (nesting depth added 14). Of this number, 40 points are the body\u0027s own statements and 20 belong to 6 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1281}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0aa87fdc14cdfc9b82ba958ef56aafe4cfc04be91f09393cf5ce81d948cefda"}},{"ruleId":"D2","level":"warning","message":{"text":"reply-matcher.matchCandidates (cognitive 59): reply-matcher.matchCandidates has cognitive complexity 59 (threshold 15). Drivers by points: if/else 15 (35 pts), boolean chains 21, loops 2 (3 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc21582149a5780e7f43a3df02590b1464d134cecff45ae48adad9de2f6cb191"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze-patterns.parseReport (cognitive 58): analyze-patterns.parseReport has cognitive complexity 58 (threshold 15). Drivers by points: boolean chains 27, if/else 19 (25 pts), loops 3 (6 pts) (nesting depth added 9). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":954}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e9b0c73375efd84d87c8e0422b97ca239e916f2d36e18919803d0afbb4644f"}},{"ruleId":"D2","level":"warning","message":{"text":"fold (cognitive 58): fold has cognitive complexity 58 (threshold 15). Drivers by points: if/else 11 (22 pts), ternaries 9 (17 pts), boolean chains 13, loops 5, other 1 (nesting depth added 19). Of this number, 54 points are the body\u0027s own statements and 4 belong to 11 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"9896d1817dc0e3c1397309e9ab105476a01f8f0a2c84cdbbe8063c05f27a6a4d"}},{"ruleId":"D2","level":"warning","message":{"text":"acquirePortalHealthLock (cognitive 58): acquirePortalHealthLock has cognitive complexity 58 (threshold 15). Drivers by points: if/else 11 (36 pts), error handling 6 (13 pts), boolean chains 5, other 3, loops 1 (nesting depth added 32). Of this number, 46 points are the body\u0027s own statements and 12 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"portal-health-lock.mjs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"590f6ef9ea81ec99a828db3fa3199b7757c12907df0765a03ce683eb2a280679"}},{"ruleId":"D2","level":"warning","message":{"text":"reply-watch.main (cognitive 57): reply-watch.main has cognitive complexity 57 (threshold 15). Drivers by points: if/else 16 (24 pts), error handling 3 (9 pts), ternaries 3 (9 pts), loops 3 (8 pts), boolean chains 7 (nesting depth added 25). Of this number, 28 points are the body\u0027s own statements and 29 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-watch.mjs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"24ba5d7e03aef215d13388f6dd8dcb65364d1f00a9b38eb4a92606b91b56afe4"}},{"ruleId":"D2","level":"warning","message":{"text":"apply-view.FieldRow (cognitive 57): apply-view.FieldRow has cognitive complexity 57 (threshold 15). Drivers by points: ternaries 14 (46 pts), boolean chains 10, if/else 1 (nesting depth added 32). Of this number, 50 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49ddb2d1010d258531ccd05e33d6fd0fa6bf84943356e4c7869c19a6e9fd129"}},{"ruleId":"D2","level":"warning","message":{"text":"runSelfTest (cognitive 57): runSelfTest has cognitive complexity 57 (threshold 15). Drivers by points: if/else 24 (31 pts), boolean chains 11, loops 8, ternaries 4, error handling 2 (3 pts) (nesting depth added 8). Of this number, 50 points are the body\u0027s own statements and 7 belong to 13 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-latex.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"a77905dd35600ee7b423d4ed840d43b5652fdbe9ace9f69cdc27c044f4c06ca9"}},{"ruleId":"D2","level":"warning","message":{"text":"parseCv (cognitive 57): parseCv has cognitive complexity 57 (threshold 15). Drivers by points: if/else 21 (35 pts), loops 8 (18 pts), boolean chains 3, other 1 (nesting depth added 24). Of this number, 30 points are the body\u0027s own statements and 27 belong to 4 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"95c9792479fbe343d15e5e8efcbfe7d56dd82fb7391fd37531c0ad2b359bdc52"}},{"ruleId":"D2","level":"warning","message":{"text":"job-store.JobsProvider (cognitive 56): job-store.JobsProvider has cognitive complexity 56 (threshold 15). Drivers by points: if/else 16 (31 pts), boolean chains 8, ternaries 7 (8 pts), error handling 4 (6 pts), loops 2 (3 pts) (nesting depth added 19). Most of this is not in the body itself: 0 of the 56 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 114, 142, 65, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/job-store.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2959c2714169a3440fa0814babf0aab4d7360c89aa7fa18e0e5d2ad1e73fd9"}},{"ruleId":"D2","level":"warning","message":{"text":"data.ComputeStatsMetrics (cognitive 56): data.ComputeStatsMetrics has cognitive complexity 56 (threshold 15). Drivers by points: if/else 20 (36 pts), loops 10 (13 pts), match/switch 3 (6 pts), boolean chains 1 (nesting depth added 22). Of this number, 53 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ba75d502abda28297e3109a9ebf7e056cb93d4794f251ffcaa4ea2ffb9fdd5"}},{"ruleId":"D2","level":"warning","message":{"text":"followup-cadence.extractContacts (cognitive 55): followup-cadence.extractContacts has cognitive complexity 55 (threshold 15). Drivers by points: if/else 16 (30 pts), boolean chains 12, loops 5 (9 pts), ternaries 4 (nesting depth added 18). Of this number, 16 points are the body\u0027s own statements and 39 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"191ef5af59143eca0ffb9c202f3f3413f96582db0ba16c2d6dd9351216d8b718"}},{"ruleId":"D2","level":"warning","message":{"text":"_engine.validateManifest (cognitive 55): _engine.validateManifest has cognitive complexity 55 (threshold 15). Drivers by points: if/else 23 (31 pts), boolean chains 14, ternaries 7, loops 3 (nesting depth added 8). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_engine.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3208b961f8e3262c0576e82c2aac67dacdc9734b606eb0046f1d7823271fcac"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 55): route.POST has cognitive complexity 55 (threshold 15). Drivers by points: if/else 24 (35 pts), boolean chains 8, error handling 6 (8 pts), ternaries 2 (3 pts), loops 1 (nesting depth added 14). Of this number, 29 points are the body\u0027s own statements and 26 belong to 7 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/cv/ingest/route.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"366a3c19d52d07dc3124c001bc388c633ad76473bd6cd005d3d1fff9a14cd8f4"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 55): fetch has cognitive complexity 55 (threshold 15). Drivers by points: if/else 9 (22 pts), boolean chains 12, loops 4 (9 pts), ternaries 3 (7 pts), error handling 2 (5 pts) (nesting depth added 25). Of this number, 51 points are the body\u0027s own statements and 4 belong to 5 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/arbeitsagentur.mjs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"0075c68268e5d2b283a2e585c2d8e4dca8e67940c3a6314dbf2f5f2883d422cb"}},{"ruleId":"D2","level":"warning","message":{"text":"cv-ingest.CvIngest (cognitive 53): cv-ingest.CvIngest has cognitive complexity 53 (threshold 15). Drivers by points: if/else 19 (27 pts), boolean chains 12, ternaries 7 (11 pts), error handling 2, loops 1 (nesting depth added 12). Most of this is not in the body itself: 11 of the 53 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 44, 146, 201, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c3cdcfaf24dab17f5a3d562678e9a6c69e07aab586fbbc7b16666d14978e5c2"}},{"ruleId":"D2","level":"warning","message":{"text":"renderSummary (cognitive 53): renderSummary has cognitive complexity 53 (threshold 15). Drivers by points: if/else 19 (26 pts), ternaries 7 (17 pts), loops 4 (7 pts), other 2, boolean chains 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cba5eb9efe962ab5d730adaf3828d495ed6d20e56e04c34884d7ec4eb75346b"}},{"ruleId":"D2","level":"warning","message":{"text":"computePortalStats (cognitive 53): computePortalStats has cognitive complexity 53 (threshold 15). Drivers by points: if/else 12 (33 pts), boolean chains 9, loops 4 (7 pts), ternaries 2, error handling 1, other 1 (nesting depth added 24). Of this number, 52 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"1456a7be0ac4ffeef53fe7c70ec3144f06f4571760e9d828c5ede3fee0c3a11f"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-pdf.generatePDF (cognitive 51): generate-pdf.generatePDF has cognitive complexity 51 (threshold 15). Drivers by points: if/else 30 (37 pts), boolean chains 7, loops 2 (4 pts), error handling 2, ternaries 1 (nesting depth added 9). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1367}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0bc3e1ce185a3bd8cfec8763c830432fde4fcfb87bea40e30cf1019898317a0"}},{"ruleId":"D2","level":"warning","message":{"text":"fetchCsb (cognitive 50): fetchCsb has cognitive complexity 50 (threshold 15). Drivers by points: if/else 11 (31 pts), ternaries 2 (7 pts), loops 3 (6 pts), error handling 2 (4 pts), boolean chains 2 (nesting depth added 30). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/successfactors.mjs"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"546cfc7a30fb074d823879a66f5102c6582b5f39afba51d00ca11fa6da9c44b2"}},{"ruleId":"D2","level":"warning","message":{"text":"main (cognitive 50): main has cognitive complexity 50 (threshold 15). Drivers by points: if/else 17 (32 pts), loops 4 (7 pts), ternaries 3 (7 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-interamt.mjs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd5bb0a36c325078bc28d81a666b6ed8c076b1b146c292636f606be0d18efa22"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 50): fetch has cognitive complexity 50 (threshold 15). Drivers by points: if/else 9 (26 pts), ternaries 5 (9 pts), error handling 2 (6 pts), loops 3 (6 pts), boolean chains 3 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/mokahr.mjs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"0754c2f996d7c515af117b631243d238ba0e78f8b193ce246a32f890b13cf4b1"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 50): fetch has cognitive complexity 50 (threshold 15). Drivers by points: if/else 9 (21 pts), ternaries 7 (13 pts), boolean chains 11, loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/getro.mjs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"29cc9d6ee1776c1725a495534245c8e5d8e00a3a9c9ffab8e2a51f45257d203e"}},{"ruleId":"D2","level":"warning","message":{"text":"acquireFollowupsLock (cognitive 49): acquireFollowupsLock has cognitive complexity 49 (threshold 15). Drivers by points: if/else 11 (35 pts), error handling 4 (9 pts), other 3, boolean chains 1, loops 1 (nesting depth added 29). Of this number, 39 points are the body\u0027s own statements and 10 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dfccdcacb0948064de4e063aa673d76bc2fcd9696689411dcced9a9eca50ed2"}},{"ruleId":"D2","level":"warning","message":{"text":"contact-extract.main (cognitive 48): contact-extract.main has cognitive complexity 48 (threshold 15). Drivers by points: if/else 18 (25 pts), boolean chains 16, ternaries 3 (7 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contact-extract.mjs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"e337a71450628c047faebfc759585cedc90ee358064c4e32df0f15070387311c"}},{"ruleId":"D2","level":"warning","message":{"text":"explorer-view.ExplorerView (cognitive 48): explorer-view.ExplorerView has cognitive complexity 48 (threshold 15). Drivers by points: boolean chains 28, ternaries 7 (11 pts), if/else 7 (8 pts), error handling 1 (nesting depth added 5). Of this number, 32 points are the body\u0027s own statements and 16 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explorer-view.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"46dc6febd678abdd9131450e2ea8644947a08ccb49ba609bdd0a9434eb6a2ccc"}},{"ruleId":"D2","level":"warning","message":{"text":"extract-json-object.extractJsonObject (cognitive 48): extract-json-object.extractJsonObject has cognitive complexity 48 (threshold 15). Drivers by points: if/else 22 (37 pts), loops 5 (6 pts), error handling 2 (4 pts), boolean chains 1 (nesting depth added 18). Of this number, 44 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/extract-json-object.mjs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce5ada9c7d6e253d9d933ad35f2181a5ddb9dab6142ea9f18493e324f67b279"}},{"ruleId":"D2","level":"warning","message":{"text":"ViewerModel.renderAll (cognitive 48): ViewerModel.renderAll has cognitive complexity 48 (threshold 15). Drivers by points: if/else 11 (26 pts), loops 8 (20 pts), boolean chains 2 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d462ffbb1aaf47d3777f0741a72c988bd674179aaf32eb4112f13df414ca7a5"}},{"ruleId":"D2","level":"warning","message":{"text":"computeResponsiveness (cognitive 48): computeResponsiveness has cognitive complexity 48 (threshold 15). Drivers by points: if/else 11 (21 pts), ternaries 11 (20 pts), boolean chains 5, loops 1, other 1 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"746e82f87afe6662b57e269182c495af89d19c5b90b775d2b1c0fce87a764ac3"}},{"ruleId":"D2","level":"warning","message":{"text":"printSummary (cognitive 48): printSummary has cognitive complexity 48 (threshold 15). Drivers by points: if/else 15 (18 pts), loops 10 (17 pts), ternaries 3 (8 pts), boolean chains 4, other 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1585}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7c181a4fa0de07daf0dd627209e8363127fd5738b1f7ac6631b8e45a891807"}},{"ruleId":"D2","level":"warning","message":{"text":"computePortalRecommendations (cognitive 48): computePortalRecommendations has cognitive complexity 48 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 16, ternaries 4 (7 pts), loops 4, other 3, error handling 1 (nesting depth added 10). Of this number, 44 points are the body\u0027s own statements and 4 belong to 3 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"1537b81fab3402ce8015b2fae4b076731de6741e0fd5433c45c4e171fb57ca78"}},{"ruleId":"D2","level":"warning","message":{"text":"findCrossListings (cognitive 48): findCrossListings has cognitive complexity 48 (threshold 15). Drivers by points: if/else 10 (26 pts), ternaries 7 (13 pts), loops 3 (4 pts), boolean chains 3, other 2 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fingerprint-core.mjs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98d7325e01ee53abf1127b778a2081b919b339ab7e7fbfac3505da562c8f6fb"}},{"ruleId":"D2","level":"warning","message":{"text":"diagnose.verifyFill (cognitive 47): diagnose.verifyFill has cognitive complexity 47 (threshold 15). Drivers by points: if/else 15 (24 pts), boolean chains 14, ternaries 3 (6 pts), loops 3 (nesting depth added 12). Most of this is not in the body itself: 9 of the 47 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 218, 214, 219). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/diagnose.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"421d65a23c0e3da187cf94b8274f841e6bf41f854fcbabd701acf318fe33ef4e"}},{"ruleId":"D2","level":"warning","message":{"text":"drive.driveSession (cognitive 47): drive.driveSession has cognitive complexity 47 (threshold 15). Drivers by points: if/else 14 (23 pts), boolean chains 14, ternaries 4 (6 pts), error handling 2 (3 pts), loops 1 (nesting depth added 12). Of this number, 44 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/drive.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c2a19d3babe9c51f4b5abecb5d40a0c77525be4841820b0423c8201f22ef18e"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 47): fetch has cognitive complexity 47 (threshold 15). Drivers by points: if/else 11 (23 pts), boolean chains 10, ternaries 4 (8 pts), loops 2 (3 pts), error handling 1 (2 pts), other 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffe193fff58cab66012092e5f361988ad482e1c530ce3dade5f0cf019ad75834"}},{"ruleId":"D2","level":"warning","message":{"text":"vc-portfolios.parseA16zPayload (cognitive 46): vc-portfolios.parseA16zPayload has cognitive complexity 46 (threshold 15). Drivers by points: if/else 9 (22 pts), ternaries 3 (10 pts), boolean chains 7, loops 4 (5 pts), error handling 1 (2 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"seeds/vc-portfolios.mjs"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"e039ce8d24ed634f880c848bd2a1f0d58e3d0963817c6982cb05a7850f854f11"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-ats.auditAts (cognitive 46): verify-ats.auditAts has cognitive complexity 46 (threshold 15). Drivers by points: if/else 27 (31 pts), loops 4 (7 pts), boolean chains 6, ternaries 1 (2 pts) (nesting depth added 8). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-ats.mjs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"725507426992689ddce471c22ac3955d0f373f5b72a481028d0792f14fa8cf77"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 46): fetch has cognitive complexity 46 (threshold 15). Drivers by points: if/else 15 (31 pts), loops 3 (5 pts), boolean chains 4, error handling 1 (3 pts), ternaries 2 (3 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"d03263736e2ebbb4239823baf881a9cfd8f2024c7ceb5239662da47e57199441"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 46): fetch has cognitive complexity 46 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 10, error handling 4 (8 pts), loops 4 (6 pts), ternaries 2 (3 pts) (nesting depth added 16). Of this number, 25 points are the body\u0027s own statements and 21 belong to 6 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/vdab.mjs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"4996566fd47019bfed3c6fe9647c5bcdb040c3e6ff2e20834099e4f0e4b0dc4d"}},{"ruleId":"D2","level":"warning","message":{"text":"company-history.buildCompanyCards (cognitive 45): company-history.buildCompanyCards has cognitive complexity 45 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 9, ternaries 8 (9 pts), loops 6 (8 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f463caf28fdbe03cdb5e91d515d8dbe878e66fbd2b9129a65f0b152109f5b0e"}},{"ruleId":"D2","level":"warning","message":{"text":"ashby.formatLocation (cognitive 45): ashby.formatLocation has cognitive complexity 45 (threshold 15). Drivers by points: if/else 10 (24 pts), boolean chains 8, loops 3 (8 pts), ternaries 3 (5 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ashby.mjs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac5267ea32d6fec7c2474ecc6d48e0ea3c0eb531a20e235abbaef1f2cf89288"}},{"ruleId":"D2","level":"warning","message":{"text":"pipeline-view.PipelineView (cognitive 44): pipeline-view.PipelineView has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 15 (25 pts), if/else 8 (10 pts), boolean chains 7, loops 2 (nesting depth added 12). Most of this is not in the body itself: 11 of the 44 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 70, 95, 84, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/pipeline-view.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"df96b7c97bb46760dbcd85ad0ee31db9d971d5f452fe95b41ff909ab43c97bec"}},{"ruleId":"D2","level":"warning","message":{"text":"data.ParseApplications (cognitive 44): data.ParseApplications has cognitive complexity 44 (threshold 15). Drivers by points: if/else 19 (40 pts), boolean chains 2, loops 2 (nesting depth added 21). Of this number, 41 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"33a2e80ffded2bf0560083417cb1b6340c096954a031aeb989bae680ae0b149e"}},{"ruleId":"D2","level":"warning","message":{"text":"checkMainChannel (cognitive 44): checkMainChannel has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 8 (14 pts), boolean chains 12, error handling 5 (9 pts), if/else 9 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":2929}}}],"partialFingerprints":{"codehealthFindingId/v1":"49bf79fce7976518d125581888274e37540c90ddad9ea2794628cc8f59a768fc"}},{"ruleId":"D2","level":"warning","message":{"text":"callOpenRouter (cognitive 44): callOpenRouter has cognitive complexity 44 (threshold 15). Drivers by points: if/else 17 (32 pts), error handling 3 (6 pts), other 3, boolean chains 2, loops 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3ba50cad4da8d44e00e6dee29bf17aef85719dbbbbb8ee7efbcdd8072a8986"}},{"ruleId":"D2","level":"warning","message":{"text":"computeRejectionLatency (cognitive 44): computeRejectionLatency has cognitive complexity 44 (threshold 15). Drivers by points: if/else 14 (27 pts), ternaries 6 (8 pts), boolean chains 7, loops 2 (nesting depth added 15). Of this number, 42 points are the body\u0027s own statements and 2 belong to 5 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rejection-latency.mjs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a632d7a676f66b5983b61abb26d684fb6d580ea36f17871228737ded2fc666"}},{"ruleId":"D2","level":"warning","message":{"text":"check-jd-archive.checkJdArchive (cognitive 43): check-jd-archive.checkJdArchive has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 10 (25 pts), if/else 6 (11 pts), boolean chains 4, error handling 1 (2 pts), loops 1 (nesting depth added 21). Of this number, 42 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fc84e1465c33f90441b4b9ba99c1cd95f7155a0c0888fbb48af21aefdb570bd"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 43): route.POST has cognitive complexity 43 (threshold 15). Drivers by points: if/else 15 (20 pts), ternaries 8 (11 pts), error handling 6 (8 pts), boolean chains 3, loops 1 (nesting depth added 10). Of this number, 18 points are the body\u0027s own statements and 25 belong to 8 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/assistant/route.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"57acdb15caf8c4718bbf93831af22da1b5cec2bd4078b5e0aab529e93795049e"}},{"ruleId":"D2","level":"warning","message":{"text":"renderSummary (cognitive 43): renderSummary has cognitive complexity 43 (threshold 15). Drivers by points: if/else 12 (23 pts), ternaries 6 (13 pts), loops 3 (5 pts), boolean chains 2 (nesting depth added 20). Of this number, 42 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d8d4e3f9cdd363104ac924535f730daaa952448b3bde6967592329d78b8a85"}},{"ruleId":"D2","level":"warning","message":{"text":"stats.printSummary (cognitive 42): stats.printSummary has cognitive complexity 42 (threshold 15). Drivers by points: ternaries 9 (19 pts), if/else 15 (17 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":724}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cb13bb577d79e7e5b690e7d151427bff8d4a1342f581ae794415aa4a8f6b0cf"}},{"ruleId":"D2","level":"warning","message":{"text":"intake.listSourceFiles (cognitive 42): intake.listSourceFiles has cognitive complexity 42 (threshold 15). Drivers by points: if/else 12 (24 pts), error handling 5 (10 pts), boolean chains 3, ternaries 2 (3 pts), loops 2 (nesting depth added 18). Most of this is not in the body itself: 1 of the 42 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 212, 200, 219, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"1700d6f4bcd1cfc6514a68fe14a282d46c5ff27548110f871f36bc5432e750f4"}},{"ruleId":"D2","level":"warning","message":{"text":"data.enrichAppURLsByCompany (cognitive 42): data.enrichAppURLsByCompany has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (30 pts), loops 4 (9 pts), boolean chains 3 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"59879cbc37e90d62b205ed64b4275549e0e0f88181d482f0e7819a501f27301c"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch::runQuery (cognitive 42): fetch::runQuery has cognitive complexity 42 (threshold 15). Drivers by points: if/else 8 (18 pts), ternaries 7 (13 pts), boolean chains 5, error handling 1 (3 pts), loops 1 (2 pts), other 1 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd00ed4a860e0a2bc065f9db8e771d0fad591c51e085b6a8c1300473853e6966"}},{"ruleId":"D2","level":"warning","message":{"text":"parseMarkdownRows (cognitive 42): parseMarkdownRows has cognitive complexity 42 (threshold 15). Drivers by points: if/else 11 (24 pts), boolean chains 6, ternaries 4 (6 pts), loops 2 (3 pts), other 3 (nesting depth added 16). Of this number, 39 points are the body\u0027s own statements and 3 belong to 6 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea8a57375fe2a3f3accda60fa814d2d51e8e7e09e790388c03bebfbc46d54bc"}},{"ruleId":"D2","level":"warning","message":{"text":"stripNonRendered (cognitive 42): stripNonRendered has cognitive complexity 42 (threshold 15). Drivers by points: if/else 12 (30 pts), ternaries 3 (10 pts), boolean chains 1, loops 1 (nesting depth added 25). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/generalist-world.mjs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"4607f0711f534519213e67c143307595abfb85968378f0d63069b7468216b9cd"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.runScanner (cognitive 41): scan.runScanner has cognitive complexity 41 (threshold 15). Drivers by points: if/else 23 (28 pts), boolean chains 5, error handling 2 (3 pts), ternaries 2 (3 pts), loops 2 (nesting depth added 7). Most of this is not in the body itself: 0 of the 41 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 283, 346, 363, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/scan.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"00525a6ab40bf06c9f1dc552baaf29fcb13f5ce75b3140fa3787c89611d04e2d"}},{"ruleId":"D2","level":"warning","message":{"text":"extractContacts::add (cognitive 41): extractContacts::add has cognitive complexity 41 (threshold 15). Drivers by points: if/else 12 (22 pts), boolean chains 8, loops 2 (4 pts), ternaries 4, other 3 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f345ab6447f9d138ac4b5924a11e58e49fd2df0553ffde75da5bb31fba5761b"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 41): fetch has cognitive complexity 41 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 4 (9 pts), boolean chains 3, error handling 1 (3 pts), ternaries 2 (3 pts), other 2 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/builtin.mjs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfebff2ddcedc89f64b71df4ca17742fe7d10aacfa5aec485875462ab5a629e0"}},{"ruleId":"D2","level":"warning","message":{"text":"cmdRun (cognitive 41): cmdRun has cognitive complexity 41 (threshold 15). Drivers by points: if/else 17 (23 pts), ternaries 4 (7 pts), boolean chains 6, loops 2 (4 pts), other 1 (nesting depth added 11). Of this number, 39 points are the body\u0027s own statements and 2 belong to 7 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins.mjs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d948b6aab7226a49042d8f88564ce177119975c3557d9a9cea5a15ec7295f7"}},{"ruleId":"D2","level":"warning","message":{"text":"searchInteramt (cognitive 41): searchInteramt has cognitive complexity 41 (threshold 15). Drivers by points: error handling 11 (26 pts), if/else 8 (13 pts), loops 2 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-interamt.mjs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"763a9a3f7849ba292805b6282755e04cdb01f244953da73eff231be18db87328"}},{"ruleId":"D2","level":"warning","message":{"text":"discover-ats.parseCompanyInput (cognitive 40): discover-ats.parseCompanyInput has cognitive complexity 40 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 11, ternaries 4 (9 pts), loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 10). Of this number, 22 points are the body\u0027s own statements and 18 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"f68ee6c74927f918ee444c0e7717440d05409612b2d3d1cb3fd7cc054ffccf8f"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.verifyOffers (cognitive 40): scan.verifyOffers has cognitive complexity 40 (threshold 15). Drivers by points: if/else 9 (20 pts), ternaries 6 (14 pts), boolean chains 3, error handling 2, loops 1 (nesting depth added 19). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":3112}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac204cc76b6e9123b4d5da8af6f0dc8a204be8dbe6cc29049a0919b3d85c0e8a"}},{"ruleId":"D2","level":"warning","message":{"text":"prevueaps.parsePrevueapsResponse (cognitive 39): prevueaps.parsePrevueapsResponse has cognitive complexity 39 (threshold 15). Drivers by points: if/else 9 (18 pts), ternaries 5 (11 pts), boolean chains 6, error handling 1 (3 pts), loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/prevueaps.mjs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"589bcd462e360033d3c90d36e5bf325fbd093c9dfbd030f0f94410a072352bd6"}},{"ruleId":"D2","level":"warning","message":{"text":"runBatchFromManifest (cognitive 39): runBatchFromManifest has cognitive complexity 39 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 10, error handling 6 (7 pts), other 3, ternaries 1 (3 pts), loops 1 (nesting depth added 9). Of this number, 38 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1633}}}],"partialFingerprints":{"codehealthFindingId/v1":"839964b61435a02b6c62722818b4631f707276b7d7197fbe9427933c0a0073a5"}},{"ruleId":"D2","level":"warning","message":{"text":"parseCompensation (cognitive 39): parseCompensation has cognitive complexity 39 (threshold 15). Drivers by points: if/else 11 (14 pts), ternaries 8 (9 pts), boolean chains 8, other 8 (nesting depth added 4). Of this number, 26 points are the body\u0027s own statements and 13 belong to 6 function items inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ashby.mjs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"0372a0d702b4a032ad3b7c6e5745809d23cbaa64ce57c2a0c73cb097191c639e"}},{"ruleId":"D2","level":"warning","message":{"text":"check-liveness.main (cognitive 38): check-liveness.main has cognitive complexity 38 (threshold 15). Drivers by points: if/else 15 (19 pts), ternaries 7 (11 pts), boolean chains 7, loops 1 (nesting depth added 8). Of this number, 36 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-liveness.mjs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d14b91e746de60257d087117623480b9f2ad57f0026f5a606073a2e9116ec09f"}},{"ruleId":"D2","level":"warning","message":{"text":"jsonc-parse.stripJsoncSyntax (cognitive 38): jsonc-parse.stripJsoncSyntax has cognitive complexity 38 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 6, loops 2 (4 pts) (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jsonc-parse.mjs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9783646d6589f355d7f45789ae020a061250bc8f7949138150fba51537eca60e"}},{"ruleId":"D2","level":"warning","message":{"text":"api.requestJson (cognitive 38): api.requestJson has cognitive complexity 38 (threshold 15). Drivers by points: if/else 15 (23 pts), error handling 5 (7 pts), boolean chains 5, ternaries 2 (3 pts) (nesting depth added 11). Of this number, 20 points are the body\u0027s own statements and 18 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee6c2a1e325e7459ef8a75d1c9f9a68ad65542f359f1730736bd3578395aaad5"}},{"ruleId":"D2","level":"warning","message":{"text":"eightfold.parseEightfoldResponse (cognitive 38): eightfold.parseEightfoldResponse has cognitive complexity 38 (threshold 15). Drivers by points: if/else 10 (20 pts), ternaries 4 (10 pts), boolean chains 4, error handling 1 (3 pts), loops 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/eightfold.mjs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0963810b86672170f27ce57ecfc0f9d361b14ab234e2d6a2c697e1c2484f698"}},{"ruleId":"D2","level":"warning","message":{"text":"StatsModel.renderPieChart (cognitive 38): StatsModel.renderPieChart has cognitive complexity 38 (threshold 15). Drivers by points: if/else 10 (26 pts), loops 6 (10 pts), boolean chains 2 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/stats.go"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"5697d924eb79dbcfd1c5cc9fd556a21459b4d49aa49aed081210d242aa53749c"}},{"ruleId":"D2","level":"warning","message":{"text":"printSummary (cognitive 38): printSummary has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 8 (23 pts), if/else 5 (7 pts), loops 3 (6 pts), boolean chains 2 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"assessment-log.mjs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"da043e1e4d00c9015acca21e0bb48478c146114293a8446632af460443c98dd6"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 38): fetch has cognitive complexity 38 (threshold 15). Drivers by points: if/else 14 (27 pts), ternaries 3 (7 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/csod.mjs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc15c413fcceaa774d2cfe5a41e6d684caa6b8b0f2e2064233eca585e1311e6"}},{"ruleId":"D2","level":"warning","message":{"text":"hiringroom.parseJsonLdJobs (cognitive 37): hiringroom.parseJsonLdJobs has cognitive complexity 37 (threshold 15). Drivers by points: if/else 7 (22 pts), error handling 2 (5 pts), ternaries 2 (5 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/hiringroom.mjs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a052450bf60d574791452897855fd33bc781bc6d290157f0b643419a4ab9687"}},{"ruleId":"D2","level":"warning","message":{"text":"data.UpdateApplicationStatusAndNotes (cognitive 37): data.UpdateApplicationStatusAndNotes has cognitive complexity 37 (threshold 15). Drivers by points: if/else 21 (30 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 10). Of this number, 33 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f9a1463674310a5335dc26f2866b4dd7679f01634e3088d668be8830a5fb95"}},{"ruleId":"D2","level":"warning","message":{"text":"buildCandidates (cognitive 37): buildCandidates has cognitive complexity 37 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 4 (12 pts), boolean chains 10, loops 2 (nesting depth added 14). Of this number, 31 points are the body\u0027s own statements and 6 belong to 6 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f7e2be72fe80102599b6afab6dbf4d7030939482505625a8543d52f0a0788c0"}},{"ruleId":"D2","level":"warning","message":{"text":"greenhouse.buildOfficeMap (cognitive 36): greenhouse.buildOfficeMap has cognitive complexity 36 (threshold 15). Drivers by points: if/else 5 (15 pts), ternaries 3 (11 pts), loops 3 (8 pts), boolean chains 2 (nesting depth added 23). Most of this is not in the body itself: 0 of the 36 points are its own statements and the rest belongs to one function literal inside it that branches (line 115). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/greenhouse.mjs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e09d21fb2b902277d975828396ea484461c67cb9414875a0fdd55c81993096"}},{"ruleId":"D2","level":"warning","message":{"text":"build-cv-latex.main (cognitive 36): build-cv-latex.main has cognitive complexity 36 (threshold 15). Drivers by points: boolean chains 16, if/else 8, ternaries 4 (6 pts), loops 3 (4 pts), error handling 2 (nesting depth added 3). Of this number, 30 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-latex.mjs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"978137f970d08946a30778d7db80115e31e0f87c5769bdec07065bb42eedc2bd"}},{"ruleId":"D2","level":"warning","message":{"text":"contacts.printSummary (cognitive 36): contacts.printSummary has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 7 (14 pts), if/else 10, loops 5 (10 pts), boolean chains 2 (nesting depth added 12). Of this number, 32 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed17c12bc7af1f325af107a75b23862747b351d32617695c5b8a31616cb8202"}},{"ruleId":"D2","level":"warning","message":{"text":"appModel.Update (cognitive 36): appModel.Update has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (31 pts), match/switch 2 (3 pts), boolean chains 2 (nesting depth added 17). Of this number, 34 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/main.go"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b766fa40fce6b3521cad2e93b27a958b61705e61f609b5123c179beab967fb9"}},{"ruleId":"D2","level":"warning","message":{"text":"readDom (cognitive 36): readDom has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 5 (14 pts), if/else 5 (9 pts), boolean chains 8, loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 15). Most of this is not in the body itself: 0 of the 36 points are its own statements and the rest belongs to 5 function items inside it that branch ((anonymous), (anonymous)::(anonymous), (anonymous)::(anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"browser-extract.mjs"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"393eea75f1f67b4854a84a589b3be2e3ffc528b8f1d9be9287715bcd725d933f"}},{"ruleId":"D2","level":"warning","message":{"text":"scanBoard (cognitive 36): scanBoard has cognitive complexity 36 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 6, ternaries 3 (6 pts), loops 3, error handling 1 (2 pts), other 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-dayforce.mjs"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6ed900f8d85c26f56202ef00c90db9df6c6dad41f1524e57a04902a4c1b0afe"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 36): fetch has cognitive complexity 36 (threshold 15). Drivers by points: if/else 11 (22 pts), ternaries 3 (6 pts), boolean chains 3, loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/phenom.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9361d0ef10635876262da8f2aea31815225a1bccaa9d0d4862f7450368c419"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-portals.discoverAlternates (cognitive 35): verify-portals.discoverAlternates has cognitive complexity 35 (threshold 15). Drivers by points: if/else 7 (23 pts), loops 3 (6 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24e46a5b3f77b873ee5a5c722d4c2c68fafe5f2e673c301ce978f7ae0b632e7"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-pdf.scanNesting (cognitive 35): generate-pdf.scanNesting has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (29 pts), boolean chains 5, loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7e61b45fd30618944e37d2b9ba93527b72c45b9c1c6f9a95c35cc997dc494e"}},{"ruleId":"D2","level":"warning","message":{"text":"discovery-card.DiscoveryCard (cognitive 35): discovery-card.DiscoveryCard has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 9 (24 pts), boolean chains 11 (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/discovery-card.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"636112d0ca117fab189b56d045f65490185b113ff4785115f854e3d7719ff26a"}},{"ruleId":"D2","level":"warning","message":{"text":"data.acquireTrackerLock (cognitive 35): data.acquireTrackerLock has cognitive complexity 35 (threshold 15). Drivers by points: if/else 17 (32 pts), boolean chains 2, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/tracker_lock.go"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"c736020e4813dd54f70e55667f2c900871586f27ea866b84b8762f84b8ab63af"}},{"ruleId":"D2","level":"warning","message":{"text":"analyzeFromContent (cognitive 35): analyzeFromContent has cognitive complexity 35 (threshold 15). Drivers by points: if/else 8 (16 pts), ternaries 6 (12 pts), boolean chains 3, loops 2, other 2 (nesting depth added 14). Of this number, 31 points are the body\u0027s own statements and 4 belong to 9 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":829}}}],"partialFingerprints":{"codehealthFindingId/v1":"b318b95e2e7d8190b09fc2296b1a41892105256192baddc481f27b171b5689dd"}},{"ruleId":"D2","level":"warning","message":{"text":"fetchHnDiscovery (cognitive 35): fetchHnDiscovery has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 5 (14 pts), boolean chains 9, if/else 4 (9 pts), loops 2 (3 pts) (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ef7c777d32ea7f11b6e3559bc96ae0c45a8e320860e48533cbf2db38199f3aa"}},{"ruleId":"D2","level":"warning","message":{"text":"selfTest (cognitive 35): selfTest has cognitive complexity 35 (threshold 15). Drivers by points: boolean chains 34, if/else 1. Of this number, 27 points are the body\u0027s own statements and 8 belong to 13 function items inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f35b764777cf5cc24642d99c8f9508566da7ab4326decfd6164b96194d3087"}},{"ruleId":"D2","level":"warning","message":{"text":"seedBackfill (cognitive 35): seedBackfill has cognitive complexity 35 (threshold 15). Drivers by points: if/else 8 (16 pts), error handling 2 (5 pts), boolean chains 4, other 4, loops 2 (3 pts), ternaries 2 (3 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"41e0327e5aabbda24d42791adbc0a898ce8696eedb860ffb63aea68746bc0667"}},{"ruleId":"D2","level":"warning","message":{"text":"computeCalibration (cognitive 35): computeCalibration has cognitive complexity 35 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 5, ternaries 3 (5 pts), loops 2 (4 pts), other 2 (nesting depth added 10). Of this number, 32 points are the body\u0027s own statements and 3 belong to 5 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"calibrate.mjs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5c974025c0d3e5311036da1830dd24b8394169bcc9d8876d08c0cd0949dfa1"}},{"ruleId":"D2","level":"warning","message":{"text":"validateProfile (cognitive 35): validateProfile has cognitive complexity 35 (threshold 15). Drivers by points: if/else 13 (16 pts), boolean chains 11, ternaries 2 (4 pts), loops 3, other 1 (nesting depth added 5). Most of this is not in the body itself: 14 of the 35 points are its own statements and the rest belongs to 4 function items inside it that branch (checkFact, (anonymous), (anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"31c02716b348fbb2d8e5ae719ab662bd26b7f9b6acb2bee639a9a91b40eefdf7"}},{"ruleId":"D2","level":"warning","message":{"text":"createCachedLookup (cognitive 35): createCachedLookup has cognitive complexity 35 (threshold 15). Drivers by points: if/else 10 (11 pts), other 10, ternaries 8 (9 pts), boolean chains 3, loops 2 (nesting depth added 2). Most of this is not in the body itself: 8 of the 35 points are its own statements and the rest belongs to 8 function items inside it that branch (cachedLookup, cachedLookup::resolve::(anonymous), guarded::(anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_dns-cache.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac38dbc04d675dd8a28c8c95b39c610f3185faeb4eb0ebc827012cf0ba6caaa"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 35): fetch has cognitive complexity 35 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 7, loops 3 (6 pts), error handling 1 (3 pts), ternaries 2, other 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobbankca.mjs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e4adcfc296953a1e521b6974695f066bd0e3f98021ad247d9224986cf00e0e8"}},{"ruleId":"D2","level":"warning","message":{"text":"reply-matcher.classifyReply (cognitive 34): reply-matcher.classifyReply has cognitive complexity 34 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 13, ternaries 1 (2 pts), loops 1 (nesting depth added 6). Of this number, 31 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2c2b9134a2a253cc340686ebe58410a9068d70c822fa3d4105142783b02fe14"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.buildCooldownFilter (cognitive 34): scan.buildCooldownFilter has cognitive complexity 34 (threshold 15). Drivers by points: if/else 9 (27 pts), boolean chains 6, loops 1 (nesting depth added 18). Most of this is not in the body itself: 2 of the 34 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 1212, 1243, 1241). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1205}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3e8ca0296122a38d999be86dceb16dce70a0b0e1148c6ca1df41a2e5757f50"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.collectSeenUrls (cognitive 34): scan.collectSeenUrls has cognitive complexity 34 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 5 (8 pts), boolean chains 5 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1667}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7810f19817f385953a3b2dfd132abf6143f7b3d18ace4cef0ef144e4114752"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-cv-facts.runCli (cognitive 34): verify-cv-facts.runCli has cognitive complexity 34 (threshold 15). Drivers by points: if/else 12 (14 pts), loops 5 (11 pts), ternaries 3 (5 pts), boolean chains 2, error handling 2 (nesting depth added 10). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":1385}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd45d2a9cd4747dbdd07822da32432adf7acef04e9d47d632f13ce4ceb6cf037"}},{"ruleId":"D2","level":"warning","message":{"text":"scan-hn.main (cognitive 34): scan-hn.main has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (23 pts), boolean chains 4, loops 2 (4 pts), error handling 1 (3 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-hn.mjs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d4af3485c73c8736c75ab696991041c34262f33b703074dcc30edbff664e9f4"}},{"ruleId":"D2","level":"warning","message":{"text":"buildCompanyCanonicalizer (cognitive 34): buildCompanyCanonicalizer has cognitive complexity 34 (threshold 15). Drivers by points: if/else 6 (18 pts), loops 4 (9 pts), boolean chains 3, ternaries 1 (3 pts), other 1 (nesting depth added 19). Of this number, 33 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1806}}}],"partialFingerprints":{"codehealthFindingId/v1":"5186ff2ca279799fe0f5aed025cb0b6649fea5b7e3b620336a108c151393ec18"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 34): fetch has cognitive complexity 34 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 9, ternaries 4 (6 pts), error handling 1 (3 pts), loops 2 (3 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/taleo.mjs"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"8797b41c7e401ff51afd1d952ab9cfb4e4db5d576ebad54f8f32a036fcc9b40a"}},{"ruleId":"D2","level":"warning","message":{"text":"data.deriveNoteFields (cognitive 33): data.deriveNoteFields has cognitive complexity 33 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 4, loops 4, match/switch 2 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/derive.go"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"a858ecc8156b3d6997bfc2168a15ea3114923c5eb0739fe38b659ee22a8f6115"}},{"ruleId":"D2","level":"warning","message":{"text":"data.CanonicalizeLocation (cognitive 33): data.CanonicalizeLocation has cognitive complexity 33 (threshold 15). Drivers by points: if/else 17 (28 pts), boolean chains 2, match/switch 1 (2 pts), loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dd7051454742ac29731ea3e45ac87b0e71c3c16d0048435327ac4446f013789"}},{"ruleId":"D2","level":"warning","message":{"text":"trackerLock.release (cognitive 33): trackerLock.release has cognitive complexity 33 (threshold 15). Drivers by points: if/else 18 (30 pts), boolean chains 3 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/tracker_lock.go"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6e133160b3c1c543c3014ce80ee1ca3cbc1a7f394ed90ad132656014a64a53a"}},{"ruleId":"D2","level":"warning","message":{"text":"writeVcf (cognitive 33): writeVcf has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 7 (16 pts), if/else 9 (13 pts), boolean chains 3, other 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"da569ab4ef414f8018bfa97f852cbc29645ae3f91423ff355633653c88a373d0"}},{"ruleId":"D2","level":"warning","message":{"text":"main (cognitive 33): main has cognitive complexity 33 (threshold 15). Drivers by points: if/else 13 (19 pts), loops 3 (5 pts), other 4, error handling 1 (2 pts), ternaries 2, boolean chains 1 (nesting depth added 9). Of this number, 31 points are the body\u0027s own statements and 2 belong to 4 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rank-pipeline.mjs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"716feff980ce2f42414fe7b8f32e50f7ca26138ed3d0604833d605b3ae909679"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze-patterns.buildPatternSignals (cognitive 32): analyze-patterns.buildPatternSignals has cognitive complexity 32 (threshold 15). Drivers by points: loops 9 (16 pts), if/else 4 (9 pts), boolean chains 4, ternaries 3 (nesting depth added 12). Of this number, 30 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1206}}}],"partialFingerprints":{"codehealthFindingId/v1":"2110605f71644d22be8047af333895da3adf4a3c45b789a626cb0a0bbd9c2500"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-portals.verifyCompanies (cognitive 32): verify-portals.verifyCompanies has cognitive complexity 32 (threshold 15). Drivers by points: if/else 8 (21 pts), boolean chains 7, ternaries 2 (3 pts), loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac061f133ee5114f54598e38b61158248d1acfe8566e84f8eb0cc36fd9d5670"}},{"ruleId":"D2","level":"warning","message":{"text":"ultipro.extractCandidateOpportunityDetail (cognitive 32): ultipro.extractCandidateOpportunityDetail has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (25 pts), error handling 1 (4 pts), boolean chains 2, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd604c4caa7e37c562b3279ba55a239d58979950e63b06029ef12919673cfbeb"}},{"ruleId":"D2","level":"warning","message":{"text":"data.loadJobURLs (cognitive 32): data.loadJobURLs has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (26 pts), boolean chains 4, loops 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35fd702cfdb5b57cbc7501290766f368368a49a13ef11c5da95575487746942"}},{"ruleId":"D2","level":"warning","message":{"text":"acquireTrackerLock::release (cognitive 32): acquireTrackerLock::release has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (25 pts), error handling 3 (5 pts), boolean chains 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-utils.mjs"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"2920ceacd39ccb17d1cf27d72751e09d352c1ca3273596ab6fe13b81458a9910"}},{"ruleId":"D2","level":"warning","message":{"text":"checkFreshness (cognitive 32): checkFreshness has cognitive complexity 32 (threshold 15). Drivers by points: if/else 7 (21 pts), boolean chains 3, loops 2 (3 pts), ternaries 1 (3 pts), other 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"30dc5aad1712f4ddae52b880a34b10a861eeb52d1b898250f0688a1e39b1af63"}},{"ruleId":"D2","level":"warning","message":{"text":"validatePortalsConfig::validateEntryList (cognitive 32): validatePortalsConfig::validateEntryList has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (24 pts), boolean chains 5, ternaries 1 (2 pts), loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d6464a8cc741b2f6895ae0fc56b46e7e60314d7f71c7f14af7f50b149c7cbd"}},{"ruleId":"D2","level":"warning","message":{"text":"buildSvg (cognitive 32): buildSvg has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 11 (20 pts), if/else 3 (5 pts), boolean chains 4, other 2, loops 1 (nesting depth added 11). Of this number, 28 points are the body\u0027s own statements and 4 belong to 3 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"hired-wall-build.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"1214f512423d024e6a88fc9e0a137112998be1efe4215085fa59eb4c51d11c10"}},{"ruleId":"D2","level":"warning","message":{"text":"normalizeWttjHit (cognitive 32): normalizeWttjHit has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 15, ternaries 8 (9 pts), if/else 8 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/wttj.mjs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2e250375523947464dccae0e7bf936dbd0dde724baecef8723c3534c4fcce6"}},{"ruleId":"D2","level":"warning","message":{"text":"cv-payload-schema.validatePayload (cognitive 31): cv-payload-schema.validatePayload has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 8, loops 3, ternaries 2 (3 pts) (nesting depth added 8). Of this number, 23 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cv-payload-schema.mjs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"13d71a614513b46459224171fb3e326f9bb4db17d8ee6c96932d62b0f58f4b31"}},{"ruleId":"D2","level":"warning","message":{"text":"stats.computeScanStats (cognitive 31): stats.computeScanStats has cognitive complexity 31 (threshold 15). Drivers by points: if/else 9 (21 pts), boolean chains 8, loops 1, ternaries 1 (nesting depth added 12). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"325578e41993a70f434524b79a6675112d58d793881147103820cf4832431fdd"}},{"ruleId":"D2","level":"warning","message":{"text":"scan-ats-full.runSeedScan (cognitive 31): scan-ats-full.runSeedScan has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (17 pts), loops 3 (5 pts), error handling 3 (4 pts), ternaries 2 (3 pts), boolean chains 2 (nesting depth added 11). Most of this is not in the body itself: 5 of the 31 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 662, 654). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"721e7f9f902380e8ab27fe72703f80207a6ac47eccbee37c7cbbe411e902692f"}},{"ruleId":"D2","level":"warning","message":{"text":"cadence-settings.CadenceSettings (cognitive 31): cadence-settings.CadenceSettings has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 9 (21 pts), if/else 5 (6 pts), boolean chains 2, error handling 1, loops 1 (nesting depth added 13). Most of this is not in the body itself: 14 of the 31 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 52, 34, 45, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/cadence-settings.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea0e8c45fe52dba4fad686f80a7058432e986026501d8153604d4c1fc006f4b"}},{"ruleId":"D2","level":"warning","message":{"text":"agent-interpret.captureCandidates (cognitive 31): agent-interpret.captureCandidates has cognitive complexity 31 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 14, loops 1 (nesting depth added 9). Most of this is not in the body itself: 0 of the 31 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 28, 29, 54). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/agent-interpret.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"82347564a807501587b420510a5623b3b3a98243f704a8cb6d10c4c0b34c7936"}},{"ruleId":"D2","level":"warning","message":{"text":"session.openSession (cognitive 31): session.openSession has cognitive complexity 31 (threshold 15). Drivers by points: if/else 14 (16 pts), boolean chains 8, ternaries 4 (6 pts), error handling 1 (nesting depth added 4). Of this number, 28 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6aa6889aa0bdf1e83791497c1e1e79ecedaad2ba0b8492b29bac97a2aa32f70"}},{"ruleId":"D2","level":"warning","message":{"text":"data.enrichFromScanHistory (cognitive 31): data.enrichFromScanHistory has cognitive complexity 31 (threshold 15). Drivers by points: if/else 8 (19 pts), loops 4 (9 pts), boolean chains 3 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"415bb5bbfb7a8f44505cdb6c18985e62c4b6e067d98ba76b4919fbc96f9d13e1"}},{"ruleId":"D2","level":"warning","message":{"text":"collectSeenCompanyRoles (cognitive 31): collectSeenCompanyRoles has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (20 pts), boolean chains 4, loops 3 (4 pts), other 2, ternaries 1 (nesting depth added 8). Of this number, 16 points are the body\u0027s own statements and 15 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e3a7e8e6861a5b2e826b0767c9faef0c19175f16e6266ce8fdf4d44ceb937a"}},{"ruleId":"D2","level":"warning","message":{"text":"configuredTemplateVariantsFromProfileSource::parseScalar (cognitive 31): configuredTemplateVariantsFromProfileSource::parseScalar has cognitive complexity 31 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 6, error handling 1 (2 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1335}}}],"partialFingerprints":{"codehealthFindingId/v1":"700540a463140e7ccaf80c7779e915125e2c814c19126ad1c58ec6aa1bf5580f"}},{"ruleId":"D2","level":"warning","message":{"text":"parseTsvContent (cognitive 31): parseTsvContent has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (25 pts), boolean chains 4, other 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":985}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8c871a632e350baaa4f6e29a14ef6b25b11ae08cb7ddd7a3badece4333fab7"}},{"ruleId":"D2","level":"warning","message":{"text":"main::processJobs (cognitive 31): main::processJobs has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (23 pts), boolean chains 4, error handling 1 (3 pts), loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":1127}}}],"partialFingerprints":{"codehealthFindingId/v1":"093736953fd0451792eff071607a14acb06b4fbb0d1e822797141df6ea10d984"}},{"ruleId":"D2","level":"warning","message":{"text":"fetchTextMeta (cognitive 31): fetchTextMeta has cognitive complexity 31 (threshold 15). Drivers by points: if/else 7 (15 pts), error handling 3 (6 pts), boolean chains 5, ternaries 2 (4 pts), loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b0672c245f6fe349f952dc9ee490fec8bd6ba425c943f39af32798e2e726f1"}},{"ruleId":"D2","level":"warning","message":{"text":"clean-markers.processFile (cognitive 30): clean-markers.processFile has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 7 (18 pts), if/else 5 (8 pts), boolean chains 4 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"clean-markers.mjs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4879fe49a030292a6b9366276272bb070edc4ab98eb7863f8cae7002294905a2"}},{"ruleId":"D2","level":"warning","message":{"text":"_engine.discoverPlugins (cognitive 30): _engine.discoverPlugins has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (19 pts), error handling 3 (7 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 17). Of this number, 23 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_engine.mjs"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24600d3496c9c7c070fdf097255dc06f979f4478e07a5baa3a46d047cf6fccd"}},{"ruleId":"D2","level":"warning","message":{"text":"ultipro.parseListPage (cognitive 30): ultipro.parseListPage has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 6 (13 pts), if/else 6 (11 pts), boolean chains 5, loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"53c15dc6079c737eae90de6607ff65ed101e1da93377ac7d9e367f064efd9e1b"}},{"ruleId":"D2","level":"warning","message":{"text":"vc-portfolios.parseYCPayload (cognitive 30): vc-portfolios.parseYCPayload has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 6 (11 pts), boolean chains 6, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"seeds/vc-portfolios.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ef1c38710ab107f82c2f06efb53a6c6c8f3a0531c6230aa3b2744e465a8fe55"}},{"ruleId":"D2","level":"warning","message":{"text":"export-ats-text.normalizeProfile (cognitive 30): export-ats-text.normalizeProfile has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 19, if/else 11. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"d48b275bc1afa8c0d6415c8fed38fb6005526de677d64685703ffa48a4c853a9"}},{"ruleId":"D2","level":"warning","message":{"text":"pipeline-sort.sortRows (cognitive 30): pipeline-sort.sortRows has cognitive complexity 30 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 4 (8 pts), ternaries 6 (8 pts), boolean chains 3 (nesting depth added 12). Of this number, 19 points are the body\u0027s own statements and 11 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/pipeline-sort.mjs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e85ad63fe06e0207f0e22cd7de572c2ff25399c148df761041f4e327b941a805"}},{"ruleId":"D2","level":"warning","message":{"text":"states.readCanonicalStates (cognitive 30): states.readCanonicalStates has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 6 (17 pts), if/else 4 (7 pts), boolean chains 3, loops 1 (2 pts), error handling 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/states.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f2a8c2d6c7f51139ce86e34e202378fc918119fe756ea55eec0f778ed4c68ca"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch::split (cognitive 30): fetch::split has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (18 pts), ternaries 2 (5 pts), loops 2 (3 pts), error handling 1 (2 pts), boolean chains 1, other 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":899}}}],"partialFingerprints":{"codehealthFindingId/v1":"84bf87e80b1c01d2209ee225b1e3105d3d053595160ff9eb02ba727c93a133e0"}},{"ruleId":"D2","level":"warning","message":{"text":"normalizeProfile (cognitive 30): normalizeProfile has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 11, other 10, ternaries 8, if/else 1. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a15f1dc660a4995f6f2a034766c59a4533d7ceed3253c1fcc633c4ae62852e8"}},{"ruleId":"D2","level":"warning","message":{"text":"parseClaudeEvent (cognitive 30): parseClaudeEvent has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 12, ternaries 1 (2 pts), error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/run-cli-support.mjs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8389eb59db66119412b2a5ee6e32d8937bee0ef8083ff6a2bd1a85dd4f86c9d"}},{"ruleId":"D2","level":"warning","message":{"text":"parseCliArgs (cognitive 30): parseCliArgs has cognitive complexity 30 (threshold 15). Drivers by points: if/else 16 (23 pts), boolean chains 5, loops 1, other 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"archive-posting.mjs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"8660ab58628d54ea31da385aa0966febba67d991415e50e87b2d8342d440e374"}},{"ruleId":"D2","level":"warning","message":{"text":"roleFuzzyMatch (cognitive 30): roleFuzzyMatch has cognitive complexity 30 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 7, ternaries 3 (4 pts), other 2 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"role-matcher.mjs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"249c221e9103d2575c1428b5c55d0255ab9f821d07ce12d10a5e0f789651778f"}},{"ruleId":"D2","level":"warning","message":{"text":"apply-view.ApplyView (cognitive 29): apply-view.ApplyView has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 25, ternaries 2 (3 pts), if/else 1 (nesting depth added 1). Of this number, 28 points are the body\u0027s own statements and 1 belongs to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e0e5502363e21389139c58a9d70f499ec1d09ea0c1dacb4d92886bd5acb2e68"}},{"ruleId":"D2","level":"warning","message":{"text":"report-view.ReportView (cognitive 29): report-view.ReportView has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 18, ternaries 5 (7 pts), if/else 2 (4 pts) (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 14 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/report-view.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"881a8c6725e3a0c016523117835e80d4c2277a46738bdacc9a6cc884ed284265"}},{"ruleId":"D2","level":"warning","message":{"text":"run-cli-support.parseCodexEvent (cognitive 29): run-cli-support.parseCodexEvent has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 7, ternaries 1 (2 pts), error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/run-cli-support.mjs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ad919f092af8ce2fd12f161888b5b3ee8cd4ca4f9ca14de98f280136544346"}},{"ruleId":"D2","level":"warning","message":{"text":"ViewerModel.Update (cognitive 29): ViewerModel.Update has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (26 pts), match/switch 2 (3 pts) (nesting depth added 18). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"c504617d4540dcfd0228c51e61e438b207507b62d564344d696a59cfa58631f1"}},{"ruleId":"D2","level":"warning","message":{"text":"renderInPage (cognitive 29): renderInPage has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 7, if/else 6 (7 pts), error handling 4 (6 pts), ternaries 5 (6 pts), other 3 (nesting depth added 4). Of this number, 24 points are the body\u0027s own statements and 5 belong to 5 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1930}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d2585f05f4b085b0b2c5dac87ceeb5f28b6e9a34284633bda86c7f4520b4f6"}},{"ruleId":"D2","level":"warning","message":{"text":"computeVelocity (cognitive 29): computeVelocity has cognitive complexity 29 (threshold 15). Drivers by points: if/else 6 (19 pts), ternaries 2 (4 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 16). Of this number, 27 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"b58a4bb63fbcff613deb2fdc9bcb66379962ca15248e4847315a108ace788ac3"}},{"ruleId":"D2","level":"warning","message":{"text":"parseTracker (cognitive 29): parseTracker has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (20 pts), boolean chains 4, ternaries 1 (3 pts), loops 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"d90676d8a87949aade450d25943c5d55dd29bf8b2b1f1486ff008160b3fa1fd5"}},{"ruleId":"D2","level":"warning","message":{"text":"listSourceFiles::walk (cognitive 29): listSourceFiles::walk has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (18 pts), error handling 3 (8 pts), boolean chains 2, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a75ffc313f7dcf60bc1494e6f45d57bf7f393c49a0e90d95defb51a18fa8c88"}},{"ruleId":"D2","level":"warning","message":{"text":"layoutSankey (cognitive 29): layoutSankey has cognitive complexity 29 (threshold 15). Drivers by points: other 12, if/else 4 (6 pts), loops 4 (5 pts), boolean chains 3, ternaries 3 (nesting depth added 3). Of this number, 25 points are the body\u0027s own statements and 4 belong to 13 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/pipeline-sankey.mjs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"3270d9d47023fa422c2730dea57f645808f511dbf52c61747beae9269e6c4559"}},{"ruleId":"D2","level":"warning","message":{"text":"detect-reposts.detectRepostsInGroup (cognitive 28): detect-reposts.detectRepostsInGroup has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (23 pts), loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 17). Of this number, 26 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"detect-reposts.mjs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dca5bcafeeb4b3ea9e83c4e0e0a96827fdcf1eaecbc88de6562e05572b71bec"}},{"ruleId":"D2","level":"warning","message":{"text":"breezy.parseBreezyResponse (cognitive 28): breezy.parseBreezyResponse has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (11 pts), ternaries 5 (9 pts), boolean chains 4, error handling 1 (3 pts), loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/breezy.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c0aa1d5bfb43b92904e06d8ca676093fc9419ccd03844861143b8cdaadc989"}},{"ruleId":"D2","level":"warning","message":{"text":"intake.main (cognitive 28): intake.main has cognitive complexity 28 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 2, error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"364853ff6296783c42ed164e3d98bd055929da78f967cad60eb7e5a7bc925681"}},{"ruleId":"D2","level":"warning","message":{"text":"pythonorg.parsePythonOrgFeed (cognitive 28): pythonorg.parsePythonOrgFeed has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 5, loops 1, ternaries 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/pythonorg.mjs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9b536d627df829f350c423cd4adc15702d5bf4123e03cf77206dfb4821666f"}},{"ruleId":"D2","level":"warning","message":{"text":"upskill.aggregateGaps (cognitive 28): upskill.aggregateGaps has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 6, ternaries 2 (4 pts), loops 2 (3 pts) (nesting depth added 11). Of this number, 21 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef7752868128c79ad0b7e28937f6b4e16a872e81ead23188d34a2cd423f5792c"}},{"ruleId":"D2","level":"warning","message":{"text":"route.compute (cognitive 28): route.compute has cognitive complexity 28 (threshold 15). Drivers by points: if/else 4 (11 pts), error handling 3 (7 pts), boolean chains 4, loops 2 (3 pts), ternaries 1 (3 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/usage/route.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"18b2b624a3b355afa8e0002c10e9b11c38400238ec3024b277751c9a0e606749"}},{"ruleId":"D2","level":"warning","message":{"text":"ViewerModel.styleLine (cognitive 28): ViewerModel.styleLine has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (18 pts), boolean chains 8, loops 1 (2 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"2615749b5899087f39feea0efb94d61cc1be417abcc42a3fefa3fa22e8799478"}},{"ruleId":"D2","level":"warning","message":{"text":"renderSummary (cognitive 28): renderSummary has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 4 (13 pts), loops 4 (7 pts), if/else 4 (6 pts), boolean chains 1, other 1 (nesting depth added 14). Of this number, 26 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"107cdeeed3846cfcdd80fec04c43252b9b40ce3e8e15bfa83fac2bb92ef3565c"}},{"ruleId":"D2","level":"warning","message":{"text":"computeUrgency (cognitive 28): computeUrgency has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (17 pts), ternaries 3 (8 pts), boolean chains 3 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d4993cbd522222a5449b7a1f3e76ccb2582253ba1132a583273c0b8df1f931"}},{"ruleId":"D2","level":"warning","message":{"text":"parseFormState (cognitive 28): parseFormState has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 6 (10 pts), if/else 5 (9 pts), boolean chains 6, loops 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/peoplesoft.mjs"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"c72ee698d599241e81df797e9b5ba5e098c65cbf78a39ded8f65167edef48134"}},{"ruleId":"D2","level":"warning","message":{"text":"printResults (cognitive 28): printResults has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (11 pts), ternaries 3 (9 pts), boolean chains 7, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bbe2550bb57a6513005fe881bc1594e9ad57e3377fa3fc6795f99ef268c2c5f"}},{"ruleId":"D2","level":"warning","message":{"text":"appendNote (cognitive 28): appendNote has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 6, ternaries 3 (5 pts), loops 2 (4 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"fix-slugs.mjs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42332362f2b51925b6258abf358ba704ecf0833d55ada2d38103e317f728e3d"}},{"ruleId":"D2","level":"warning","message":{"text":"applyAdd (cognitive 28): applyAdd has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (19 pts), ternaries 2 (5 pts), boolean chains 4 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"add-entry.mjs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c09bf74151d7be8354f15f30f33dc485879d705e15855732b39618dc8667aff"}},{"ruleId":"D2","level":"warning","message":{"text":"recruitee.assembleLocation (cognitive 27): recruitee.assembleLocation has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 7 (12 pts), if/else 5 (8 pts), boolean chains 7 (nesting depth added 8). Most of this is not in the body itself: 13 of the 27 points are its own statements and the rest belongs to one function literal inside it that branches (line 140). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/recruitee.mjs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"26d12e29e5680c5df3b5fa2104f890566f0523f4a8032fb63a7d43141e0c1f5a"}},{"ruleId":"D2","level":"warning","message":{"text":"recruitee.parseRecruiteeResponse (cognitive 27): recruitee.parseRecruiteeResponse has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (15 pts), ternaries 2 (4 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/recruitee.mjs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e096ce41a71f558876df9fc33191a95d2108aad67e47453166714051fdf2085"}},{"ruleId":"D2","level":"warning","message":{"text":"doctor.main (cognitive 27): doctor.main has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 5 (12 pts), if/else 7 (8 pts), loops 3 (7 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"doctor.mjs"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db29f8419e5ee819ac4879a56f21897c9c29b45aa98ba1d9e4e7f14f04624c4"}},{"ruleId":"D2","level":"warning","message":{"text":"linkedin-join.renderCompanyAnswer (cognitive 27): linkedin-join.renderCompanyAnswer has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (19 pts), ternaries 2 (5 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce10a236aba6840faa58c5572a5d09672f1a3dee2d10ace8ff87ef2bd291654"}},{"ruleId":"D2","level":"warning","message":{"text":"jobvite.parseJobviteXml (cognitive 27): jobvite.parseJobviteXml has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (20 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobvite.mjs"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6875d4c1ac62563f2af5520b22ae50099a97c087960a8b3baa97c2891b8d71"}},{"ruleId":"D2","level":"warning","message":{"text":"career-ops.readLanguageConfig (cognitive 27): career-ops.readLanguageConfig has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (16 pts), ternaries 2 (6 pts), boolean chains 4, error handling 1 (nesting depth added 13). Of this number, 17 points are the body\u0027s own statements and 10 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/career-ops.ts"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"9591ed62428610c979a5fe5e2d0d1329852d5b7ccfb46d830a05ca734bdb5995"}},{"ruleId":"D2","level":"warning","message":{"text":"data.ComputeProgressMetrics (cognitive 27): data.ComputeProgressMetrics has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (18 pts), loops 5, boolean chains 2, match/switch 1 (2 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":990}}}],"partialFingerprints":{"codehealthFindingId/v1":"db177d6810d997948cb64fd16b6c9aca358fa880b866e442635cfa5e8cececd2"}},{"ruleId":"D2","level":"warning","message":{"text":"PipelineModel.renderPreview (cognitive 27): PipelineModel.renderPreview has cognitive complexity 27 (threshold 15). Drivers by points: if/else 17 (25 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e4fc74eb77de6d4ebbb071b3d2faec44ab61c04b65478fc75487c8e6d0ded0"}},{"ruleId":"D2","level":"warning","message":{"text":"buildProjects (cognitive 27): buildProjects has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 8 (13 pts), boolean chains 11, if/else 3 (nesting depth added 5). Most of this is not in the body itself: 3 of the 27 points are its own statements and the rest belongs to 7 function items inside it that branch ((anonymous), (anonymous), (anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f89bc7d3d2caab96da3adf498f7ba864809f70bc9c2fe162c508df7bfb460c5"}},{"ruleId":"D2","level":"warning","message":{"text":"readBoundedText (cognitive 27): readBoundedText has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 4 (9 pts), ternaries 2 (4 pts), boolean chains 2, loops 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c73b73bff2bc4f8fe41955cf8a37d1f6db3b13a0c84cb13bb30ae4fbccd310"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 27): fetch has cognitive complexity 27 (threshold 15). Drivers by points: if/else 5 (12 pts), boolean chains 5, ternaries 3 (5 pts), loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/remotli.mjs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"68cc10079af45a4a78d8f978a045ba0e40b54e17b7aa63c9d3ad4768fd81c0e0"}},{"ruleId":"D2","level":"warning","message":{"text":"parseListingPage (cognitive 27): parseListingPage has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 4 (8 pts), boolean chains 2, error handling 1 (2 pts), loops 2, other 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/careerviet.mjs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae02d5cef0bd6ec6699a15286bfe282f392ad67786985693bead36eb8937605a"}},{"ruleId":"D2","level":"warning","message":{"text":"parseOracleResponse (cognitive 27): parseOracleResponse has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 7 (12 pts), if/else 5 (9 pts), boolean chains 5, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/oraclecloud.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"0247c7bd77003e9d538456ca016077aee81c327f78dbc68516b418357c99ea39"}},{"ruleId":"D2","level":"warning","message":{"text":"stats.computeAllStats (cognitive 26): stats.computeAllStats has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 11 (14 pts), if/else 3 (7 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 9). Of this number, 25 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7800ea49cd642a38819b5ff88b2969dd398e9553023690356c5b223ba440b90"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.loadReApplyWindows (cognitive 26): scan.loadReApplyWindows has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 9, error handling 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1177}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cc90b1335c067c0722651d0a03ac6395f26ba16599b6ace89feed56f58ffb36"}},{"ruleId":"D2","level":"warning","message":{"text":"linkedin-join.joinConnections (cognitive 26): linkedin-join.joinConnections has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 8, loops 3 (4 pts), ternaries 1 (2 pts) (nesting depth added 8). Of this number, 14 points are the body\u0027s own statements and 12 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a944588fd3a8b729c22ec830f8cf7a2599fc0de51005ca464fe9e30f248614a"}},{"ruleId":"D2","level":"warning","message":{"text":"export-ats-text.loadProfile (cognitive 26): export-ats-text.loadProfile has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 4 (8 pts), boolean chains 4 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d566a6212739f0f86818f9deb5ddbd68b2534fe287c349132cf490f00dc5025"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 26): route.POST has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 5 (11 pts), boolean chains 3, error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/status/route.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b99b19904c2cfd5d8f82493037073178e09ee13f2ed8da3c3f7876c63839461"}},{"ruleId":"D2","level":"warning","message":{"text":"PipelineModel.Update (cognitive 26): PipelineModel.Update has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (21 pts), loops 2 (4 pts), match/switch 1 (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c3665ac341b06d81335f5dac19caf9db184e5533a725450fec6a96cb38e73c4"}},{"ruleId":"D2","level":"warning","message":{"text":"main (cognitive 26): main has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (16 pts), ternaries 3 (5 pts), boolean chains 3, error handling 1 (2 pts) (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":1060}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d3e85e83db9e969a2fd61c1404f52b42f5443634431b445630095ee33adb08"}},{"ruleId":"D2","level":"warning","message":{"text":"computeTrackerStats (cognitive 26): computeTrackerStats has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 5, ternaries 3, loops 1, other 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"beea714f6d65b33c6166989ac3fefaf5970997724e3356e253afea2c285f9759"}},{"ruleId":"D2","level":"warning","message":{"text":"cv-templates.discover (cognitive 25): cv-templates.discover has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (16 pts), error handling 2 (5 pts), loops 3 (4 pts) (nesting depth added 12). Of this number, 23 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cv-templates.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"3717b54568cec98148a8d51fd23e61194717190c29683a58230449e5a6b8e40f"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-cv-facts.factClaims (cognitive 25): verify-cv-facts.factClaims has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 3 (10 pts), loops 3 (6 pts), boolean chains 5, if/else 1 (4 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"163ec05f95c31f30a3b647efbeb99374e3c7f587058bcac512bd0dd14bf79399"}},{"ruleId":"D2","level":"warning","message":{"text":"hired-share.main (cognitive 25): hired-share.main has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 7, ternaries 3 (4 pts) (nesting depth added 3). Of this number, 23 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"hired-share.mjs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e564a534dbcef9ce24f675e890c816df923bed2bbbca0166e73161502f1219e"}},{"ruleId":"D2","level":"warning","message":{"text":"linkedin-join.parseCsv (cognitive 25): linkedin-join.parseCsv has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (21 pts), boolean chains 3, loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0e7ad7c4ddfb44dc7ed8245f4b5e31128bcc65bacb1ce6c1e19eb8cd688788"}},{"ruleId":"D2","level":"warning","message":{"text":"linkedin-join.main (cognitive 25): linkedin-join.main has cognitive complexity 25 (threshold 15). Drivers by points: if/else 13 (14 pts), ternaries 7 (8 pts), boolean chains 3 (nesting depth added 2). Of this number, 24 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"70d94d09900be04722565ebb22f94f3c69dcfda49bdbfca8897a1efec6904b99"}},{"ruleId":"D2","level":"warning","message":{"text":"_apify.fetchJson (cognitive 25): _apify.fetchJson has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (16 pts), ternaries 1 (4 pts), boolean chains 2, error handling 1 (2 pts), loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/apify/_apify.mjs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cba913ba19bb3664f2af5903ce60ada4e8d1eb79cc0d70e4ecf42853477dc32"}},{"ruleId":"D2","level":"warning","message":{"text":"garena.parseGarenaResponse (cognitive 25): garena.parseGarenaResponse has cognitive complexity 25 (threshold 15). Drivers by points: if/else 5 (9 pts), ternaries 5 (9 pts), boolean chains 6, loops 1 (nesting depth added 8). Of this number, 24 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/garena.mjs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"48118ad766bdd05e8b11d72863783cba74eafedc20ece91eb89854496ef74603"}},{"ruleId":"D2","level":"warning","message":{"text":"first-score-view.FirstScoreView (cognitive 25): first-score-view.FirstScoreView has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 11, if/else 7 (9 pts), error handling 3 (4 pts), ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 9 of the 25 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 65, 44, 53, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/first-score-view.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b004906b1083565b1b97010d22ff88c92c3fadbee5a41616f93066e2a24b81f"}},{"ruleId":"D2","level":"warning","message":{"text":"runSelfTest (cognitive 25): runSelfTest has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 16, if/else 3 (5 pts), loops 2 (3 pts), ternaries 1 (nesting depth added 3). Of this number, 22 points are the body\u0027s own statements and 3 belong to 8 function items inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":826}}}],"partialFingerprints":{"codehealthFindingId/v1":"4716856be15e6b3224308663e4739ad7c9035a17e5e7347335d2c9e0423a6a1d"}},{"ruleId":"D2","level":"warning","message":{"text":"tracker-parse.parseMarkdownLinks (cognitive 24): tracker-parse.parseMarkdownLinks has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 3 (5 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-parse.mjs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3e5e3cf52b00a9a0d2ef2e01e815113adf80af6d4cb60f042be25a16c75827d"}},{"ruleId":"D2","level":"warning","message":{"text":"classify-tier.classifyTier (cognitive 24): classify-tier.classifyTier has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 4, ternaries 2 (3 pts), loops 1 (nesting depth added 8). Of this number, 23 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"classify-tier.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcdc184e55c2f7d223516108e778ddea8ea9f113ab7e99d3a0b44246990b0854"}},{"ruleId":"D2","level":"warning","message":{"text":"funnel-velocity.parseStatusLog (cognitive 24): funnel-velocity.parseStatusLog has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 5, ternaries 2 (4 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"c936120329270525752082626daee7d81f4936420a799c3f5eddbe7165f64bf7"}},{"ruleId":"D2","level":"warning","message":{"text":"discover-ats.dedupeAgainstPortals (cognitive 24): discover-ats.dedupeAgainstPortals has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, ternaries 2 (4 pts), loops 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"4096dcfe5ac0968831b38d9517fc996dfa37dbdde290b288ad66e1d2658f3b59"}},{"ruleId":"D2","level":"warning","message":{"text":"echojobs.normalizeEchojobsJob (cognitive 24): echojobs.normalizeEchojobsJob has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 6, ternaries 4, error handling 1 (2 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/echojobs.mjs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7ac3e4e8137180201387f1be1b05b30ed18102703d9653d37c95bbcf82c30b1"}},{"ruleId":"D2","level":"warning","message":{"text":"thehub.fetchScope (cognitive 24): thehub.fetchScope has cognitive complexity 24 (threshold 15). Drivers by points: if/else 5 (12 pts), boolean chains 4, loops 2 (3 pts), ternaries 1 (3 pts), error handling 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/thehub.mjs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab84304690512fe63d7462313a34f67134a60b60df848c3315c19788d528bc8"}},{"ruleId":"D2","level":"warning","message":{"text":"drive.snapshot (cognitive 24): drive.snapshot has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 4 (14 pts), boolean chains 7, if/else 1 (2 pts), loops 1 (nesting depth added 11). Most of this is not in the body itself: 0 of the 24 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 31, 32, 33). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/drive.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc0225da0c966d84e93909ed10c3948679565fecc840c937a274e6779ca50bf6"}},{"ruleId":"D2","level":"warning","message":{"text":"explore-ai.makeAiStreamParser (cognitive 24): explore-ai.makeAiStreamParser has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (15 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1 (2 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/explore-ai.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab599e138456fbc379b24d4d0441491fb25581f201ce621521ca0a6a85fc195"}},{"ruleId":"D2","level":"warning","message":{"text":"data.CanonicalizeArchetype (cognitive 24): data.CanonicalizeArchetype has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 13, if/else 11. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"5701b8df110b667237567e3b8c5c698e915a15ff4a0dab245029e0834e98e90f"}},{"ruleId":"D2","level":"warning","message":{"text":"buildSalaryFilter (cognitive 24): buildSalaryFilter has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 11, if/else 9, other 4. Most of this is not in the body itself: 10 of the 24 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 969, 950, 959, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":949}}}],"partialFingerprints":{"codehealthFindingId/v1":"e56aa178fded57beb346a800ac1c04ec093b9a1cea9c3d847f2e26d674471ecf"}},{"ruleId":"D2","level":"warning","message":{"text":"clauseBounds (cognitive 24): clauseBounds has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, loops 3 (4 pts), other 4 (nesting depth added 5). Of this number, 12 points are the body\u0027s own statements and 12 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa63959d3f4f0b1d60579400a60c15b23712242c5a7b4958da8aa1ce3cb5307"}},{"ruleId":"D2","level":"warning","message":{"text":"installIndex (cognitive 24): installIndex has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 4 (8 pts), boolean chains 7, error handling 5 (7 pts), if/else 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/install-h1b-index.mjs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f0675321d4fe49f96f7e97fcfeef3b402306b740d58d638f98e0aa009df7c19"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 24): fetch has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 4, loops 2, ternaries 2 (nesting depth added 8). Of this number, 21 points are the body\u0027s own statements and 3 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/avature.mjs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b59da830994acae81edf054fdaaad508fbffc04b2d5e862fc8f2b28c0b9dc8a"}},{"ruleId":"D2","level":"warning","message":{"text":"application-answers.main (cognitive 23): application-answers.main has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 7, error handling 1, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"application-answers.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"453ce8ac7e77424dc28048db468e554e4bc635efc235c9d8301a1998ec506302"}},{"ruleId":"D2","level":"warning","message":{"text":"archive-posting.main (cognitive 23): archive-posting.main has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (11 pts), loops 3 (6 pts), boolean chains 3, error handling 1 (3 pts) (nesting depth added 6). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"archive-posting.mjs"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e7d316085022e67f2c24ae995dec30726265d6e8cfe88030a1b7e5cd61b08b"}},{"ruleId":"D2","level":"warning","message":{"text":"audit-portals.auditCompanies (cognitive 23): audit-portals.auditCompanies has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 10, ternaries 3 (5 pts), if/else 2 (4 pts), error handling 1 (3 pts), loops 1 (nesting depth added 6). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 224, 219, 258). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"d04e69f5d7b4d55a82ddd2ddaf9dd36ba1867a18651825b2b5e9544f4b9811c2"}},{"ruleId":"D2","level":"warning","message":{"text":"check-table-freshness.printSummary (cognitive 23): check-table-freshness.printSummary has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 4 (11 pts), if/else 4 (6 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"79726eac018f93c610a797f18705120061845a8c373cd8a4ba64d47c730b2eb8"}},{"ruleId":"D2","level":"warning","message":{"text":"funnel-velocity.selfTest (cognitive 23): funnel-velocity.selfTest has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 16, loops 5, if/else 2. Of this number, 19 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd42cca568ef46dc0a32abd8a4dbc7d65858290f46d2e28c67ad83608a58613"}},{"ruleId":"D2","level":"warning","message":{"text":"smartrecruiters.parseSmartRecruitersResponse (cognitive 23): smartrecruiters.parseSmartRecruitersResponse has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 9, error handling 1 (2 pts), ternaries 2 (nesting depth added 5). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to one function literal inside it that branches (line 197). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/smartrecruiters.mjs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4d00741cc720afa8821a5666c53b3db7c17d90b5bce1bb9c1aa2b83572ef289"}},{"ruleId":"D2","level":"warning","message":{"text":"_registry.validateRegistryEntry (cognitive 23): _registry.validateRegistryEntry has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13, boolean chains 10. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_registry.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b1e62602c321984e994a55252b4a0e1f421e6e3e00986a010782bc8944b8f2a"}},{"ruleId":"D2","level":"warning","message":{"text":"followup-seed.parseCliArgs (cognitive 23): followup-seed.parseCliArgs has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14 (21 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":701}}}],"partialFingerprints":{"codehealthFindingId/v1":"21e030febfecbe64e4d8042cc7f10175497622bc7c457c1114fc96719e1e3cdf"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-latex.validateLatexContent (cognitive 23): generate-latex.validateLatexContent has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14 (19 pts), boolean chains 2, loops 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-latex.mjs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d767605e1bd08f7ed0110218ef203c82e4050795877cdb15cc30b5a897f79ef"}},{"ruleId":"D2","level":"warning","message":{"text":"process-quality.aggregateProcessQuality (cognitive 23): process-quality.aggregateProcessQuality has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 3, ternaries 2, loops 1 (nesting depth added 8). Of this number, 20 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"process-quality.mjs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3fc5f4d39ba7494d8a4ce1f126d54284151ff442863245c9614e363ee483c08"}},{"ruleId":"D2","level":"warning","message":{"text":"4dayweek.normalize4dwJob (cognitive 23): 4dayweek.normalize4dwJob has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 9 (12 pts), boolean chains 6, if/else 5 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/4dayweek.mjs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ee982f1aee1505f485d131f7edf2d371d970d7288fa5414278d1da5cdc83e0"}},{"ruleId":"D2","level":"warning","message":{"text":"dassault.parseHits (cognitive 23): dassault.parseHits has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 10, if/else 5 (9 pts), error handling 1 (2 pts), loops 1, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/dassault.mjs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb75bbb0729be9123278d940cd5ea229a16edcc7599e2131ac91492171db95e"}},{"ruleId":"D2","level":"warning","message":{"text":"oraclecloud.resolveSite (cognitive 23): oraclecloud.resolveSite has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 4 (8 pts), boolean chains 6, if/else 3 (6 pts), error handling 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/oraclecloud.mjs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"0056ab8cb58eb4d640b156dcef3d2db2ced7ebdad5a83a1e6769dbb32acb2538"}},{"ruleId":"D2","level":"warning","message":{"text":"remotli.normalizeRemotliJob (cognitive 23): remotli.normalizeRemotliJob has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 9, if/else 8, ternaries 6. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/remotli.mjs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"459f79f4c8583d819e101b812f2fe6efb8e5ffb96dc2cf490a3abc6209a2f67d"}},{"ruleId":"D2","level":"warning","message":{"text":"telegram-channel.parseChannelPage (cognitive 23): telegram-channel.parseChannelPage has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 7, ternaries 2 (4 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"10276a09b2fad2715e0e65b72c061f8f1740ae37bb2c7a1ac74264709d724084"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.reconcileGitignore (cognitive 23): update-system.reconcileGitignore has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (13 pts), ternaries 3 (4 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3171}}}],"partialFingerprints":{"codehealthFindingId/v1":"4db0118d155ec6806987b18e44feabae0786791de38ad2fc33a581934fcf2693"}},{"ruleId":"D2","level":"warning","message":{"text":"report.issueBody (cognitive 23): report.issueBody has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 10 (16 pts), boolean chains 7 (nesting depth added 6). Of this number, 22 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/report/report.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da19d155b5d753691c754f1081dd280d5bceacff1748d9797aa532ce2a17065"}},{"ruleId":"D2","level":"warning","message":{"text":"ViewerModel.renderTableBlock (cognitive 23): ViewerModel.renderTableBlock has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 4 (9 pts) (nesting depth added 9). Of this number, 21 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"f760067db8362cfe3216105bc9057f3bc1fc7e9743b39914cb8c0f3d6fcf108a"}},{"ruleId":"D2","level":"warning","message":{"text":"requisitionIdsForDedup (cognitive 23): requisitionIdsForDedup has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 5 (9 pts), if/else 5 (8 pts), boolean chains 3, other 2, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":2195}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2e5c0a49cbf86d4889258f0709eb3455f29d5449f071ee0d8475797ddf65af5"}},{"ruleId":"D2","level":"warning","message":{"text":"rejectUserLayerPaths (cognitive 23): rejectUserLayerPaths has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 6, error handling 1, loops 1, ternaries 1 (nesting depth added 7). Of this number, 17 points are the body\u0027s own statements and 6 belong to 8 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad088518fb07b10a53d82390d4a241dbe5c0b8715e51c8177a6aee0b80714e28"}},{"ruleId":"D2","level":"warning","message":{"text":"runHistorySeedScan (cognitive 23): runHistorySeedScan has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (14 pts), error handling 4 (5 pts), loops 2, other 1, ternaries 1 (nesting depth added 7). Of this number, 12 points are the body\u0027s own statements and 11 belong to 9 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":717}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5766fe28f83a269276e0456bb5a81a693508800d17e99836cdf53fbfe1cabc6"}},{"ruleId":"D2","level":"warning","message":{"text":"findUnarchivedApplications (cognitive 23): findUnarchivedApplications has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (9 pts), ternaries 3 (5 pts), boolean chains 3, other 3, loops 2, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c547ec8694ddf36ead4098573036cc9525c72d2abffff368f985e02a10ed03"}},{"ruleId":"D2","level":"warning","message":{"text":"renderTable (cognitive 23): renderTable has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 6 (9 pts), if/else 3 (6 pts), boolean chains 3, loops 3, other 2 (nesting depth added 6). Most of this is not in the body itself: 9 of the 23 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 801, 830, 825, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"fccebc810bc6cc021240419636d0e7d8d8d61e4a68df4008d6db044bfef99fa6"}},{"ruleId":"D2","level":"warning","message":{"text":"findUnclaimedEntries (cognitive 23): findUnclaimedEntries has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 6, ternaries 3 (6 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d4098dd66abd22a9e70c3948e000d637e159cb397858e4478cdf2d0c55c6f8"}},{"ruleId":"D2","level":"warning","message":{"text":"downloadAsset (cognitive 23): downloadAsset has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 2 (6 pts), boolean chains 2, loops 1 (nesting depth added 9). Most of this is not in the body itself: 0 of the 23 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 145, 165, 171, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/install-h1b-index.mjs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a1cb78910098a1214e7d049d4f5cc7918db90f2e14844c6f86fbad13b521d83"}},{"ruleId":"D2","level":"warning","message":{"text":"detect-reposts.loadAggregatorCompanies (cognitive 22): detect-reposts.loadAggregatorCompanies has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (12 pts), boolean chains 3, loops 2 (3 pts), ternaries 1 (3 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"detect-reposts.mjs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"6500a32417e6a30649da64b1ff6b4a9928a5eda48fb90347125c25ebbcdcdc5c"}},{"ruleId":"D2","level":"warning","message":{"text":"company-history.loadStatusLogSource (cognitive 22): company-history.loadStatusLogSource has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 4, error handling 3, loops 1 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"2edcb7e207fb0367aa24f3fc189fec29e862974c29c62aa3cfb329f34e958ca7"}},{"ruleId":"D2","level":"warning","message":{"text":"contacts.parseContacts (cognitive 22): contacts.parseContacts has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 5, loops 3, ternaries 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contacts.mjs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"92387798b3b3de9eb6331a7efff28f164082a49f2fc8a1b6a92c78b2899352eb"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-portals.parseAtsSlug (cognitive 22): verify-portals.parseAtsSlug has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 2 (7 pts), boolean chains 3, error handling 1, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1faeb6f778e26def45f4d4aab23cf06c9ee919aec19473a67109fb868bf3a3b"}},{"ruleId":"D2","level":"warning","message":{"text":"jd-skill-gap.scanJd (cognitive 22): jd-skill-gap.scanJd has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jd-skill-gap.mjs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d29bc1ea33f7040e5ba6f348e09c088e8e447dafc7cc8c90acb602d72b7d2b"}},{"ruleId":"D2","level":"warning","message":{"text":"plugin-audit.auditPlugin (cognitive 22): plugin-audit.auditPlugin has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugin-audit.mjs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"e008fa6a8c5b44c9c0fed88589cba3a4227ae61501a97111d408089a4f614ede"}},{"ruleId":"D2","level":"warning","message":{"text":"beesite.parseSearchResult (cognitive 22): beesite.parseSearchResult has cognitive complexity 22 (threshold 15). Drivers by points: if/else 3 (7 pts), boolean chains 6, ternaries 4 (6 pts), loops 2 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/beesite.mjs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7cb8d3b5fd71d400bd0948a6bed633ed40258fec9931fab2399aa315f8e0d33"}},{"ruleId":"D2","level":"warning","message":{"text":"getonbrd.normalizeGetonbrdJob (cognitive 22): getonbrd.normalizeGetonbrdJob has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 7, ternaries 3, error handling 1 (2 pts) (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/getonbrd.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"050ed40e31eb2bce18a90af97943ac4357903b5d1d61909550a5701c72e118d5"}},{"ruleId":"D2","level":"warning","message":{"text":"redrover.parseRedRoverResponse (cognitive 22): redrover.parseRedRoverResponse has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 7, ternaries 1 (2 pts), loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/redrover.mjs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"fecc4316fd1a50c6f5b588b39041183be06c24ab89645ba387aff09374426f66"}},{"ruleId":"D2","level":"warning","message":{"text":"taleo.parseTaleoResponse (cognitive 22): taleo.parseTaleoResponse has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 5, ternaries 2 (4 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/taleo.mjs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb2f3647c4b4727480f5401f3700f0c47dbb1aa193262addedb60b906c25868e"}},{"ruleId":"D2","level":"warning","message":{"text":"vc-portfolios.fetchYCCompanies (cognitive 22): vc-portfolios.fetchYCCompanies has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 2 (3 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"seeds/vc-portfolios.mjs"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"600efb91c05cd7398bba3c74741136177a18bbcebe2e9ace132290cdb5c5e8fc"}},{"ruleId":"D2","level":"warning","message":{"text":"validate-plugin-registry.validateRegistry (cognitive 22): validate-plugin-registry.validateRegistry has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 7, loops 3 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-plugin-registry.mjs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd00407dcdf2c7ff5c20216eea8b36c854d61aaee7d4567ea44465d7ee7972cb"}},{"ruleId":"D2","level":"warning","message":{"text":"route.GET (cognitive 22): route.GET has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (14 pts), error handling 4 (8 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/cv-pdf/route.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be7ae0a57544fb081745a1289c1c0fbd2503017652203e30772c8dcca434e7f"}},{"ruleId":"D2","level":"warning","message":{"text":"results-list.ResultsList (cognitive 22): results-list.ResultsList has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 9 (13 pts), boolean chains 8, if/else 1 (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/results-list.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"545360f3918d6b084cef27777ca163239a012f00dfd041e9d12e71a727a6b08d"}},{"ruleId":"D2","level":"warning","message":{"text":"weekly-digest.runSelfTest (cognitive 22): weekly-digest.runSelfTest has cognitive complexity 22 (threshold 15). Drivers by points: boolean chains 13, error handling 4, if/else 3, loops 1, ternaries 1. Of this number, 19 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db117b8b9a6e755ba552313abeac19d43792ec3395811bb446226cc95f2517f"}},{"ruleId":"D2","level":"warning","message":{"text":"PipelineModel.handleDiscardPicker (cognitive 22): PipelineModel.handleDiscardPicker has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (18 pts), match/switch 2 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e3498139c5ae078fc4ea535c68bf0631615212dcace6f2180e623cc7301999d"}},{"ruleId":"D2","level":"warning","message":{"text":"parseBlacklist (cognitive 22): parseBlacklist has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 6, ternaries 3 (6 pts), loops 1, other 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":2797}}}],"partialFingerprints":{"codehealthFindingId/v1":"615bbb7e5ab0c289c01285b45d6993df6d1e75629bfd6ae575454018632fddfd"}},{"ruleId":"D2","level":"warning","message":{"text":"main::resolveEntries (cognitive 22): main::resolveEntries has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 4, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":3418}}}],"partialFingerprints":{"codehealthFindingId/v1":"87152dcd91f5619716e31b0f46c27e7ce2842df53ad006bfe124b8294c9c6a93"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 22): (anonymous) has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 4 (9 pts), boolean chains 1, ternaries 1 (nesting depth added 9). Of this number, 20 points are the body\u0027s own statements and 2 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8d07593d20d515838436af925e661bf2ace5d5bb4aca620cf96cbfeee78032b"}},{"ruleId":"D2","level":"warning","message":{"text":"parseSessionFile (cognitive 22): parseSessionFile has cognitive complexity 22 (threshold 15). Drivers by points: other 7, if/else 4 (6 pts), boolean chains 4, loops 2 (3 pts), error handling 1, ternaries 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bfc1f04ee2ff0f09fb5e517a370184ad6a931bda555c2b8026772f68881045b"}},{"ruleId":"D2","level":"warning","message":{"text":"extractRows (cognitive 22): extractRows has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 4, loops 3 (4 pts), ternaries 1 (2 pts) (nesting depth added 7). Of this number, 15 points are the body\u0027s own statements and 7 belong to 6 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f18b29378fa6b0c9e68526ba8a88f470254e37d76add36366ca78c5d43028fa"}},{"ruleId":"D2","level":"warning","message":{"text":"main (cognitive 22): main has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 6, ternaries 3 (6 pts), other 1 (nesting depth added 6). Of this number, 21 points are the body\u0027s own statements and 1 belongs to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"hired-wall-build.mjs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e62ff44dbe14264e8193dd1eab23419fe4cd2741aabc2f185e62c55050406da"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 22): fetch has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 5, loops 1 (3 pts), error handling 1 (2 pts), ternaries 1 (nesting depth added 7). Of this number, 18 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/gem.mjs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"75aeda12583ff9b1c4f208646692b57c43f6b172af71230c0af1f3636e6720b3"}},{"ruleId":"D2","level":"warning","message":{"text":"pickLocation (cognitive 22): pickLocation has cognitive complexity 22 (threshold 15). Drivers by points: if/else 3 (8 pts), boolean chains 5, ternaries 2 (5 pts), loops 2 (3 pts), other 1 (nesting depth added 9). Of this number, 17 points are the body\u0027s own statements and 5 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/icims.mjs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"384670098c158f0148340d841df457c9fc658bdfd2fbbe665066d8471e32fdc2"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 22): fetch has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 3 (5 pts), boolean chains 3, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/oraclecloud.mjs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42858bf144eeea49af95247d8f79a0542976ac27723366724aa9ced8ca7d519"}},{"ruleId":"D2","level":"warning","message":{"text":"company-funded.parseArgs (cognitive 21): company-funded.parseArgs has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 7, loops 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c8bdbd7ecd8876509150d0b26590aa614b19c580a1e0f4c60ae4eb6046284e7"}},{"ruleId":"D2","level":"warning","message":{"text":"invite-match.runSelfTest (cognitive 21): invite-match.runSelfTest has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 18, if/else 2, ternaries 1. Of this number, 19 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invite-match.mjs"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"349b382e71dd73c513b3d24a3e0e9ba3c351328e2ffd26737d0b1be53a21f4f4"}},{"ruleId":"D2","level":"warning","message":{"text":"company-history.parseArgs (cognitive 21): company-history.parseArgs has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 8, loops 1 (nesting depth added 2). Of this number, 16 points are the body\u0027s own statements and 5 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe09be6ea036846e28c1e4a1e80900367c79ba0d295a71c878fa3ba798acd3ea"}},{"ruleId":"D2","level":"warning","message":{"text":"reply-matcher.getAppDomains (cognitive 21): reply-matcher.getAppDomains has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 4 (8 pts), boolean chains 4 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a7ffaf00602d9978e427f99135df5d88962e7c9a7655a02fc2aabf13710357"}},{"ruleId":"D2","level":"warning","message":{"text":"contact-extract.appendContact (cognitive 21): contact-extract.appendContact has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 9, ternaries 2 (nesting depth added 2). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 153, 169, 164, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contact-extract.mjs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"1559dda6df0601da09d1c24e3990b9da8f33ece535b3fc813c614b6d76731d20"}},{"ruleId":"D2","level":"warning","message":{"text":"workday.chooseSplitFacet (cognitive 21): workday.chooseSplitFacet has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 6, ternaries 3 (5 pts), loops 1 (nesting depth added 6). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workday.mjs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cff3a3a22a7d2dda132fe0cb7d632bb369b1c49e04514acbb9aa9776436c5eb"}},{"ruleId":"D2","level":"warning","message":{"text":"reserve-report-num.runCli (cognitive 21): reserve-report-num.runCli has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 5, ternaries 2 (3 pts), error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reserve-report-num.mjs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"3db99ae235ff99c4f9816adfb9e4e293efc3e8cfa98697f9db974a210a12495e"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-latex.compileLatexFile (cognitive 21): generate-latex.compileLatexFile has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (13 pts), error handling 3 (5 pts), loops 1 (2 pts), ternaries 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-latex.mjs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"703743508e66e0e469c23ba791801c32b3058aaf4a7b1f43d765754b38495dfa"}},{"ruleId":"D2","level":"warning","message":{"text":"history-ats-seeds.atsBoardUrlOf (cognitive 21): history-ats-seeds.atsBoardUrlOf has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 4, ternaries 1 (2 pts), error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"history-ats-seeds.mjs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"356e38dbd87de9cec139bdfdd6da1fbce2e45805d523cb28036c5adcc1be2d17"}},{"ruleId":"D2","level":"warning","message":{"text":"neogov.parseNeogovPage (cognitive 21): neogov.parseNeogovPage has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 8, error handling 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/neogov.mjs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"e180d045926584404808b8d8efc47214ab2e4a2aeac8b9c12732c6ad2cc96be5"}},{"ruleId":"D2","level":"warning","message":{"text":"peoplesoft.requestWithSession (cognitive 21): peoplesoft.requestWithSession has cognitive complexity 21 (threshold 15). Drivers by points: if/else 3 (8 pts), ternaries 3 (6 pts), boolean chains 3, error handling 1 (3 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/peoplesoft.mjs"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc1d4edbadc71d11537fe4e6949e8b6e9bdfffffae63d3600b8fd5c9be216ce"}},{"ruleId":"D2","level":"warning","message":{"text":"torre.normalizeTorreOpportunity (cognitive 21): torre.normalizeTorreOpportunity has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 6, ternaries 3 (nesting depth added 2). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/torre.mjs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6efd313ada21b4698f7a975fa8406bcdd024f9b55698e713167c86e3139fd5"}},{"ruleId":"D2","level":"warning","message":{"text":"cli.main (cognitive 21): cli.main has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11, boolean chains 4, ternaries 3 (4 pts), error handling 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scaffolder/bin/cli.mjs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e215dbcddcd46bf7528787265de89ddd7ae00676193656c6d226dd692c7a46"}},{"ruleId":"D2","level":"warning","message":{"text":"tracker-table.parseApplications (cognitive 21): tracker-table.parseApplications has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (16 pts), ternaries 2 (4 pts), loops 1 (nesting depth added 11). Of this number, 18 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/tracker-table.mjs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bc142e15f78c0ad02eb6f499df3870f34b8e4b1b257925f60bb2ba0b62a97e"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.localUserPaths (cognitive 21): update-system.localUserPaths has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), ternaries 2 (4 pts), boolean chains 1, loops 1 (nesting depth added 9). Of this number, 19 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0671487093a45545d593de263f55f9520ec6cd05eb97f9a4a9aa4de66bde6d"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.revertPaths (cognitive 21): update-system.revertPaths has cognitive complexity 21 (threshold 15). Drivers by points: error handling 4 (11 pts), if/else 2 (4 pts), ternaries 1 (3 pts), boolean chains 2, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":2233}}}],"partialFingerprints":{"codehealthFindingId/v1":"695f6962e5348124db8789c9dd91023a43d80fe7d507d56367df7c06b0a67304"}},{"ruleId":"D2","level":"warning","message":{"text":"upskill.analyze (cognitive 21): upskill.analyze has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (3 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 9). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e16ceda62e571432b040508ba9fa97f2a1e740f4f62220039c027d8653fc6ea"}},{"ruleId":"D2","level":"warning","message":{"text":"config-form.ConfigForm (cognitive 21): config-form.ConfigForm has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, ternaries 4, error handling 1 (nesting depth added 4). Most of this is not in the body itself: 8 of the 21 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 48, 78, 160, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7fce6924839aec9d16f7064dc5681c33a5ddbc5d157e7f57e628d6be0922e3"}},{"ruleId":"D2","level":"warning","message":{"text":"mobile-nav.MobileNav (cognitive 21): mobile-nav.MobileNav has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 8, ternaries 2 (nesting depth added 2). Most of this is not in the body itself: 3 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 54, 153, 88, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/mobile-nav.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb896028f4998f5b5c61acf09a668b7456dceb562279c33e945da80cbdef124"}},{"ruleId":"D2","level":"warning","message":{"text":"buildContentFilter (cognitive 21): buildContentFilter has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 6, loops 1 (2 pts) (nesting depth added 5). Most of this is not in the body itself: 10 of the 21 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 768, 778, 753, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1c701eda78c45d9f51af82014c45e9013c609791c5a6aa23b6c4b69bcbdcae8"}},{"ruleId":"D2","level":"warning","message":{"text":"rawTextRanges (cognitive 21): rawTextRanges has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (12 pts), ternaries 3 (7 pts), boolean chains 1, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":691}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6305a955dbd9fef8b6a013e2adb1e0a243aa54a8217b1c70cc9931714542377"}},{"ruleId":"D2","level":"warning","message":{"text":"computeRunStats (cognitive 21): computeRunStats has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 5 (8 pts), boolean chains 2, loops 1, other 1 (nesting depth added 6). Of this number, 19 points are the body\u0027s own statements and 2 belong to 9 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"264c7705ac26dc1ce2ad0bf1a033cd8996ac86509a59ace1fe57b3074f5a09f3"}},{"ruleId":"D2","level":"warning","message":{"text":"seedFollowup (cognitive 21): seedFollowup has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 6, other 3, ternaries 2 (3 pts) (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed.mjs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"113ed0d97820bc1b3ff46e0c116fb2640f54cf63648bccc85e70d39a9d6bc9a9"}},{"ruleId":"D2","level":"warning","message":{"text":"makeGuardedFetch (cognitive 21): makeGuardedFetch has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 3, error handling 1 (3 pts), ternaries 1 (3 pts), loops 1 (nesting depth added 9). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to 6 function items inside it that branch (guardedFetch, hostOk, isLoopbackHost, \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_engine.mjs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e422ce00ae20c08a79b365eb6455e8dda3ec05ccfd28e1f9a1c2770fe24c7c1"}},{"ruleId":"D2","level":"warning","message":{"text":"extractTrackerReportNumbers (cognitive 21): extractTrackerReportNumbers has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 4, ternaries 2, loops 1, other 1 (nesting depth added 5). Of this number, 15 points are the body\u0027s own statements and 6 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-parse.mjs"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d456d16bff4c4db2700ac53415189930477b198ca2bb1d07b5f965f4eac71cb"}},{"ruleId":"D2","level":"warning","message":{"text":"createHeadedPageProvider (cognitive 21): createHeadedPageProvider has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 6, error handling 3 (6 pts) (nesting depth added 4). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to 3 function items inside it that branch (get, isCachedPageUsable, close). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-browser.mjs"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1e1f4313262629796c9dc233ae624c91cb133245820a63818c9bb53d2b08a86"}},{"ruleId":"D2","level":"warning","message":{"text":"parseListingPage (cognitive 21): parseListingPage has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 3 (7 pts), loops 3 (4 pts), boolean chains 1, other 1 (nesting depth added 9). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/itviec.mjs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"295b364d31fa241df003651e8ec885d30b0b74be61b95a2baa91a325c89109ac"}},{"ruleId":"D2","level":"warning","message":{"text":"company-history.runSelfTest (cognitive 20): company-history.runSelfTest has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 16, if/else 2, loops 1, ternaries 1. Of this number, 17 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"58dfbbb5ed09dfee62bf2182ee9cf67247a0ec67a6c71ce21165c718df2e0c42"}},{"ruleId":"D2","level":"warning","message":{"text":"latex-content.extractMacroBodies (cognitive 20): latex-content.extractMacroBodies has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/latex-content.mjs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c27f08fc8ebd3c27f5236aec01550756cad81fdf0f9bc7df838e78e2686dd5"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-pdf.extractSectionBlocks (cognitive 20): generate-pdf.extractSectionBlocks has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 3 (6 pts), boolean chains 2, loops 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe0bb040378afeeea781f94acabf7ebedbf92ae0aaa2f737bee0643965d5547"}},{"ruleId":"D2","level":"warning","message":{"text":"a16z-speedrun-talent.normalizeSpeedrunJob (cognitive 20): a16z-speedrun-talent.normalizeSpeedrunJob has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 6 (7 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/a16z-speedrun-talent.mjs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f540fa4e69a909b3c4c6246147314de30ae9191802f71cecf0aa41dab6a6678"}},{"ruleId":"D2","level":"warning","message":{"text":"jazzhr.parseJazzHRList (cognitive 20): jazzhr.parseJazzHRList has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 5, loops 2 (nesting depth added 5). Of this number, 17 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jazzhr.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8fa119ca8f90705e3c45d1bf52ebdb019f0cc41064ef39b1fc8d3aa11e7a87b"}},{"ruleId":"D2","level":"warning","message":{"text":"landingjobs.normalizeLandingJob (cognitive 20): landingjobs.normalizeLandingJob has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 6, boolean chains 5, error handling 1 (2 pts) (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/landingjobs.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff93ae4d2191a59377badc2730261e9003a8d7da2c8ed42f042816230cf93a0"}},{"ruleId":"D2","level":"warning","message":{"text":"softgarden.parseWidget (cognitive 20): softgarden.parseWidget has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 3, loops 2 (3 pts), error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/softgarden.mjs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"82bc793c6f56f218f4f00959fa5457e0e3ed029832d3916691257e744a3a28a8"}},{"ruleId":"D2","level":"warning","message":{"text":"story-provenance-check.classifyStoryBank (cognitive 20): story-provenance-check.classifyStoryBank has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 2 (3 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 11). Of this number, 17 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"story-provenance-check.mjs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a966371fbcc9c7f51a69b2cb13ae37d19b948d4ba5f934e92e23dd8ea1435ae"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.loadConfiguredTemplateVariants (cognitive 20): update-system.loadConfiguredTemplateVariants has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (9 pts), boolean chains 5, ternaries 2 (4 pts), error handling 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1431}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7eb1b016d3d6681ea05f6c80910bd1438929066847cdfc939f087a310d806bb"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.rollback (cognitive 20): update-system.rollback has cognitive complexity 20 (threshold 15). Drivers by points: error handling 5 (10 pts), if/else 4 (6 pts), ternaries 1 (3 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3943}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c84587b91a24a1910300560e63e8517565f729937adc52b7b8a4aba5439775"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 20): route.POST has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 5 (7 pts), if/else 6, error handling 5, boolean chains 2 (nesting depth added 2). Of this number, 17 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/apply/prefill/route.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c6cab40d282c5fa7dbbd97b7c227972d98267fdec4af9dc4b2acfde052573c"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 20): route.POST has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (9 pts), error handling 4 (6 pts), ternaries 2 (3 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/followups/cadence/route.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c428f659d4091d5633ce6101f3ca573e20e44e576d3442e07d87d62e559c95"}},{"ruleId":"D2","level":"warning","message":{"text":"agent-interpret.interpretFormWithAgent (cognitive 20): agent-interpret.interpretFormWithAgent has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 8, if/else 6 (7 pts), ternaries 3, error handling 1, loops 1 (nesting depth added 1). Most of this is not in the body itself: 5 of the 20 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 162, 175, 179, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/agent-interpret.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d23d8d8d1d0f1aa6b4d5fd57fc022ed0117412b2535894413396c45db5fac20"}},{"ruleId":"D2","level":"warning","message":{"text":"pipeline-table.parseInbox (cognitive 20): pipeline-table.parseInbox has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 2 (5 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/pipeline-table.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"6889fa1cd5b4cd92d5b59b73ad4d04b1c403c41e4cab685dc433439ff851ead2"}},{"ruleId":"D2","level":"warning","message":{"text":"report-tables.pipeCells (cognitive 20): report-tables.pipeCells has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/report-tables.mjs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4458dcb050846a50cceb650328a32c086924e396fbbfb274549225022405f86"}},{"ruleId":"D2","level":"warning","message":{"text":"data.LoadPDFEntriesByPath (cognitive 20): data.LoadPDFEntriesByPath has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 3, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd56df546086a70dc8a507dcbd08874cb265f4c74cbb1d50efbd1612acfaacaf"}},{"ruleId":"D2","level":"warning","message":{"text":"data.LoadPDFManifest (cognitive 20): data.LoadPDFManifest has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 3, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f16827dad275768be0a51ebece1335ccf7e52155bf446037a3f5e68c70e19a"}},{"ruleId":"D2","level":"warning","message":{"text":"PipelineModel.overlayDiscardPicker (cognitive 20): PipelineModel.overlayDiscardPicker has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":2323}}}],"partialFingerprints":{"codehealthFindingId/v1":"86723f8066e0946551307035f8152260d0cc493ce24dfac1ae3b915e44e12d34"}},{"ruleId":"D2","level":"warning","message":{"text":"main.main (cognitive 20): main.main has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (19 pts), loops 1 (nesting depth added 7). Of this number, 17 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/main.go"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"26427c852bf7cdecd3d8ae5c9d0652511659b5dbb2227fdcbbf0056177bbdc41"}},{"ruleId":"D2","level":"warning","message":{"text":"fuzzyTierMatch (cognitive 20): fuzzyTierMatch has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 11, if/else 8 (9 pts) (nesting depth added 1). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":1619}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cfff788f26493e01596354cf66ee8a329bed8b1b20b406ebcf0a57476eabaf6"}},{"ruleId":"D2","level":"warning","message":{"text":"buildNoResponseFrictionSignals (cognitive 20): buildNoResponseFrictionSignals has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 4 (8 pts), other 2, boolean chains 1, loops 1 (nesting depth added 8). Of this number, 17 points are the body\u0027s own statements and 3 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9a1655db428f098504aed1d731e6b3729eeba176bf817c65c6654cd390acca8"}},{"ruleId":"D2","level":"warning","message":{"text":"computeFunnelWithHistory (cognitive 20): computeFunnelWithHistory has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 4, loops 3, ternaries 1 (2 pts) (nesting depth added 6). Of this number, 18 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"stats.mjs"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"35d9693fdbeb639b8adaac823f839f54e6bbb82c33499608ebac84081df628a4"}},{"ruleId":"D2","level":"warning","message":{"text":"diffAgainstBaseline (cognitive 20): diffAgainstBaseline has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 6, ternaries 2 (4 pts), loops 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1cc27cb9a587ea236eed709beb7506bb556edd946be2fd0e6cef71969fdbd8d"}},{"ruleId":"D2","level":"warning","message":{"text":"auditCompanies::worker (cognitive 20): auditCompanies::worker has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 8, if/else 2 (4 pts), ternaries 2 (4 pts), error handling 1 (3 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d6d6fa7b862dd5dfdb7ca82f00c35b7212d344ba8596461224b328ceaf919e"}},{"ruleId":"D2","level":"warning","message":{"text":"gcStaleReportReservations (cognitive 20): gcStaleReportReservations has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 4, error handling 1 (2 pts), loops 1, other 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reserve-report-num.mjs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee728595149282782fbbe5f8dadc66f02aaa3e576b0763ad2164eaa3498b5b37"}},{"ruleId":"D2","level":"warning","message":{"text":"url-key.normalizeUrl (cognitive 19): url-key.normalizeUrl has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 5 (6 pts), boolean chains 2, loops 2, error handling 1 (nesting depth added 5). Of this number, 11 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"url-key.mjs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"672c059821dc3d31dce73ea6e0a329adf607fd92c916aac26c4556ccecdf630e"}},{"ruleId":"D2","level":"warning","message":{"text":"token-tracker.estimateCost (cognitive 19): token-tracker.estimateCost has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 5 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/token-tracker.mjs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"0032773803f88968f64f7e152c1f2868eaaa978e7b34e1669f2b21c61b35bf1f"}},{"ruleId":"D2","level":"warning","message":{"text":"workable.parseWorkableMarkdown (cognitive 19): workable.parseWorkableMarkdown has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3, ternaries 1 (2 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workable.mjs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"0062e40f4d7444d20f08fccf0a75b520a76cb5385b17b4eb6016214412251e95"}},{"ruleId":"D2","level":"warning","message":{"text":"reserve-report-num.reserveReportNumbers (cognitive 19): reserve-report-num.reserveReportNumbers has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 5, loops 3 (5 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reserve-report-num.mjs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b6aeb62de08a0faef2f412b17b2ab0e895379aefe3387337e3c51740fd59fe"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-pdf.reorderCvSections (cognitive 19): generate-pdf.reorderCvSections has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 3, boolean chains 2 (nesting depth added 4). Of this number, 17 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":977}}}],"partialFingerprints":{"codehealthFindingId/v1":"7363cd0bf2cfdf4c4246e722983a793a6fbe84dad8ffdc5d15c8e132df0dec07"}},{"ruleId":"D2","level":"warning","message":{"text":"linkedin-join.renderTsv (cognitive 19): linkedin-join.renderTsv has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 4 (12 pts), if/else 1 (3 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 11). Of this number, 15 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"96639e4ae995ec66bcabf1b3433948b705e395a5a2848cf975ceca413a98c670"}},{"ruleId":"D2","level":"warning","message":{"text":"normalize-statuses.normalizeStatus (cognitive 19): normalize-statuses.normalizeStatus has cognitive complexity 19 (threshold 15). Drivers by points: if/else 15 (16 pts), boolean chains 2, loops 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"normalize-statuses.mjs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a944363d604f8cdf67ca9a3c7435b999dd64322bcb9ce4b0447975e56687709"}},{"ruleId":"D2","level":"warning","message":{"text":"api.fetchWithTimeout (cognitive 19): api.fetchWithTimeout has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 3 (7 pts), boolean chains 3, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ddf52d2e2170708f70ca2c8bef8b94401fe2e7980df67c7513d4bb9bdce1cb3"}},{"ruleId":"D2","level":"warning","message":{"text":"tier.classifyTier (cognitive 19): tier.classifyTier has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 11, if/else 6, ternaries 2. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/tier.mjs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd69aed6499fa09b02d624c7a1822068588996d771d1303c390c575ebdf4af72"}},{"ruleId":"D2","level":"warning","message":{"text":"token.mintToken (cognitive 19): token.mintToken has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (9 pts), if/else 5, boolean chains 4, error handling 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/token.mjs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"95400be3ee489ad4faa1e4dccc2c5d59a1b565bd329961226633ee6a30192ced"}},{"ruleId":"D2","level":"warning","message":{"text":"builtin.parseListPage (cognitive 19): builtin.parseListPage has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 3, error handling 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/builtin.mjs"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"66d5f8fce39f3abeb98433d32625d6c721c3248aec05eca7a18b5ee810b3e13a"}},{"ruleId":"D2","level":"warning","message":{"text":"rheinmetall.parseVacancies (cognitive 19): rheinmetall.parseVacancies has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (10 pts), ternaries 2 (4 pts), error handling 1 (3 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/rheinmetall.mjs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7759af61800f354903534acd15a0bd8a9704e94f7cab8dfe3732bbae04c5cb"}},{"ruleId":"D2","level":"warning","message":{"text":"thehub.normalizeHubJob (cognitive 19): thehub.normalizeHubJob has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 9 (10 pts), boolean chains 5, if/else 4 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/thehub.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa89ef07a5e357dfd9addd4dbadd790d577469bcc205137b836af4a82405e921"}},{"ruleId":"D2","level":"warning","message":{"text":"yourator.resolveYouratorUrl (cognitive 19): yourator.resolveYouratorUrl has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (9 pts), error handling 2 (3 pts), loops 1 (3 pts), boolean chains 2, ternaries 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/yourator.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bb2d76bfb329e9c68c7ab9aeaf08645caf28123b118111fcdcc4b5189b8bf40"}},{"ruleId":"D2","level":"warning","message":{"text":"skill-entrypoints.ensureSkillEntrypoints (cognitive 19): skill-entrypoints.ensureSkillEntrypoints has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (11 pts), error handling 3 (7 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scaffolder/bin/skill-entrypoints.mjs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbbfbc06cece6ea36c3b0455e55d162da39cdb28bf7d0621613a8a66eb6f9774"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.snapshotConfiguredTemplateVariants (cognitive 19): update-system.snapshotConfiguredTemplateVariants has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 4 (5 pts), error handling 2 (3 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). Of this number, 16 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1501}}}],"partialFingerprints":{"codehealthFindingId/v1":"42b2838f7994939c5eb47243de126f89161ce9e1a28f3df3b033049d6c78afef"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 19): route.POST has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 2, error handling 2, loops 1 (nesting depth added 3). Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 73). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/followups/log/route.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c69c0b7e1e39b26a3b9cb2db78cf87c37047fca5c7bc108e66efb1aae6b034"}},{"ruleId":"D2","level":"warning","message":{"text":"route.GET (cognitive 19): route.GET has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (14 pts), error handling 2, boolean chains 1, loops 1, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/logo/route.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8252b4e67a42307e8f1dbea917fc2ab3283dc386124acb2beb658f3c0ca9f4"}},{"ruleId":"D2","level":"warning","message":{"text":"triage-row.TriageRow (cognitive 19): triage-row.TriageRow has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 7 (12 pts), boolean chains 7 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/inbox/triage-row.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"686b4995759d8377804a6baee2d5844a3e2fb69d2f2e3adaa6f83b07016cb6b3"}},{"ruleId":"D2","level":"warning","message":{"text":"session.enrichFromAts (cognitive 19): session.enrichFromAts has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 4, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"62fdb9277aa31a0b1111ac8297340e8b7cd8404724096e8683e8b19157c3e383"}},{"ruleId":"D2","level":"warning","message":{"text":"url-key.normalizeUrl (cognitive 19): url-key.normalizeUrl has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 5 (6 pts), boolean chains 2, loops 2, error handling 1 (nesting depth added 5). Of this number, 11 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/url-key.mjs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0d0d1956111c17ee5fd724fb78c5b513956f729d8480e68852e9c891941a4c"}},{"ruleId":"D2","level":"warning","message":{"text":"PipelineModel.renderAppLine (cognitive 19): PipelineModel.renderAppLine has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14 (17 pts), boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":1794}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2c74d5bfe82736b6ab5974b44006fb4b4fd409ff4f5e0cefa33e12b3bd742a"}},{"ruleId":"D2","level":"warning","message":{"text":"buildTitleFilterOverrides (cognitive 19): buildTitleFilterOverrides has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 4, ternaries 2 (4 pts), loops 2 (3 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1344e967917c2efe908dfdcf5c28d784a5df1215e648a0e8c1bba80eb7e2d2"}},{"ruleId":"D2","level":"warning","message":{"text":"buildRow (cognitive 19): buildRow has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 6, loops 1 (2 pts), other 1 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 3 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f425dc05c3cf10137261195c6525311c1e3e75a1e312bc3b3aec09e1a0216bf"}},{"ruleId":"D2","level":"warning","message":{"text":"parseCompanyInput::add (cognitive 19): parseCompanyInput::add has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 8, ternaries 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"d35225a0fe5f61b5edf842d96d329a2c236f74b760a7b96c52f02e16fd57e7ef"}},{"ruleId":"D2","level":"warning","message":{"text":"mapTrackerCaptureLinks (cognitive 19): mapTrackerCaptureLinks has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (3 pts), boolean chains 2, error handling 1, other 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a06973bf33c08f12c5c70e12ee0411d022563f6a9c2164025671e6e4b383c7e"}},{"ruleId":"D2","level":"warning","message":{"text":"query (cognitive 19): query has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 2, loops 1 (2 pts), ternaries 1 (nesting depth added 4). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"79112a480c3b8b5648b54e79366255998ad1b3a59942dcca3fb55dd03622a1dd"}},{"ruleId":"D2","level":"warning","message":{"text":"detectReposts (cognitive 19): detectReposts has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (8 pts), boolean chains 7, loops 2, ternaries 2 (nesting depth added 3). Of this number, 12 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"detect-reposts.mjs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d7f332b36b163cda0299ae2e5c3a2a7456cec5fed00e291e048313d103f208"}},{"ruleId":"D2","level":"warning","message":{"text":"cmdEvaluate (cognitive 19): cmdEvaluate has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (7 pts), error handling 4 (5 pts), ternaries 3, loops 1 (2 pts), boolean chains 1, other 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f277ef3bbc80f69b2adb14d56aefb4e7d785bf78b95d440ce42f5c93c20bd4b"}},{"ruleId":"D2","level":"warning","message":{"text":"validateEvaluationShape (cognitive 19): validateEvaluationShape has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 3, loops 2 (3 pts), ternaries 1 (2 pts), other 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"gemini-eval.mjs"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"c11105cfdaafcd75fd1857b74dcb41308bae1e8c26711c6f99a84303704761db"}},{"ruleId":"D2","level":"warning","message":{"text":"findStaleScanQueries (cognitive 19): findStaleScanQueries has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (7 pts), boolean chains 6, ternaries 3 (5 pts), loops 1 (nesting depth added 5). Of this number, 18 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"audit-portals.mjs"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f96be9b84a66216656e9c712da652b8a86c9f4ab14811615e99d20afae485b"}},{"ruleId":"D2","level":"warning","message":{"text":"parseGrokEvent (cognitive 19): parseGrokEvent has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 5, ternaries 2 (4 pts), error handling 1, other 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/run-cli-support.mjs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"611135659680b80c911063bd8cd2c1a07d1cbd1b3d94535268cb3b5e7e2ca3ea"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 19): fetch has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), boolean chains 2, ternaries 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/careerviet.mjs"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"421d20cd2772157a776b878c22f2b26bf6f0535896f06476a8137b5aac18753a"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 19): fetch has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), boolean chains 2, ternaries 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/itviec.mjs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca37079e7438691fe23cd34f637b0aa7b92a0aa969ffd7cc7ae7dda4ebf2b3f1"}},{"ruleId":"D2","level":"warning","message":{"text":"add-entry.main (cognitive 18): add-entry.main has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (6 pts), boolean chains 5, error handling 3 (4 pts), ternaries 3 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"add-entry.mjs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ac239003fdc7b9b2e81112799b3d72871778e73876feedbe2c427ff82563dd"}},{"ruleId":"D2","level":"warning","message":{"text":"analyze-patterns.buildPredictedDiscardReasonSignals (cognitive 18): analyze-patterns.buildPredictedDiscardReasonSignals has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 5, loops 2 (3 pts) (nesting depth added 6). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1162}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a707703a114bd6bf7a3a13451b78a5e0bff9bd9666813b63cb440f10182f9c"}},{"ruleId":"D2","level":"warning","message":{"text":"build-cv-html.buildExperience (cognitive 18): build-cv-html.buildExperience has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, ternaries 4 (7 pts), if/else 2 (nesting depth added 3). Most of this is not in the body itself: 3 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 377, 353). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec2301adc90cf5490bd6b53e195011be520a880455f24bd3ee3b5cbb85247660"}},{"ruleId":"D2","level":"warning","message":{"text":"build-cv-html.buildEducation (cognitive 18): build-cv-html.buildEducation has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 10, ternaries 3 (6 pts), if/else 2 (nesting depth added 3). Most of this is not in the body itself: 3 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 488, 468). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2bbfc941ef644fbcfa9a5c0852e4e903292a78acb67a25fbb34a9e24c60cf42"}},{"ruleId":"D2","level":"warning","message":{"text":"build-cv-html.main (cognitive 18): build-cv-html.main has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6, ternaries 4 (5 pts), loops 2 (3 pts), boolean chains 2, error handling 2 (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ed13b59550433ab5d822e46278305196ba5ac1c4a1fa0cb5c631a693c75b1b"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate.loadLedgerReached (cognitive 18): calibrate.loadLedgerReached has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 8, loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"calibrate.mjs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9519eca56751bfca07d28af6a6610e0c333a75afce09985e996a21a90c692dc"}},{"ruleId":"D2","level":"warning","message":{"text":"check-jd-archive.classifyReportsByTrackerState (cognitive 18): check-jd-archive.classifyReportsByTrackerState has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 3 (4 pts), boolean chains 2, error handling 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5230aaa77b4b56b8ef882bdbab1fec1e4d2519d92550e6438781a19c7949760"}},{"ruleId":"D2","level":"warning","message":{"text":"check-table-freshness.runSelfTest (cognitive 18): check-table-freshness.runSelfTest has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 10, if/else 3 (4 pts), error handling 1 (2 pts), loops 1, ternaries 1 (nesting depth added 2). Of this number, 12 points are the body\u0027s own statements and 6 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d48f1dfc035898984e0ab70eccbf6f84e20d84e74180a5042e3a6f5bbcceb5"}},{"ruleId":"D2","level":"warning","message":{"text":"reply-matcher.checkRoleMatch (cognitive 18): reply-matcher.checkRoleMatch has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 4, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4dec78673953e12392d09181f744e0e5aad83f1c577d969bd0fbf57127f6c17"}},{"ruleId":"D2","level":"warning","message":{"text":"rippling.parseRipplingPage (cognitive 18): rippling.parseRipplingPage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (6 pts), ternaries 5 (6 pts), boolean chains 4, error handling 1 (2 pts) (nesting depth added 3). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 133, 154). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/rippling.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"6616ebef63b6f159ea6919d589b12979d74c45bce38c6526cd5fa53862257a47"}},{"ruleId":"D2","level":"warning","message":{"text":"_net.resolveAndValidate (cognitive 18): _net.resolveAndValidate has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3, error handling 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_net.mjs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"20dc0b89e2d280f6638bcddfa755d44bb966a03982c13bb7075fa67b76275f67"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.buildLocationFilter (cognitive 18): scan.buildLocationFilter has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, if/else 8, ternaries 1. Most of this is not in the body itself: 4 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 536, 544). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d98ee74219bea446022be4d118e80d19ae53a45e7b5d34e04b6d0141e8e7e4"}},{"ruleId":"D2","level":"warning","message":{"text":"doctor.onboardingState (cognitive 18): doctor.onboardingState has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (7 pts), boolean chains 4, error handling 2 (4 pts), if/else 1 (2 pts), loops 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"doctor.mjs"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"434bbc2780eb21e67eef620f168a6d506e05384de16a14a8792cf56159acf7e7"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-cover-letter.main (cognitive 18): generate-cover-letter.main has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8, boolean chains 3, error handling 2 (3 pts), loops 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-cover-letter.mjs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"d029a60ebbf7ef3c9b51684872a968ec07150990266867bc69f50e7d3dfad0bf"}},{"ruleId":"D2","level":"warning","message":{"text":"mjs-files.collectMjsFiles (cognitive 18): mjs-files.collectMjsFiles has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, error handling 1, loops 1 (nesting depth added 7). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 152). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/mjs-files.mjs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"882590512e963adbde5b391ea396c27a926b3a24ec283a150438bc1a22ba6437"}},{"ruleId":"D2","level":"warning","message":{"text":"merge-tracker.sortTrackerRowsInPlace (cognitive 18): merge-tracker.sortTrackerRowsInPlace has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 3 (4 pts), loops 3, boolean chains 2 (nesting depth added 4). Of this number, 10 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":1183}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e2222aa877ffb7c1ab755361cf46770cd1f1c883dd28d91bb9db02c1070973"}},{"ruleId":"D2","level":"warning","message":{"text":"negotiation-roi.analyze (cognitive 18): negotiation-roi.analyze has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), ternaries 3 (6 pts), loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"negotiation-roi.mjs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a7757be8633645b8ad1590d8000f2f50359e92c7489fa6bcf0bd2947ef79ed"}},{"ruleId":"D2","level":"warning","message":{"text":"check.main (cognitive 18): check.main has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 4, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/check.mjs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"0acdc1d12c5c56f45ca7111982eacc1549071ea69615bc7cef11f6ff546b2815"}},{"ruleId":"D2","level":"warning","message":{"text":"applitrack.parseApplitrackOutput (cognitive 18): applitrack.parseApplitrackOutput has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, if/else 4 (6 pts), ternaries 1 (2 pts), loops 1 (nesting depth added 3). Of this number, 16 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/applitrack.mjs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"58c32006755f58475354d00ae16499d396bfb4f271a62483c6e802314c8dbf3b"}},{"ruleId":"D2","level":"warning","message":{"text":"arbeitnow.normalizeArbeitnowJob (cognitive 18): arbeitnow.normalizeArbeitnowJob has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 5, boolean chains 4, error handling 1 (2 pts) (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/arbeitnow.mjs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c7f1bb0511093022b58055cca9607700361134ca057761ea65fc8842f279f8"}},{"ruleId":"D2","level":"warning","message":{"text":"comeet.parseComeetResponse (cognitive 18): comeet.parseComeetResponse has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 7, ternaries 6, if/else 2 (3 pts), error handling 1 (2 pts) (nesting depth added 2). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 118, 149). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/comeet.mjs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6bbe2b52842be26b06081697a526650c13f8ff812a99641579acd08ff66e8b7"}},{"ruleId":"D2","level":"warning","message":{"text":"feishu-jobs.parseFeishuJobsResponse (cognitive 18): feishu-jobs.parseFeishuJobsResponse has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 6, ternaries 3 (6 pts), if/else 3 (5 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/feishu-jobs.mjs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb23c8d94154a2ebe35ede6b4ce391fda7ff6aaeea4ebae08076762e394d036"}},{"ruleId":"D2","level":"warning","message":{"text":"flowxtra.normalizeFlowxtraJob (cognitive 18): flowxtra.normalizeFlowxtraJob has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (7 pts), boolean chains 5, ternaries 4, error handling 1 (2 pts) (nesting depth added 2). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/flowxtra.mjs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1b5489f1eaddbd92600c73679cefc98cf7607d0bb5de725283c53c77411f0f"}},{"ruleId":"D2","level":"warning","message":{"text":"ibm.parseIbmResponse (cognitive 18): ibm.parseIbmResponse has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 4 (7 pts), boolean chains 5, if/else 3 (5 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ibm.mjs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1706859cf235517811b8aa09590e25f15a7241d5b020c517949c65cdd9d995"}},{"ruleId":"D2","level":"warning","message":{"text":"radancy.parseLegacyResults (cognitive 18): radancy.parseLegacyResults has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), ternaries 2 (4 pts), error handling 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/radancy.mjs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f8fd7cbbd393901127c9217a15e310bff1fa42cb3489813068a027809e86b5"}},{"ruleId":"D2","level":"warning","message":{"text":"salary-gap.collectSources (cognitive 18): salary-gap.collectSources has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), error handling 1 (3 pts), loops 1 (2 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"042cdfbb3302679ee4cd9206af3633890160049e998e67b57145438d65757cc4"}},{"ruleId":"D2","level":"warning","message":{"text":"tracker.exportMd (cognitive 18): tracker.exportMd has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7, ternaries 6, boolean chains 3, loops 1 (2 pts) (nesting depth added 1). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"34b9f119c9930796858cbfaf8b0ddc8fbbd9aea64f03c1537669567fcb85ebd0"}},{"ruleId":"D2","level":"warning","message":{"text":"tracker-sync-check.buildSyncReport (cognitive 18): tracker-sync-check.buildSyncReport has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (6 pts), ternaries 2 (6 pts), boolean chains 5, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-sync-check.mjs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"70d196a5d20a0bde6a97eb739871b0c86eca989ad63ebedd434375612efa9340"}},{"ruleId":"D2","level":"warning","message":{"text":"update-system.checkStatus (cognitive 18): update-system.checkStatus has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (10 pts), boolean chains 4, if/else 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":2910}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5e89414b8c93170f80e00da5aeae424720048886da2c6e2af7e723d9643f235"}},{"ruleId":"D2","level":"warning","message":{"text":"today-dashboard.TodayDashboard (cognitive 18): today-dashboard.TodayDashboard has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 12, ternaries 6. Of this number, 15 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/home/today-dashboard.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"29b7effab6a1d1427332916ea1c2542d2fa84d2e94441de6f2cf1cf7bf580207"}},{"ruleId":"D2","level":"warning","message":{"text":"worker-card.WorkerCard (cognitive 18): worker-card.WorkerCard has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, ternaries 8 (9 pts) (nesting depth added 1). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/worker-card.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0d19a16017ef3e6b66cfefe012af9d0d861c524273cae9ec9a7f8983d8eaf5"}},{"ruleId":"D2","level":"warning","message":{"text":"discover.assembleDedupContext (cognitive 18): discover.assembleDedupContext has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3, boolean chains 2, error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/discover.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"08b45778d6d865776992fdbd5317af00b0571baa60b7d64e1de823fd2650f085"}},{"ruleId":"D2","level":"warning","message":{"text":"data.appendNotesInLine (cognitive 18): data.appendNotesInLine has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (18 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bbb27b6b0261c0210b79805dc9c7d5938a03cf6dbe2253ebecfde27cf9178f9"}},{"ruleId":"D2","level":"warning","message":{"text":"runAdd (cognitive 18): runAdd has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 1 (4 pts), loops 2 (3 pts), boolean chains 1, other 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-portals.mjs"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc4e52f82202ab86c6429ef1e49e8c5f97c3bbf87a9302a0b7e9359769d7e11"}},{"ruleId":"D2","level":"warning","message":{"text":"parseCards (cognitive 18): parseCards has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 3 (4 pts), other 2, ternaries 1 (2 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/builtin.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb9b5286ff349a4794baf5a4a393d15643af9a732880681732b95320ad309cd"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch (cognitive 18): fetch has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 5, ternaries 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/eightfold.mjs"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c9c6b08e272368487ef023f373e213d5cf3fb153b4d5f67c072c123b63685c"}},{"ruleId":"D2","level":"warning","message":{"text":"tracker-parse.markdownLinkDestination (cognitive 17): tracker-parse.markdownLinkDestination has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 2 (3 pts), boolean chains 2, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-parse.mjs"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"29a8b42387385fc0e636bf97535ca28257ca9605b596d148897c841f22b440f3"}},{"ruleId":"D2","level":"warning","message":{"text":"cli-flags.validateFlags (cognitive 17): cli-flags.validateFlags has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 8, if/else 7 (8 pts), ternaries 1 (nesting depth added 1). Most of this is not in the body itself: 6 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 122, 148, 116). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cli-flags.mjs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"5007efac3a3ad01da18b9a40a19a9e8f19ac17ff15d20b08b3f7256b4168b483"}},{"ruleId":"D2","level":"warning","message":{"text":"career-profile.reviewFact (cognitive 17): career-profile.reviewFact has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"career-profile.mjs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"032ea1c8d857c4648baa1256542cf28e72b73cabf75a5a627d32bdadc32765c0"}},{"ruleId":"D2","level":"warning","message":{"text":"pinpoint.parsePinpointResponse (cognitive 17): pinpoint.parsePinpointResponse has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 6, boolean chains 2, error handling 1 (2 pts) (nesting depth added 2). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to one function literal inside it that branches (line 128). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/pinpoint.mjs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e872dfe0bae725ef2f65b708bc8de99005347eefdc0b2cc47f772563e36c96"}},{"ruleId":"D2","level":"warning","message":{"text":"discover-ats.resolveWorkday (cognitive 17): discover-ats.resolveWorkday has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 2 (3 pts), error handling 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a09a5efce2dd26bef900b972e1b4bae40f982161a9850680dd6959b710fbf9"}},{"ruleId":"D2","level":"warning","message":{"text":"_net.isBlockedV4 (cognitive 17): _net.isBlockedV4 has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10, boolean chains 7. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_net.mjs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed1cb368b415855c21d80a4c58fbd3c3bcce4d248fefc51dc4450767ceddf62"}},{"ruleId":"D2","level":"warning","message":{"text":"latex-content.extractItemizeItems (cognitive 17): latex-content.extractItemizeItems has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (9 pts), ternaries 3 (4 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/latex-content.mjs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"a62b008689dc2cadae06f68f0045189bbc27b536daeb5d4bd3ad21fd7d7f07dd"}},{"ruleId":"D2","level":"warning","message":{"text":"reserve-report-num.occupiedFromFailedBatchState (cognitive 17): reserve-report-num.occupiedFromFailedBatchState has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 3, ternaries 1 (3 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reserve-report-num.mjs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d1c7a1fa520efdc6a2da7c66978012ae15ca28cd6f97cc0efb98294f35ea6b6"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-cv-facts.delegatedAuthorshipClaims (cognitive 17): verify-cv-facts.delegatedAuthorshipClaims has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 8). Of this number, 15 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf7f72793891c6bded2adde1105dbb61921e58ab06be8f317a0ae923a83bd44"}},{"ruleId":"D2","level":"warning","message":{"text":"verify-cv-facts.parseCliArgs (cognitive 17): verify-cv-facts.parseCliArgs has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 2, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":1018}}}],"partialFingerprints":{"codehealthFindingId/v1":"a32481e7344c36b1f73511c21879d4782ca1d8364190ea71cbdefdd5574bd95d"}},{"ruleId":"D2","level":"warning","message":{"text":"history-ats-seeds.parseTrackerAtsSeeds (cognitive 17): history-ats-seeds.parseTrackerAtsSeeds has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (6 pts), ternaries 3 (6 pts), boolean chains 4, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"history-ats-seeds.mjs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c402f8229cb6af31f83eac87073491a50d4da68ef3580b382a0a4c7b7e890b0"}},{"ruleId":"D2","level":"warning","message":{"text":"keyword-match.extractKeywords (cognitive 17): keyword-match.extractKeywords has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"keyword-match.mjs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2386682fcf7930bcb1b92995dd434f4cd9fb0cf866c966854ffc0656c0038dc"}},{"ruleId":"D2","level":"warning","message":{"text":"match-star.parseStories (cognitive 17): match-star.parseStories has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (8 pts), boolean chains 6, if/else 1 (2 pts), loops 1 (nesting depth added 5). Of this number, 15 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"match-star.mjs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f50368e991c9c41c2ae50519cecddd5614e34e0beb4a4de4ed4f51884333db4"}},{"ruleId":"D2","level":"warning","message":{"text":"merge-tracker.loadFailedReportNumbers (cognitive 17): merge-tracker.loadFailedReportNumbers has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 3, ternaries 1 (3 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"07dd2b4cc60acc25995971239db5ca80823c4ae3948230944fb4eebd7cfcb88c"}},{"ruleId":"D2","level":"warning","message":{"text":"plugins.cmdAdd (cognitive 17): plugins.cmdAdd has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 4 (5 pts), error handling 2 (3 pts), boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins.mjs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaba64ef696c1e194f5a78e717efa04d695fdfecf0944cb09354f4dc3d41e15c"}},{"ruleId":"D2","level":"warning","message":{"text":"_notion.createNotionClient (cognitive 17): _notion.createNotionClient has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (7 pts), loops 3 (4 pts), boolean chains 3, ternaries 2 (3 pts) (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/notion/_notion.mjs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a67ed2a1cde86ca76c6e6ea976f9934fa998c6df70aac5a9f08228b35b757d9"}},{"ruleId":"D2","level":"warning","message":{"text":"amazon.buildQuery (cognitive 17): amazon.buildQuery has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (7 pts), ternaries 3 (5 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/amazon.mjs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d82bea244441f3573069d108b07b80f27503d98b68e4966f2a4cb9da9f90407"}},{"ruleId":"D2","level":"warning","message":{"text":"jobicy.parseJobicyResponse (cognitive 17): jobicy.parseJobicyResponse has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6, boolean chains 5, ternaries 5, error handling 1. Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 53, 46). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobicy.mjs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a9e8f6ff8cf98e0628cd0876a546af79e5de68e235941f360f8a1bdc62365c"}},{"ruleId":"D2","level":"warning","message":{"text":"mokahr.parseMokaHrJobs (cognitive 17): mokahr.parseMokaHrJobs has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 3 (5 pts), boolean chains 3, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/mokahr.mjs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"d182284caa03eb672c5b0325fe6a9496252f9cc5a4ad0c2bf40e0149f9b5e70b"}},{"ruleId":"D2","level":"warning","message":{"text":"radancy.parseModernResults (cognitive 17): radancy.parseModernResults has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (7 pts), ternaries 3 (7 pts), error handling 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/radancy.mjs"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa157cd88d4f83f6ee126729251de48fcd81967bfe21259720eaf627aa0ca255"}},{"ruleId":"D2","level":"warning","message":{"text":"telegram-channel.employerName (cognitive 17): telegram-channel.employerName has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 6, loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"9951e842ca3407cd80ff38cb889d972a25dec21477176e488e4c680386a87b62"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 17): route.POST has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (7 pts), ternaries 4 (5 pts), error handling 4, boolean chains 1 (nesting depth added 3). Of this number, 15 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/apply/drive/route.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbec5ca4d0dc497a3c25620d097787d3a58a3bce3351a9d16b983ff27b1319a3"}},{"ruleId":"D2","level":"warning","message":{"text":"route.POST (cognitive 17): route.POST has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, ternaries 2 (4 pts), error handling 3, boolean chains 2 (nesting depth added 2). Of this number, 13 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/tracker/delete/route.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a950afc1a0a34a25e2e5126c687d2c57eba9e4da1a789895a1b219c440f1fe4"}},{"ruleId":"D2","level":"warning","message":{"text":"scan.runDiscovery (cognitive 17): scan.runDiscovery has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 4 (6 pts), boolean chains 3, loops 1 (nesting depth added 3). Of this number, 13 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/scan.ts"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff8193e7508092f7bc301636003e2d9e91b53c346bee78e3bcc9d13aa974b82"}},{"ruleId":"D2","level":"warning","message":{"text":"weekly-digest.extractGapsByCompany (cognitive 17): weekly-digest.extractGapsByCompany has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"70db49c69a5ce38a3feb7d272d6f3eed2febedf2467ded3f1cd385e6b3c5c9a4"}},{"ruleId":"D2","level":"warning","message":{"text":"parseHeadedAddition (cognitive 17): parseHeadedAddition has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 2, other 2, ternaries 2 (nesting depth added 1). Of this number, 12 points are the body\u0027s own statements and 5 belong to 8 function items inside it that branch. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"83551e96f3c7191c7dd98fa10e55c9365764d5f3bf597d84d60435d35d18c15c"}},{"ruleId":"D2","level":"warning","message":{"text":"parseFollowups (cognitive 17): parseFollowups has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (13 pts), boolean chains 2, loops 1, other 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3404453d00e3f5d8ccd47630b5f04368659fa2d0bcd3ec61275a6957d5c37bb"}},{"ruleId":"D2","level":"warning","message":{"text":"validateUrlSecurity (cognitive 17): validateUrlSecurity has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), error handling 2 (4 pts), boolean chains 2, loops 1, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d6dc0bf46dd56481f9cd58d7144da07327f1c225760517994c1fc81b17e7ad"}},{"ruleId":"D2","level":"warning","message":{"text":"fetchRssDiscovery (cognitive 17): fetchRssDiscovery has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (6 pts), boolean chains 5, loops 2 (3 pts), ternaries 1 (3 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f3e20d57b7b5dbb8bc7d8173a0b062625225201197e41853e2b1c7f14d2123"}},{"ruleId":"D2","level":"warning","message":{"text":"resolveTenant (cognitive 17): resolveTenant has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (6 pts), boolean chains 4, ternaries 2 (4 pts), error handling 1 (2 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/eightfold.mjs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"567fd636db1b7e3ef7a3e5e3cd7873dd248f3b4bee826f7fbb1e162451e00108"}},{"ruleId":"D2","level":"warning","message":{"text":"_registry.resolveProvider (cognitive 16): _registry.resolveProvider has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 2 (4 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_registry.mjs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"35ff43b50966fdb1c9a4e5c9490d4e9996b38451c48ffb865e118c7ce326ffce"}},{"ruleId":"D2","level":"warning","message":{"text":"build-cv-html.prepareCandidatePhoto (cognitive 16): build-cv-html.prepareCandidatePhoto has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 3, ternaries 3, error handling 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"369c79d05ec54bbbc15dab38875c7b927dd519e9b0dc53d7304ff095274bf5d9"}},{"ruleId":"D2","level":"warning","message":{"text":"company-funded.renderReport (cognitive 16): company-funded.renderReport has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 2 (6 pts), boolean chains 4, loops 3 (4 pts), if/else 1 (2 pts) (nesting depth added 6). Of this number, 13 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":849}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5cb0ff51e0f76eab83ee4192be2b8e46b4f1667e6eb3f75d4f606f02ef439bb"}},{"ruleId":"D2","level":"warning","message":{"text":"company-funded.printHuman (cognitive 16): company-funded.printHuman has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 6, ternaries 2 (5 pts), loops 2 (3 pts), if/else 2 (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":905}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c109c926982be87f37099dd82b0bf92b364b6d56d3b76258379a916a8cce73"}},{"ruleId":"D2","level":"warning","message":{"text":"funnel-velocity.foldObservations (cognitive 16): funnel-velocity.foldObservations has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (9 pts), ternaries 2 (5 pts), loops 2 (nesting depth added 8). Of this number, 11 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f8abd6ebea6aa46c5ff1302aa35470ffea3aca30633270545f8a636ed181be6"}},{"ruleId":"D2","level":"warning","message":{"text":"workable.parseWorkableWidget (cognitive 16): workable.parseWorkableWidget has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 4, ternaries 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/workable.mjs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3cd1d7a395bee4f81bc908b9cb7d1c6daf0d863c3fee8eb1e83deb9748a25d"}},{"ruleId":"D2","level":"warning","message":{"text":"_engine.mergeProviderPlugins (cognitive 16): _engine.mergeProviderPlugins has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 1 (3 pts), error handling 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/_engine.mjs"},"region":{"startLine":705}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ff25553e42416759a2503ea7549ef324d2dd5c40ed716da17c7b82feb07803"}},{"ruleId":"D2","level":"warning","message":{"text":"latex-content.extractSkillValues (cognitive 16): latex-content.extractSkillValues has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/latex-content.mjs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"43fb680b50cd92b66c3bb2f86aa8613becd0005266e10bb07beeaa982cf329bd"}},{"ruleId":"D2","level":"warning","message":{"text":"intake.extractAll (cognitive 16): intake.extractAll has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 5 (7 pts), if/else 5 (6 pts), boolean chains 1, error handling 1, loops 1 (nesting depth added 3). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 266). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc0745fc6911432281d46181c919900761e02e42015bae776ca7624dca27656c"}},{"ruleId":"D2","level":"warning","message":{"text":"api.plausibleMatch (cognitive 16): api.plausibleMatch has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), boolean chains 5, loops 2 (3 pts), ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 380, 404). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c99cbd42b85ac4b697052dea6958b38639b6b87253bc13139f328a41dc58420"}},{"ruleId":"D2","level":"warning","message":{"text":"cryptocurrencyjobs.parseCryptocurrencyJobsRss (cognitive 16): cryptocurrencyjobs.parseCryptocurrencyJobsRss has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 3 (6 pts), if/else 2 (4 pts), boolean chains 3, error handling 1 (2 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/cryptocurrencyjobs.mjs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a1a87861abf927822f7556759937d748d74dc94b51c456237a730cab7d0880"}},{"ruleId":"D2","level":"warning","message":{"text":"deutschebahn.parseHits (cognitive 16): deutschebahn.parseHits has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (7 pts), ternaries 3 (6 pts), error handling 1 (2 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/deutschebahn.mjs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfd1321dfc5a12d04ebe6039a8d36b6d8fac9af24dcbb52be233be6298fa5073"}},{"ruleId":"D2","level":"warning","message":{"text":"jobstreet.parseJobstreetItem (cognitive 16): jobstreet.parseJobstreetItem has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (7 pts), boolean chains 5, ternaries 2 (3 pts), error handling 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobstreet.mjs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b31821f387ac31cdd38249e502222fb8d3e21ca60f188baaa27d10b0eebe608"}},{"ruleId":"D2","level":"warning","message":{"text":"schoolspring.parseSchoolSpringPage (cognitive 16): schoolspring.parseSchoolSpringPage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 4, ternaries 1 (2 pts), loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/schoolspring.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcdb78331d76fef1cc8649c0f95cd5ae893e030f205f59208da5019f71fa7e3"}},{"ruleId":"D2","level":"warning","message":{"text":"taleo.parseColumns (cognitive 16): taleo.parseColumns has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 11 (14 pts), boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/taleo.mjs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad15b25c9dc69890cd27f55894269edd5c4906ca3268ab968ce1d9eaec782533"}},{"ruleId":"D2","level":"warning","message":{"text":"validate-portals.validateParser (cognitive 16): validate-portals.validateParser has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 9, if/else 7. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d4dbbaa1f2a87490c0f8d4571f4b4b739ba17a311fb7719a158c4145c1fa48"}},{"ruleId":"D2","level":"warning","message":{"text":"pipeline-sankey.classifyLeaf (cognitive 16): pipeline-sankey.classifyLeaf has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 2 (4 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/pipeline-sankey.mjs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6889ebcb1568fd98cd0ebbb629633ad67935fed4dd5192dc8a05728ededf71"}},{"ruleId":"D2","level":"warning","message":{"text":"portals-config.loadPortalsDocument (cognitive 16): portals-config.loadPortalsDocument has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 4 (8 pts), error handling 3 (4 pts), if/else 2 (3 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/portals-config.mjs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ef31c72d6589101ff6743e721c4b3e742aae876f9a73c328186739d5df6c274"}},{"ruleId":"D2","level":"warning","message":{"text":"profile-patch.profilePatchError (cognitive 16): profile-patch.profilePatchError has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 5 (7 pts), loops 2 (nesting depth added 2). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/profile-patch.mjs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e20907b322c508aad7ec40a233a39b112e1e6abcf28909acb2973d8a89c30b9"}},{"ruleId":"D2","level":"warning","message":{"text":"screens.findInlineMatch (cognitive 16): screens.findInlineMatch has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 2 (nesting depth added 4). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 566, 592, 580). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48ad3677ca995a6bb2667773cd6d7398d8aab087fb438037efa727e29f2c4e9"}},{"ruleId":"D2","level":"warning","message":{"text":"StatsModel.renderPay (cognitive 16): StatsModel.renderPay has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/stats.go"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f8b487e412a8a12b06dabac1eab0fef8573ad1ed1e2a90e05c405784630462"}},{"ruleId":"D2","level":"warning","message":{"text":"syncIndex (cognitive 16): syncIndex has cognitive complexity 16 (threshold 15). Drivers by points: other 6, ternaries 2 (4 pts), if/else 2 (3 pts), loops 2, error handling 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"d473b848e3e48dd7ca3d929aa2ac83438fc5632b48a5f674c3e1b11b4a62ebc2"}},{"ruleId":"D2","level":"warning","message":{"text":"normalizeListing (cognitive 16): normalizeListing has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), error handling 1 (2 pts), other 2, ternaries 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"browser-extract.mjs"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a09ff8339462b8651c1862397ce67e3d324ab543e460d2f2aa9db7a51c6a1b"}},{"ruleId":"D2","level":"warning","message":{"text":"main (cognitive 16): main has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (11 pts), error handling 3 (4 pts), boolean chains 1 (nesting depth added 2). Of this number, 15 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"browser-extract.mjs"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"88fce34e4e773a22f9aa0a9e01c4064b91f70d408934a100404f6da68a14a0e6"}},{"ruleId":"D2","level":"warning","message":{"text":"checkLivenessViaApi (cognitive 16): checkLivenessViaApi has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 3, error handling 2, ternaries 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-api.mjs"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7185284b2d41978fe1121021cf7553743d1fdd480c65e5aee820fcdabd5272"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Catalog: TooManyFields \u2014 134 stored fields beside 5 methods. The bar is 30 stored fields; this is 104 over it, 4.47\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/i18n/catalog.go"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce2c5a538e1ad6665f183f931ac04e71b6774e0e620590d67507d9230ad0821a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: company-history.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 394 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 294 over it, 3.94\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"c26552127815cfe2b442300d415c1832366c6de0f1117dd7cc6bd3c14721a38a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: scan-ats-full.main: FunctionTooLong \u2014 main runs 369 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 269 over it, 3.69\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc064be53b797105e9a3a918b21364384db01e620ce1393469b966270252383d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./update-system.mjs: FileTooLong \u2014 1843 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 1343 over it, 3.69\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d0fca0cda4c2f0dd20128a9ef50536485b63189479169a64fb94e93a319522"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./scan.mjs: FileTooLong \u2014 1832 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 1332 over it, 3.66\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7a40f0df0c1fec81e53c2586638dbe1e676b420486831556915ecaed1294f5f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: explore-provider.ExploreProvider: FunctionTooLong \u2014 ExploreProvider runs 366 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 266 over it, 3.66\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explore-provider.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"099714d474694a900881ac25b5c929fbe365b688d3f2d613cb33e0d78bd9ac51"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PipelineModel: ClassTooLong \u2014 1268 significant lines (blank, comment-only and punctuation-only lines excluded), 58 methods, 57 blocks, lines 259-2373. The bar is 400 significant lines; this is 868 over it, 3.17\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"92770b3b5744d26fcc16a481285dd5d10f8ff6199c70eae9e7a853ce27c0deea"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: screens/pipeline.go: FileTooLong \u2014 1508 significant lines (blank, comment-only and punctuation-only lines excluded), about 84% of them inside a single declaration: PipelineModel (57 blocks, 259-2373). The bar is 500 significant lines; this is 1008 over it, 3.02\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25613425a760b2b3fc0016115771f7c7eb187804e5bdf417544b93ce0c5498d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: apply-provider.ApplyProvider: FunctionTooLong \u2014 ApplyProvider runs 297 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 197 over it, 2.97\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply/apply-provider.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3984276ba2374fcba28d02699ba17c6d3ed3fbc66eb7400000824a574113d67"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: build-cv-html.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 277 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 177 over it, 2.77\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd79c76256c83cf4966c5e2a3c1109412d3f7a76cf973e87a53f35289c3f6bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: analyze-patterns.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 270 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 170 over it, 2.70\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5651c220e5fdf3af25d076e4a7726aa869b49d4755a0be7098b743b02de2721"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: check-jd-archive.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 270 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 170 over it, 2.70\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"c53127cd8665ba589062143f0444178304f36d78aaec6b8671a5765ac87b2ae7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: route.POST: FunctionTooLong \u2014 POST runs 249 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 149 over it, 2.49\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/run/route.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff9178e3468366b683fcf7eb4573150f27800e6dea54355a43200fdb0729d648"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: cv-ingest.CvIngest: FunctionTooLong \u2014 CvIngest runs 242 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 142 over it, 2.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5976982a3f7fdc374cfd9441e082019d7fc7e01ec7f54f54abf0c1a3e96a4d1f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: config-form.ConfigForm: FunctionTooLong \u2014 ConfigForm runs 241 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 141 over it, 2.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"97692a3c9fb06aa4be4ca253c3700ee48af851a28256404f6dc21ba633a20351"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: funnel-velocity.selfTest: FunctionTooLong \u2014 selfTest runs 235 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 135 over it, 2.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0aa09399e3dda5c29c563b9563a99f1555dc860541f80f336ad9265e9c41efa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: route.POST: FunctionTooLong \u2014 POST runs 234 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 134 over it, 2.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/explore/ai/route.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"94a441b26c9b802530512c6dc3ae7df07c93641589e1deb7a984a0048214ebe3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./analyze-patterns.mjs: FileTooLong \u2014 1044 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 544 over it, 2.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27ef549122fcc396c12030e954a87acab08ecb6c7bc6afb5eb9ec2be1c67b697"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./generate-pdf.mjs: FileTooLong \u2014 970 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 470 over it, 1.94\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"generate-pdf.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd4c0a4226c55aba42791b9c6b5ea3d53fb2856d2f69d8db31a43535e7a03ea6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PipelineModel: TooManyMethods \u2014 58 methods. The bar is 30 methods; this is 28 over it, 1.93\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"927dc2bc64d6a583cf51e2ee33750e65b8e8ee8067f61369ae5b90077012c56b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: explorer-view.ExplorerView: FunctionTooLong \u2014 ExplorerView runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.85\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explorer-view.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f2d68f5eeda1388c28b6d432c9f4b0b49546349e8e21a3e045067f1e0c35ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pipeline-view.PipelineView: FunctionTooLong \u2014 PipelineView runs 184 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 84 over it, 1.84\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/pipeline-view.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"915a51e0aa01572a719e19b9f060a49bb2632afd07039fe9f0688679ad80978c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: weekly-digest.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 183 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 83 over it, 1.83\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"56aa021bda4c1d6532f44b641de24a5ffb11241fa57d0615a6ed8e3a6819e6f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./company-history.mjs: FileTooLong \u2014 914 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 414 over it, 1.83\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e7e2a686a9c09dc6d9225564654f6a47610b928c94849baa59a256ffdf860ab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: invite-match.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 182 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 82 over it, 1.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invite-match.mjs"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b4b60cb5dafb62fcd86975d2d3cde21ef90ee7f69171b249dff069402499c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: analyze-patterns.analyze: FunctionTooLong \u2014 analyze runs 176 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 76 over it, 1.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":1281}}}],"partialFingerprints":{"codehealthFindingId/v1":"73e5c75c0befb737177526a84ad9b04e8f5f7c285e07b5a0d31d8d8144e234e4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./scan-ats-full.mjs: FileTooLong \u2014 858 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 358 over it, 1.72\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-ats-full.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b0c7f832be04985be346d9f84e9e615c3333520894e8aaf9802b80e72830a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: data.ComputeStatsMetrics: FunctionTooLong \u2014 ComputeStatsMetrics runs 170 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 70 over it, 1.70\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6ffe47b55d094357fa4dc23fa70f9b4170fd3a1eaa904a822974b04d7ef0bad"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: followups-view.FollowupsView: FunctionTooLong \u2014 FollowupsView runs 170 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 70 over it, 1.70\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a536519382c813ea54036186e229fa99e444d1234c27211a00fac23bbfa2a455"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: upskill.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 163 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 63 over it, 1.63\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"afe48ea0879c79410ce6c368e8603aaad81f66457373b10c99cb9daecff4d7e6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./build-cv-html.mjs: FileTooLong \u2014 814 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 314 over it, 1.63\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a056e347075f2dbf1106a60f78dabb748b9b302700ef9d04df57df1f007b45e9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./merge-tracker.mjs: FileTooLong \u2014 777 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 277 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"merge-tracker.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41fbfa400f75d96ae86b304b794acfe4ad33f80d7434699a3629cd634d16fce4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: check-table-freshness.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-table-freshness.mjs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"7789122d31311832a06e2c6d3f56580691b914bbe23209eb9ac66f566611d2f5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PipelineModel.handleKey: MethodTooLong \u2014 handleKey runs 154 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 54 over it, 1.54\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec2d23a28f265790f249fe8a0fd502f55fd8a510b97e71bc2e5c3d64808dbc2b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./company-funded.mjs: FileTooLong \u2014 768 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 268 over it, 1.54\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a648e5cf7db9dc00fb8ccf50f520ba5ffd15dfebe74bde0ea24505a898d862d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: detect-reposts.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 150 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 50 over it, 1.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"detect-reposts.mjs"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa69f042bde5df51bccaf8ba6f15208d0204fc772b966bf3885296b12dc861f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: aggregate-tokens.main: FunctionTooLong \u2014 main runs 145 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 45 over it, 1.45\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"batch/aggregate-tokens.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ba67f6bf439e49a4f76c628906759e21b2e3367bf716153d1abff88b3b2a4e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/career.go: FileTooLong \u2014 701 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 201 over it, 1.40\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"442b4d3f938bb79a83aaeae61ada4e3144f97bbd2cc8c90634557986b50859a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: log-dialog.LogDialog: FunctionTooLong \u2014 LogDialog runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/log-dialog.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f124734bbda2e5902acbc223a396c457dac99fe12f335048617ace17ebac74e6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mobile-nav.MobileNav: FunctionTooLong \u2014 MobileNav runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/mobile-nav.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe89c0850ddd0ceca52c0baeec1ea0fda22a51977cb599d1666d3add3a106ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: i18n/catalog.go: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 151 over it, 1.30\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/i18n/catalog.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a270a6f2f9ffec95f6d4ae7a715072b4b530306a0c4e5805cd4953485bd707b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./verify-cv-facts.mjs: FileTooLong \u2014 645 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 145 over it, 1.29\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-cv-facts.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42373b1e7cf1c9797da657d4f8888ceeb91a6f7303f4c67c48e0bb16df349eb2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: route.POST: FunctionTooLong \u2014 POST runs 128 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 28 over it, 1.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/cv/ingest/route.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4fb749d04084b0027116b0823dd9947ccaa9aa584987c475118580412cb8f83"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: today-dashboard.TodayDashboard: FunctionTooLong \u2014 TodayDashboard runs 128 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 28 over it, 1.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/home/today-dashboard.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"c538a7a32ddbe8a7da3d3089562bbccf28064ae01952d36baa6d66473c29dcf0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: route.POST: FunctionTooLong \u2014 POST runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/assistant/route.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e107b955fe181f1fe42271c37844006952005a91dd5432dc3967390fd9f1408"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: job-store.JobsProvider: FunctionTooLong \u2014 JobsProvider runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/job-store.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"0723428f799db1d48bc11f852e70cfaacfbb8f6ca45a3bc8c049406a39fa115c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: appModel.Update: MethodTooLong \u2014 Update runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/main.go"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84f06843f58ef053b1cdf792bea9232d56b3ac0e286653aa530058fd9db8ead"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: filter-builder.FilterBuilder: FunctionTooLong \u2014 FilterBuilder runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 20 over it, 1.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/filter-builder.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"46772b29a148c8ee57d0b9f44039237bc6e6f2fae0cf23a25b9af2e01d5696bf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tracker-sync-check.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 19 over it, 1.19\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-sync-check.mjs"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc652b0c114e23652cedd53a47549dc21a2feeb718fe5072962c096beaf4cc15"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./discover-ats.mjs: FileTooLong \u2014 573 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 73 over it, 1.15\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"282ae4ce625a7255fb799cc914c2992098371d2d3b088e7f6f5136a8b9a26671"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: openrouter-runner.callOpenRouter: FunctionTooLong \u2014 callOpenRouter runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"89cc3ceefd024b5f85746377c0ccc8602f53c15b16d38f5d58f2907d0f9c4830"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: next-date-dialog.NextDateDialog: FunctionTooLong \u2014 NextDateDialog runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/next-date-dialog.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"8607fe1ff0d6ba8274f582c41995b4b9e04dda5a5f88537778b1bf3280bd22d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: extract.extractForm: FunctionTooLong \u2014 extractForm runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/extract.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"087226faa69d3e6edb41da54bbcd98d3ee3ff1d3d05a340c3964e70db39c781d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/assistant-console.tsx: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/assistant-console.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b72e26b6336c9237d84cf9a922b2db08448aeb195a476207808d24b0eecf6d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: PipelineModel: TooManyFields \u2014 34 stored fields beside 58 methods. The bar is 30 stored fields; this is 4 over it, 1.13\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"55457f539df0b59aa6aba44686d4d7cec8ecb2a8b0df864ccfd65b39d2648f06"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./check-jd-archive.mjs: FileTooLong \u2014 566 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 66 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bd955bf78b8af1aa51fc31b0e34da4c3f07178890b508a594d25477ccdc7abf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pipeline-lock.acquirePipelineLock: FunctionTooLong \u2014 acquirePipelineLock runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pipeline-lock.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3a3fbbdae9b4d4f94923874fae6382915cdd0e23c6e55785a6fcc154d3e95de"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: rejection-latency.runSelfTest: FunctionTooLong \u2014 runSelfTest runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rejection-latency.mjs"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"00d4b6346bfeddee96b9ecb6bd13730d6feae83189341e811717276a77cc9a5d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./openrouter-runner.mjs: FileTooLong \u2014 559 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 59 over it, 1.12\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15843af3618140ae4ba8f9cf449531008967a5cc1dd7dd64723bd4fcee4ec01"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./verify-ats.mjs: FileTooLong \u2014 558 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 58 over it, 1.12\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"verify-ats.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7863eaac7941a058695211c30d7086a620cf93d62d0c419b7992441ba2ed632"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./funnel-velocity.mjs: FileTooLong \u2014 548 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 48 over it, 1.10\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"funnel-velocity.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf8fd7c3119d6736c04e65fab9e0e8cddc9c31c39d2cf47f9a14c57cee09e649"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: validate-portals.validatePortalsConfig: FunctionTooLong \u2014 validatePortalsConfig runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"validate-portals.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6c49bc31fcc00a433e7e4b916b9d49c826390bb61560c7ffd85101035ab09eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: session.fillSession: FunctionTooLong \u2014 fillSession runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac27b7ba3f0db811d034e79028559a65c00c76dde50f0f12ce421a94a63dd876"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: screens/viewer.go: FileTooLong \u2014 540 significant lines (blank, comment-only and punctuation-only lines excluded), about 74% of them inside a single declaration: ViewerModel (22 blocks, 33-806). The bar is 500 significant lines; this is 40 over it, 1.08\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/viewer.go"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1e903703be5620c2e897dacd0dfc993dbe3d1352e9fb43baed8f64a23973de"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: contact-extract.main: FunctionTooLong \u2014 main runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contact-extract.mjs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"16f264671e8ee76eadd6e7f96bad25b93f8faebde9de52a23c00b0de404b84ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: liveness-browser.checkUrlLiveness: FunctionTooLong \u2014 checkUrlLiveness runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"liveness-browser.mjs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"736574f5d2dcd6455fbe8e1f775c700d26119d5d52ca531e257c3d129cd2fa61"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: discovery-card.DiscoveryCard: FunctionTooLong \u2014 DiscoveryCard runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/discovery-card.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"61bd0c0667b4011f08531d02900cc84195520922481e811544148b83881f524d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./invite-match.mjs: FileTooLong \u2014 531 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 31 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invite-match.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd720bee0bf2a58485b01861d781516b804e1e3b47d71f0eb103606b7551bf2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./doctor.mjs: FileTooLong \u2014 530 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 30 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"doctor.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"670e7a7b0252e26fb7d9807b9a983f05a4341b9af6408febedd6893782886538"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tracker-utils.acquireTrackerLock: FunctionTooLong \u2014 acquireTrackerLock runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-utils.mjs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d5bc0e86150955a26f56beaf8e705472479507ce040bcfbc3fc7721c252bf1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./upskill.mjs: FileTooLong \u2014 529 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 29 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c942276774697926657a97bfbeb45a3194949d6cfa534cfc648d72f01dd8f993"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: cadence-settings.CadenceSettings: FunctionTooLong \u2014 CadenceSettings runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/cadence-settings.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffee98303b0ed9cb47a2f7705eab9c8dc024e893f3a2c820df32728ac632e916"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./tracker.mjs: FileTooLong \u2014 523 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 23 over it, 1.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"709c57abfa29df1487600c12642e07a54b52126f2b189054a54b8b8787f8fa86"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: followups-view.FollowupRow: FunctionTooLong \u2014 FollowupRow runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"496a03a0988401604a58a6053585e5fcc32cc627d02442ef65670e1d6399125c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./linkedin-join.mjs: FileTooLong \u2014 512 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 12 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"linkedin-join.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9996dff39dca4292a4c33a56f9612ac5bc9ba89c92d750b26ceec42f8aacf408"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: reply-matcher.classifyReply: FunctionTooLong \u2014 classifyReply runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"reply-matcher.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b309bf46ef73689ca83e02716b0652b5846ea0ccdc0959d095cdb0be38a35e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): dashboard/internal/ui/screens/pipeline.go:2032-2104 | dashboard/internal/ui/screens/progress.go:377-400 | dashboard/internal/ui/screens/stats.go:652-675 | dashboard/internal/ui/screens/viewer.go:703-733 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":2032}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ade30bdf166f139fe9faea1ff53f2ab3b20b58392563f2bd5503f942c9cedf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30\u201331 lines \u00D7 2): dashboard/internal/data/career.go:383-412 | dashboard/internal/data/career.go:469-499 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/data/career.go:383\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"12d8d7e6767ba1fbd8bd31ab8ab1fd5f87988bd5e2a68c0e356ff077589806c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201328 lines \u00D7 2): dashboard/internal/ui/screens/progress.go:94-121 | dashboard/internal/ui/screens/stats.go:250-273 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/ui/screens/progress.go:94\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/progress.go"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff2a5d974ee7e4b5bf8e8199747707764417dc48b3ab708aeac81204f03f626"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201327 lines \u00D7 2): dashboard/internal/ui/screens/pipeline.go:2108-2134 | dashboard/internal/ui/screens/viewer.go:769-794 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":2108}}}],"partialFingerprints":{"codehealthFindingId/v1":"acdf255f821a626908bc0b823cc3f3b28b9b696d4e1d7c1210cc8f803930d074"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201320 lines \u00D7 2): dashboard/internal/ui/screens/pipeline.go:502-520 | dashboard/internal/ui/screens/pipeline.go:993-1012 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/ui/screens/pipeline.go:502\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"089d9e4f5df8d3854dc3f002a22afd7bf6396d3c929ea908257bbb59d3c8c712"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): dashboard/internal/data/pdf.go:82-98 | dashboard/internal/data/pdf.go:126-143 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/data/pdf.go:82\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060dashboard/internal/data/pdf.go:99\u0060 calls \u0060isSafeRepoRelativePath\u0060 and \u0060dashboard/internal/data/pdf.go:144\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"2539749566484d39c062fbe5502d4e7e882708a4a04dfaf3f98cf1b1ff00674c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): dashboard/internal/ui/screens/pipeline.go:810-825 | dashboard/internal/ui/screens/viewer.go:740-755 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060dashboard/internal/ui/screens/viewer.go:739\u0060 calls \u0060clampScrollOffset\u0060 and \u0060dashboard/internal/ui/screens/pipeline.go:809\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":810}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f257ae5d79df1932ceff3f0e5b1ba0885a602b27ae34c6c8ce17d4c01631a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): dashboard/internal/ui/screens/progress.go:186-201 | dashboard/internal/ui/screens/progress.go:255-270 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/progress.go"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6c91a752692ed58a9efc6d9eb07fc1ec1818e47a101f5bef871e546dabd4461"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): dashboard/internal/data/career.go:238-249 | dashboard/internal/data/career.go:324-337 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/data/career.go:238\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"497249d7cd3154fc6823b655b1b4959df55c69c4e67f7977f458c2cb56ce8294"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): dashboard/internal/data/pdf.go:102-113 | dashboard/internal/data/pdf.go:144-155 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"cda6aee8887e7037c157e62ac8b60b8d05046afa02e3037917019504c1fceebb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): dashboard/internal/ui/screens/pipeline.go:2187-2196 | dashboard/internal/ui/screens/pipeline.go:2324-2331 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":2187}}}],"partialFingerprints":{"codehealthFindingId/v1":"6930982e4e5aaec53ff358d6e202589074f3153d9c9022f13933951787c131a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): dashboard/internal/ui/screens/progress.go:380-389 | dashboard/internal/ui/screens/stats.go:655-664 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/progress.go"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6a6be34a9bb84af6ba5735d94b91f8dbdf308f9d4baa5e0d36900eb28db787b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): dashboard/internal/data/pdf.go:197-205 | dashboard/internal/data/pdf.go:277-285 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"168d328825a4e53e66ed63e10f0401b16b7377461a3e1842ed22788c169b3a1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): dashboard/internal/ui/screens/progress.go:392-400 | dashboard/internal/ui/screens/stats.go:667-675 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/ui/screens/progress.go:392\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/progress.go"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa28e234e095a40d4ec6584ab1fbe379b54971729d1ebfd65345c9a633f67c1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): dashboard/internal/ui/screens/pipeline.go:2033-2040 | dashboard/internal/ui/screens/progress.go:378-385 | dashboard/internal/ui/screens/stats.go:653-660 | dashboard/internal/ui/screens/viewer.go:704-711 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 4 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":2033}}}],"partialFingerprints":{"codehealthFindingId/v1":"869e21afce37dd7366808abdecacab8c8ac8b0cb04dc8644aa6a666f375ff4fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): dashboard/internal/ui/screens/progress.go:157-163 | dashboard/internal/ui/screens/progress.go:226-232 | dashboard/internal/ui/screens/progress.go:329-335 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060dashboard/internal/ui/screens/progress.go:157\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/progress.go"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ab9ade4952db310c1da9d2d1977e30bab83735e6833551b4271a02c59568fc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): dashboard/internal/ui/screens/progress.go:124-129 | dashboard/internal/ui/screens/stats.go:276-281 | dashboard/internal/ui/screens/viewer.go:228-233 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/progress.go"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"4348494657b01c813b3ae53ec8c2de285c7e2bd61df756f943baeea563476d68"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): dashboard/internal/ui/screens/stats.go:429-433 | dashboard/internal/ui/screens/stats.go:503-507 | dashboard/internal/ui/screens/stats.go:568-572 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/stats.go"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b688d51e0f53e908fe562aaab5dedd25638eff7f92831679de80c6aaa72cae8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): dashboard/internal/data/career.go:332-338 | dashboard/internal/data/career.go:369-375 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"419252fafcc5c47dc916b015c7df22ddc6372ea1bddcbd42e9937a3f0219c4ee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: acquirePipelineLock: an ownerless lock older than the grace floor is still reclaimable (#2304): 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/pipeline-lock.test.mjs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"51108b9a3caf8844c62137f3719a402c972f6ca811ee994ee2bd4040b91722ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: the lock is released on a throwing path, not just the happy one: 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":"web/tests/lib/tracker-lock.test.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df835787786c894beb49ada2e538be7cae8a0c9a840893e542614b0627f6441"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: update-system.mjs: update-system.mjs changed 200 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 80 in update-system.apply at line 3276. 70 of those changes were fix/bug commits, and the other 130 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- update-system.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":"update-system.mjs"},"region":{"startLine":3276}}}],"partialFingerprints":{"codehealthFindingId/v1":"d00591262e16981a9da05f6d3b177eac27832879c1fc198411c3aa24fa68586f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scan.mjs: scan.mjs changed 76 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 191 in scan.main at line 3268. 40 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- scan.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":"scan.mjs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"150526ad7703e19f26b944680afb4e64b1cefb44d345eb6c47d8d3d648be31cb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: test-all.mjs: test-all.mjs changed 324 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in test-all.runDiscovered at line 182. 145 of those changes were fix/bug commits, and the other 179 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- test-all.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":"test-all.mjs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"622316ff1b06aa63f78a38db8f2fc0ad3c744014da1fbf8cc6fb5c8d3f385632"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scan-ats-full.mjs: scan-ats-full.mjs changed 37 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 140 in scan-ats-full.main at line 903. 25 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- scan-ats-full.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":"scan-ats-full.mjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2b95e9c033e7f04d309d2e59e6ef55a7434ba23b9d763293f20837354f4d5af"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: analyze-patterns.mjs: analyze-patterns.mjs changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 107 in analyze-patterns.runSelfTest at line 421. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- analyze-patterns.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":"analyze-patterns.mjs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"102e501f9270a984bb26b278c5a4391861e44e35fb5607baa1dd7ce81414f000"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: build-cv-html.mjs: build-cv-html.mjs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 82 in build-cv-html.runSelfTest at line 853. 11 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- build-cv-html.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":"build-cv-html.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"a52e880caa198739161d032b7e1f6ea621d36c280baa925327585506b6443523"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/run/route.ts: web/src/app/api/run/route.ts changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in route.POST at line 28. 17 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/run/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/run/route.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6a511a9f39e233b5a18f69c2df384bc7aae062ea3574f3236862e86ffd281d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: generate-pdf.mjs: generate-pdf.mjs changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in generate-pdf.generatePDF at line 1367. 25 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- generate-pdf.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":"generate-pdf.mjs"},"region":{"startLine":1367}}}],"partialFingerprints":{"codehealthFindingId/v1":"2861e9da690b589170a7dbf3c86f25486bcb9214051c776cfce1aca683bb3f2c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: followup-cadence.mjs: followup-cadence.mjs changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in followup-cadence.extractContacts at line 663. 17 of those changes were fix/bug commits, so the churn is repair rather than feature work. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- followup-cadence.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":"followup-cadence.mjs"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3a5791b2bc1d5277bbdccee1142cb6df803f4aece45f4ad4e7676d3b2760c41"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: dashboard/internal/ui/screens/pipeline.go: dashboard/internal/ui/screens/pipeline.go changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 58 in PipelineModel.handleKey at line 528. 8 of those changes were fix/bug commits, and the other 9 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- dashboard/internal/ui/screens/pipeline.go\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a282c323d3297b26a5c9b187e9fb86b8d87153503b09b6f05a6bf45b57b3682"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: dashboard/internal/data/career.go: dashboard/internal/data/career.go changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 63 in data.NormalizeStatus at line 539. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- dashboard/internal/data/career.go\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"64988feb57f9535e1614706ec3e48fbd8b2968a44ebbc7a4b743197cf2ce4d08"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: merge-tracker.mjs: merge-tracker.mjs changed 39 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in merge-tracker.parseTsvContent at line 985. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- merge-tracker.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":"merge-tracker.mjs"},"region":{"startLine":985}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b2f2b587b04f6bad590dbb6320769ead31bffec14b8209e4733ec0830ee4f8f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: upskill.mjs: upskill.mjs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in upskill.runSelfTest at line 552. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- upskill.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":"upskill.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"3113a11ac6431cc20f1335abdb61fc89179a47333953186a087b1025a3451237"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: verify-cv-facts.mjs: verify-cv-facts.mjs changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in verify-cv-facts.runCli at line 1385. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- verify-cv-facts.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":"verify-cv-facts.mjs"},"region":{"startLine":1385}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5478efdbc85fe1b4ac8a61c2c1633cf5dfb018cee977df4f6cf859dda21a2e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: tracker-utils.mjs: tracker-utils.mjs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in tracker-utils.acquireTrackerLock at line 393. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- tracker-utils.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":"tracker-utils.mjs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"675f7df896fc3198e6db8e1a15b8a27570e42237f4c12e6d705bb5024131ca67"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pipeline-lock.mjs: pipeline-lock.mjs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in pipeline-lock.acquirePipelineLock at line 370. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- pipeline-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":"pipeline-lock.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8651bef89c68ce6f9343b60a13df0e2207bb96859189369ec5754f2e54cf2ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/explore/explore-provider.tsx: web/src/components/explore/explore-provider.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 110 in explore-provider.ExploreProvider at line 116. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/explore/explore-provider.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explore-provider.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"98929704f43ec26e6dc96cccd35466d1462c51d88f6bbb46c726b6f2491c993c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: build-cv-latex.mjs: build-cv-latex.mjs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in build-cv-latex.runSelfTest at line 288. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- build-cv-latex.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":"build-cv-latex.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13bb6e3a875a9c39cdde894ffbd50faf551b5c1f7346d696e7fe06eaebce1b5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: stats.mjs: stats.mjs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in stats.computePortalStats at line 341. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- stats.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":"stats.mjs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd76415ff5e02f9ef4684c8c1d9069194305d75752026638d5f71cf4f37d6ca4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: doctor.mjs: doctor.mjs changed 32 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in doctor.onboardingState at line 842. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- doctor.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":"doctor.mjs"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d68b6b4d146b27d85c7ca70d06e7ba7feb5cca871566508a1eaaf1ee5c49aa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: validate-portals.mjs: validate-portals.mjs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in validate-portals.validatePortalsConfig at line 167. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- validate-portals.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":"validate-portals.mjs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d7c23dd1b6fe0d5eb2979e7584064903e6250951a981da2b82b4a530d08847"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/assistant-console.tsx: web/src/components/assistant-console.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 100 in assistant-console.AssistantConsole at line 152. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/assistant-console.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/assistant-console.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"2924fb1337ac593f13fd6c631454dbb48932b883e621d68d85f3f0767be1c9c9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/workday.mjs: providers/workday.mjs changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in workday.chooseSplitFacet at line 279. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/workday.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":"providers/workday.mjs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"211e67d6b235ec4ddde381f252040d40062ac3e29a5614eb882d05827461a85b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: openrouter-runner.mjs: openrouter-runner.mjs changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in openrouter-runner.callOpenRouter at line 225. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- openrouter-runner.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":"openrouter-runner.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"89a60e569b8d750958755b3e2a70a5616476b9a5ed8b29d3096c852ee718673c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/_http.mjs: providers/_http.mjs changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in _http.fetchInContext at line 107. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/_http.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":"providers/_http.mjs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f07f370f3d6ff63b4d6e0c4e701aac6e83421b812dffb8c0379761885545b26"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: salary-gap.mjs: salary-gap.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in salary-gap.selfTest at line 410. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- salary-gap.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":"salary-gap.mjs"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4e771624cf0cdd47cb164c9c1a9770d8e833586fe3db51bbe4b853f93fa3ed4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/pipeline-view.tsx: web/src/components/pipeline-view.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in pipeline-view.PipelineView at line 35. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/pipeline-view.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/pipeline-view.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e75560fd3d7c63fcf0f3b8f1a814dcb89b5910d56107d5e772f6d75dbe3408a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: liveness-browser.mjs: liveness-browser.mjs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in liveness-browser.checkUrlLiveness at line 242. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- liveness-browser.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":"liveness-browser.mjs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed967467f57942ae83c06d39ef22df488aa121422f656a95ef3387af375f8a72"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: discover-ats.mjs: discover-ats.mjs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in discover-ats.resolveCompany at line 620. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- discover-ats.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":"discover-ats.mjs"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6446a0a3a042552c3d6666b0c3c13188965be03ecd43a7b2534eb2ab42bc451"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: tracker.mjs: tracker.mjs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in tracker.parseMarkdownRows at line 311. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- tracker.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":"tracker.mjs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c2ca1c60beebdccc9b8049dd94c4a2d9ac8d4882485ff9d0acee626824b4a15"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/explore/ai/route.ts: web/src/app/api/explore/ai/route.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in route.POST at line 46. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/explore/ai/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/explore/ai/route.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1cbd8806974e95b2e93759198af54a23877c694d206879dceebd14facc13a18"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/explore/explorer-view.tsx: web/src/components/explore/explorer-view.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in explorer-view.ExplorerView at line 31. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/explore/explorer-view.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explorer-view.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"789e512c209a072954b42faf95ba4470c51ba8a0eabe08fa825f6529d8fe287b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: upgrade-tests.mjs: upgrade-tests.mjs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in upgrade-tests.runLeg 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- upgrade-tests.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":"upgrade-tests.mjs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd7ceb8d12ab1a2166fd1e35cea9b96aa7438743498114f58c2aa611651e5f60"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/lib/career-ops.ts: web/src/lib/career-ops.ts changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in career-ops.readLanguageConfig at line 560. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/career-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":"web/src/lib/career-ops.ts"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b3de4eb06f728cc524f5192bca096a3319ec379c37ae7aa06d9a4e8930928e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invite-match.mjs: invite-match.mjs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in invite-match.runSelfTest at line 916. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- invite-match.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":"invite-match.mjs"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98077588675a71a478fed8d412d2c193b03383dd0e9883d04eea9126d3dbec8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: verify-portals.mjs: verify-portals.mjs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in verify-portals.verifyCompanies at line 643. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- verify-portals.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":"verify-portals.mjs"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"a07cc37cf2c78a9301dbeab16c304c4f8a89259f6182fa15c3fc7cfa7075af36"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: company-history.mjs: company-history.mjs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in company-history.computeResponsiveness at line 394. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- company-history.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":"company-history.mjs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"07920402ce24a32d3530936043595caafa5d0db42db14c8abb48d49ad43f9238"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: role-matcher.mjs: role-matcher.mjs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in role-matcher.roleFuzzyMatch at line 217. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- role-matcher.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":"role-matcher.mjs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"737a29e48d7cb28a5edc80ce07106970df4ad90eaafbb4464a466a1503170dd1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: reply-matcher.mjs: reply-matcher.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in reply-matcher.classifyReply 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- reply-matcher.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":"reply-matcher.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"5974ab6a1fee4fd331a734cbda15ff3b3c09e0ffcd7e7098af6b848f2f0fe6e2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: followup-seed.mjs: followup-seed.mjs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in followup-seed.acquireFollowupsLock at line 316. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- followup-seed.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":"followup-seed.mjs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd8dd6b95b6fd3aa730259edd87f589b4f91d0bbed58e64a0f1adda16a0a9c6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: tracker-parse.mjs: tracker-parse.mjs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in tracker-parse.extractTrackerReportNumbers at line 428. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- tracker-parse.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":"tracker-parse.mjs"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c805b9084fb087251aa2b4f39b229101f828734141592420d91887c242e8be8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: detect-reposts.mjs: detect-reposts.mjs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in detect-reposts.detectReposts at line 313. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- detect-reposts.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":"detect-reposts.mjs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc09d9bdb31197f2edadaa4b12c16c7972e52659cbd94428fd86ee0a50e6fbb7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: generate-cover-letter.mjs: generate-cover-letter.mjs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in generate-cover-letter.main at line 313. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- generate-cover-letter.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":"generate-cover-letter.mjs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf1bfb162c5af4af1caaa9e3fcb9f6ac2667c1909168f1bba8ba7d0a61ff1f7c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/config-form.tsx: web/src/components/config-form.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in config-form.ConfigForm at line 38. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/config-form.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b27a39699a85d02416174208022ba81dd64e3d5895bacceeec69e4eeaca9a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: funnel-velocity.mjs: funnel-velocity.mjs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in funnel-velocity.selfTest at line 491. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- funnel-velocity.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":"funnel-velocity.mjs"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"270fb9c21445f106279a01cb4d6d0e5d4ecec7dc3c4b3bbead287790026ff484"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: browser-extract.mjs: browser-extract.mjs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in browser-extract.readDom at line 729. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- browser-extract.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":"browser-extract.mjs"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc23fdddc3a44f631ef0e283985bab6cbe639d0c83ed9f78d2ff36127a0d5842"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: dashboard/main.go: dashboard/main.go changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in appModel.Update at line 84. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- dashboard/main.go\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/main.go"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"8df6bb9a2a46bd3628ae64bc439a20d2229958de9fd270f40ede434706899c94"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/assistant/route.ts: web/src/app/api/assistant/route.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in route.POST at line 55. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/assistant/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/assistant/route.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"6100daece077e6f318de39a260a6ffb58d6a90b7d1dd8c8781f4b433e1e5a5ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: plugins.mjs: plugins.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in plugins.cmdRun at line 128. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- plugins.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":"plugins.mjs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"176f8776842247506f9418fb1dcf58e2617694a26fe7b561b861e04d963b7f6c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: rejection-latency.mjs: rejection-latency.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in rejection-latency.computeRejectionLatency at line 325. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- rejection-latency.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":"rejection-latency.mjs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"be415bad606c851df0a9c984892a136990cfa423eb9461988617ae875cd20a25"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: weekly-digest.mjs: weekly-digest.mjs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in weekly-digest.runSelfTest at line 418. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- weekly-digest.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":"weekly-digest.mjs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96c9b53eda35c21d9c70c0d499ffa9744524b548aee7a0a16d7ed80bed829ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/home/today-dashboard.tsx: web/src/components/home/today-dashboard.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in today-dashboard.TodayDashboard at line 23. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/home/today-dashboard.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/home/today-dashboard.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8040417dc44834fa6f5a8b685e20014737d62d3266db9eec2e376f5d72d14611"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: reserve-report-num.mjs: reserve-report-num.mjs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in reserve-report-num.runCli at line 332. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- reserve-report-num.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":"reserve-report-num.mjs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"9705dfa5441f8f04c333eb172341380245f3478489fafc63803f110b9c74c818"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/apply/apply-provider.tsx: web/src/components/apply/apply-provider.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 90 in apply-provider.ApplyProvider at line 60. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/apply/apply-provider.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply/apply-provider.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"500b2a3d9e6a24e221f10b72d2bee8f8f60913c195065ed0ea3d6a236e901396"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/ashby.mjs: providers/ashby.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ashby.formatLocation at line 233. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/ashby.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":"providers/ashby.mjs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"07575e3f7e1a92b3969a0a02df912926ca48ddb91e0bb48909f1bc7476de9103"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: reply-watch.mjs: reply-watch.mjs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in reply-watch.main at line 222. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- reply-watch.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":"reply-watch.mjs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"55cbc365a6a7f27aa5017329370329d4dee02fb15573e36db322972e1d72ee91"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scan-interamt.mjs: scan-interamt.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in scan-interamt.main at line 290. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- scan-interamt.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":"scan-interamt.mjs"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd6c6744cae4532192d67e833089614036a3daf412844c353ebd50122366c90"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/cv/ingest/route.ts: web/src/app/api/cv/ingest/route.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in route.POST at line 68. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/cv/ingest/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/cv/ingest/route.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f94766c37c740ef39949e34828cff3632083bb8a6f81df5e363b2bfcf1c7f493"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: archive-posting.mjs: archive-posting.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in archive-posting.parseCliArgs at line 97. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- archive-posting.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":"archive-posting.mjs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84cbe517f14b15c77cd28b7a5448a0fdaa343c862c9e4e1e8cc49e2ccc95bd2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: dashboard/internal/data/derive.go: dashboard/internal/data/derive.go changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in data.deriveNoteFields at line 156. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- dashboard/internal/data/derive.go\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/derive.go"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f5786d0de4e02aafd407c6afd4b71b5e76d3bcf68de1d83bfa273586f2cfc2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: audit-portals.mjs: audit-portals.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in audit-portals.main at line 377. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- audit-portals.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":"audit-portals.mjs"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"668397e2b88ab1d4656d4f03bcef180199d1701b8fd24e870f9019dcb0a82ce5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/lib/core/scan.ts: web/src/lib/core/scan.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in scan.runScanner at line 186. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/core/scan.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/scan.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"69634b8555fedad2016eb04d618c4960df9a83cd5e8a3500dc66b214f5181084"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/cv/cv-ingest.tsx: web/src/components/cv/cv-ingest.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in cv-ingest.CvIngest at line 30. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/cv/cv-ingest.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6fbff9dd09e56d05ba0007274927ccef256e600b4e33d93e67f199d7190113"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: normalize-statuses.mjs: normalize-statuses.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in normalize-statuses.normalizeStatus at line 58. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- normalize-statuses.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":"normalize-statuses.mjs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d6f5c4fa5d796df5451d156e1cdbec4eef0666f1f20a10ed2bcaee349b1920"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: application-answers.mjs: application-answers.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in application-answers.main 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- application-answers.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":"application-answers.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"35058f1e9be0ad800fa5dc9085caf24640ed1dd234c0c2455c8e3ed59d2af7bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: verify-ats.mjs: verify-ats.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in verify-ats.auditAts at line 400. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- verify-ats.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":"verify-ats.mjs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ca3e2ea11cd7877286adc79bd4c93e33d82807ca00efb93294f5d29b8af011"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: calibrate.mjs: calibrate.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in calibrate.loadLedgerReached 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- calibrate.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":"calibrate.mjs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bb7f1562aa8b73d904b51453a39414adacc5a3ac115a08ed845ddf6a0fe42d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: tracker-writer-lock-tests.mjs: tracker-writer-lock-tests.mjs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in tracker-writer-lock-tests.runWhileLocked at line 115. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- tracker-writer-lock-tests.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":"tracker-writer-lock-tests.mjs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9420cacdc78bf7a788445895519238add1f98ababa5f448126fa05edb05cea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scan-hn.mjs: scan-hn.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in scan-hn.main at line 86. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- scan-hn.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":"scan-hn.mjs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a1649977822b9a2d8884f3130e17e440649a0d0516650eca9dcb75bc45530b5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/apply/prefill/route.ts: web/src/app/api/apply/prefill/route.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in route.POST at line 19. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/apply/prefill/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/apply/prefill/route.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cab73ad4e0f2caa69256d5d357feee0f3502e65460115e9583a2d3038432d8c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/successfactors.mjs: providers/successfactors.mjs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in successfactors.fetchCsb at line 303. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/successfactors.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":"providers/successfactors.mjs"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"f968e6a35e23942c9126bea1cd72543f0515606c6da3d0b31ae207006ccbd047"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/pythonorg.mjs: providers/pythonorg.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in pythonorg.parsePythonOrgFeed at line 85. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/pythonorg.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":"providers/pythonorg.mjs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"8949e18f1787f4080ce6f262802bbf3e194c95227a282a6c6bef502a74996d68"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/generalist-world.mjs: providers/generalist-world.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in generalist-world.stripNonRendered at line 130. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/generalist-world.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":"providers/generalist-world.mjs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee956a0c3dfad7df8fda29f3ac8559bbdeef6c3ec50ebc1ce88635ceee2443b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: portal-health-lock.mjs: portal-health-lock.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in portal-health-lock.acquirePortalHealthLock at line 107. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- portal-health-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":"portal-health-lock.mjs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"a12fbdeb218b9fe0d449ddbe836f2313fb69d04f92d7910cefc8dce2778ae3e4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: add-entry.mjs: add-entry.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in add-entry.main at line 219. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- add-entry.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":"add-entry.mjs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"637d121760c511475e26bdfb1006d2ed16ff93a89de2a716d569e2b2c26584d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/_dns-cache.mjs: providers/_dns-cache.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in _dns-cache.createCachedLookup at line 225. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/_dns-cache.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":"providers/_dns-cache.mjs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"fab2140577bae553975ab27df3532b38b2541b49d9fc422b50a39a15e56609a4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: generate-latex.mjs: generate-latex.mjs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in generate-latex.validateLatexContent at line 68. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- generate-latex.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":"generate-latex.mjs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"489e2945df4cee8da1569126e3001c3fb2bc3a3f0afd8111aea8cef511e1deae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/beta/beta-banner.tsx: web/src/components/beta/beta-banner.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in beta-banner.BetaBanner at line 23. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/beta/beta-banner.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/beta/beta-banner.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"fae749b31fc9806171f26f440ea15780bef3a5ad9abc5ec6d5349531adc8e0f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/recruitee.mjs: providers/recruitee.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in recruitee.assembleLocation at line 138. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/recruitee.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":"providers/recruitee.mjs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc0f95da5f3c269566094ae4b26a3882ac865e6c72135f3c459db1d470b293c1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scaffolder/bin/cli.mjs: scaffolder/bin/cli.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in cli.main at line 87. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- scaffolder/bin/cli.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":"scaffolder/bin/cli.mjs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6259bd7d55d4cf5335c151eeeb68a3d8d7de6d8d78b974f2de2bf76aa5b1db3f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/mobile-nav.tsx: web/src/components/mobile-nav.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in mobile-nav.MobileNav at line 37. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/mobile-nav.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/mobile-nav.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ed132b814a8bdc7b8c40304dc676cd078037ae6d8dd3176b85abb885c895f0f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: hired-wall-build.mjs: hired-wall-build.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in hired-wall-build.buildSvg at line 152. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- hired-wall-build.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":"hired-wall-build.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6ca7effb22b108568920ceb2abd96a07dd9e7dd87309092ab170c3a79d35bc0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/jobs/worker-card.tsx: web/src/components/jobs/worker-card.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in worker-card.WorkerCard at line 78. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/jobs/worker-card.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/worker-card.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9f4adedb19a8c2d4ee3c5a956cb2aed75d9afdec2ab5f7b209bd4bd4018f40e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/cli-flags.mjs: lib/cli-flags.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in cli-flags.validateFlags at line 106. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- lib/cli-flags.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":"lib/cli-flags.mjs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea9da0c8e206860a9a2edc468d75c85c067722db44ffbc9a7a7fe791e9f0c90"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/jobs/job-store.tsx: web/src/components/jobs/job-store.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in job-store.JobsProvider at line 59. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/jobs/job-store.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/jobs/job-store.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"a239ebb477afb826a34fc97f7c3aef5a8aec4ce89d33ceb492783585f9503bbc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: hired-share.mjs: hired-share.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in hired-share.main at line 142. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- hired-share.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":"hired-share.mjs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa6882d1485ef73e8d85eab7a251c2870b2319fce0409fd1321dbbc67934272"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/explore/discovery-card.tsx: web/src/components/explore/discovery-card.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in discovery-card.DiscoveryCard at line 41. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/explore/discovery-card.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/discovery-card.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dcc97096366fd302ddd39c5fb6dbbadeebac040226dc1ebc359288a6d607899"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/smartrecruiters.mjs: providers/smartrecruiters.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in smartrecruiters.parseSmartRecruitersResponse at line 194. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/smartrecruiters.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":"providers/smartrecruiters.mjs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f175d3c83b575d5e968bc5fafca284aec97596aa14c6ac4fdb4ab9a749f3332"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: check-jd-archive.mjs: check-jd-archive.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in check-jd-archive.checkJdArchive at line 423. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- check-jd-archive.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":"check-jd-archive.mjs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"59464775ebde1c2d595e1791ac0aa1d16b7c71d12f84d08daeb65556e1ce5c2b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: classify-tier.mjs: classify-tier.mjs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in classify-tier.classifyTier at line 30. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- classify-tier.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":"classify-tier.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"583325d67d002f16791e99c0366857826e68630c8348ab48df46df1f17c2e5f2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lib/latex-escape.mjs: lib/latex-escape.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in latex-escape.escapeLatex at line 12. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- lib/latex-escape.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":"lib/latex-escape.mjs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"85aadf83b4e378c3abea326e46e7a79a09ccfcb3331e43cd9e785f20a0dacf2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/status/route.ts: web/src/app/api/status/route.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in route.POST at line 107. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/status/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/status/route.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"0487aa3bad63fb1fb0bc1659e20200209e9bd51f64cfca50be368cc547734b44"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/cv-pdf/route.ts: web/src/app/api/cv-pdf/route.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in route.GET at line 32. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/cv-pdf/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/cv-pdf/route.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"566b10b3073573ac32bac911a1ebcdc9af29eed6b3f761cf2bc74a6c3b2199a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/lib/apply/session.ts: web/src/lib/apply/session.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in session.openSession at line 179. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/apply/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":"web/src/lib/apply/session.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b1df666da12e40a3ee6e02692222464ce57784ee92f52211a375b7107ee997"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/followups/log/route.ts: web/src/app/api/followups/log/route.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in route.POST at line 30. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/followups/log/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/followups/log/route.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce3aaf875015c57de65547e2f2c18746aafc82fa8241baf64bcbde2df7249dd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: url-key.mjs: url-key.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in url-key.normalizeUrl at line 79. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- url-key.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":"url-key.mjs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fb7b6b474f3738017424cf2c3aae17a091fe72a0981743ae390e814c0761533"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/home/follow-up-card.tsx: web/src/components/home/follow-up-card.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in follow-up-card.FollowUpCard at line 25. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/home/follow-up-card.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/home/follow-up-card.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"5189d8447a08755f61ba16e1ff74bac2b8b69d83a829d053ef3a01c6d5c93431"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/whats-new/route.ts: web/src/app/api/whats-new/route.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in route.GET at line 22. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/whats-new/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/whats-new/route.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a625176b85cd7f3d5484006e8ac0e3fa72619838d8e889717617ea308bdcf285"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/lib/core/pipeline.ts: web/src/lib/core/pipeline.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in pipeline.addOffersToPipeline at line 22. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/core/pipeline.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/pipeline.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a13bbd5f775b6feec11b6d782ba1472b08da33a47271ec2b761b65f6a8ac2b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/explore/results-list.tsx: web/src/components/explore/results-list.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in results-list.ResultsList at line 13. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/explore/results-list.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/results-list.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fd93566ec912117ace3a6d829bd0fe18de6ec9a2a3b89d4201f596884f59785"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: providers/thehub.mjs: providers/thehub.mjs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in thehub.normalizeHubJob at line 81. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/thehub.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":"providers/thehub.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"937eb9ead4609885eeb0a4b05dc8473275f5c3e2f268df47ae9af8c7c18750a9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/components/portals-view.tsx: web/src/components/portals-view.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in portals-view.PortalsView at line 21. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/portals-view.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/portals-view.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeac0ebcf21c8de71778534e25b1652379946358a94b8a631a34b59063fdb135"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/app/api/logo/route.ts: web/src/app/api/logo/route.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in route.GET at line 45. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/logo/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/logo/route.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc8ba34c83ff6734c84a7042fe0add21378447c0c3ff38454642c5573ab269c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: web/src/lib/explore-ai.ts: web/src/lib/explore-ai.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in explore-ai.makeAiStreamParser at line 56. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/explore-ai.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/explore-ai.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d52934450b0d7b47db32f6918f9269e0c36d33ce6e8387dd5a368e9a83cdaeb"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: verify-pipeline.mjs: verify-pipeline.mjs changed 20 times in last 90 days and 13 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 verify-pipeline.extractRole at line 275), 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(verify-pipeline): don\u0027t flag same company\u002Brole reports that carry distinct posting URLs (#4636)\u201D; \u201Cfix: canonical states, data-root paths, pipeline parser, and link regex (#3559) (#3561)\u201D; \u201Cfix(verify-pipeline): stop counting a SKIP row as a submission channel (#3978) (#4415)\u201D; \u201Cfix(verifiers): resolve provider plugins like the scanner (#4026) (#4046)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- verify-pipeline.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":"verify-pipeline.mjs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed368c79c77a7535baf0858662362eccac781c9474deb7dd216efe5b1bace92e"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: set-status.mjs: set-status.mjs changed 19 times in last 90 days and 12 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 set-status.resolveCandidates at line 378), 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(tracker): allow correcting stale notes without hand-editing (#4494)\u201D; \u201Cfix(set-status): the canonical tracker write path cannot find a configured tracker (#3987) (#3988)\u201D; \u201Cfix(set-status): add --help/-h and list the canonical states in usage (#4066)\u201D; \u201Cfix(set-status): a transition into Applied seeds the follow-up from set-status itself (#3470)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- set-status.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":"set-status.mjs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a515525994b29b65102eace5cc8bae64e4243b444009e755e0133bccf80539"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: tests/helpers.mjs: tests/helpers.mjs changed 16 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 9 (its worst body is resolveAllowedExecutable at line 163), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(tests): guard subtree-anchored walkers against nested checkouts (#3792)\u201D; \u201Cfix(update-system): apply() cannot commit when a path it stages is ignored or never tracked\u201D; \u201Cfix(tests): make the suite symlink-aware for externalized user layers\u201D; \u201Ctest(hermetic-env): move the regression to its own discovered file\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- tests/helpers.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":"tests/helpers.mjs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe71987745a866cd4747bc36bcc2a55690b6f5fdd3fbdb66fe95503dc273cfd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: tracker-columns-tests.mjs: tracker-columns-tests.mjs changed 12 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 11 (its worst body is tracker-columns-tests.runScript at line 50), 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(web): the web tracker reader drops the Apply Link and Follow-up columns (#3603)\u201D; \u201Cfix(tracker): carry the tracker layout through the export round-trip (#3794)\u201D; \u201Cfix(tracker): resolve addition columns by name so score and status cannot transpose\u201D; \u201Cfix(web): make the tracker reader agree with parseTrackerRow on row shape (#2565)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- tracker-columns-tests.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":"tracker-columns-tests.mjs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c470811584e61bf846b851c425908b8647409e3511fcff8adf816e5ae92d46"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: jd-skill-gap.mjs: jd-skill-gap.mjs changed 12 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 14 (its worst body is jd-skill-gap.scanJd at line 239), 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(jd-skill-gap): recognize bolded and uncontracted requirements headings (#4285)\u201D; \u201Cfix: improve error message for missing cv.md\u201D; \u201Cfix(jd-skill-gap): resolve cv.md against the data root\u201D; \u201Cfix(jd-skill-gap): recognize Traditional and Simplified Chinese requirement headings (#3631)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- jd-skill-gap.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":"jd-skill-gap.mjs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed6ae0e58f59299ea0ced4000248bb394b2f5fb5478ce495076001ae64c8c38"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: gemini-eval.mjs: gemini-eval.mjs changed 14 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 13 (its worst body is gemini-eval.validateEvaluationShape at line 300), 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(eval): date reports with the local calendar day, not the UTC one (#4227)\u201D; \u201Crefactor(eval): single-source the tracker-addition helpers, and fix the fifth site no copy-scan could find (#3796) (#3906)\u201D; \u201Cfix(gemini-eval): write the **URL:** report header so its rows reach the URL dedup key (#3876)\u201D; \u201Cfix(eval): parse the score in gemini-eval instead of concatenating it (#3799)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- gemini-eval.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":"gemini-eval.mjs"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28af8370c5a03441d270f72d99f36c7c009d9fd5e888f56f70015ef2fca4176"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: ollama-eval.mjs: ollama-eval.mjs changed 11 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 2 (its worst body is ollama-eval.readFile at line 180), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(eval): date reports with the local calendar day, not the UTC one (#4227)\u201D; \u201Crefactor(eval): single-source the tracker-addition helpers, and fix the fifth site no copy-scan could find (#3796) (#3906)\u201D; \u201Cfix(ollama-eval): stream the response and make num_ctx configurable via OLLAMA_NUM_CTX (#3922)\u201D; \u201Cfix(eval): persist openai/ollama evaluations as tracker additions (#3797)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- ollama-eval.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":"ollama-eval.mjs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f7e798c504f7d89c54742eb03a48a66f8ad6d35faac6f4f673475891b4fc28"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: set-status-tests.mjs: set-status-tests.mjs changed 13 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is set-status-tests.runSetStatus at line 48), 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(set-status): resolve --report links from the Notes cell on customized layouts (#3075)\u201D; \u201Cfix(set-status): rejects today\u0027s date east of UTC, logs tomorrow\u0027s west of it\u201D; \u201Cfix(set-status): stop the --role guard from folding every non-Latin title to the same key (#2736)\u201D; \u201Cfix(set-status): close the report-less-row blind spot and add explicit --row/--report selectors (#2347)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- set-status-tests.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":"set-status-tests.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"44f45cd46718b7da71ab7b8e8b071dab60c4e39d700dfe360fee449a1f12b3de"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: dedup-tracker.mjs: dedup-tracker.mjs changed 10 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is dedup-tracker.roleMatch at line 218), 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(dedup-tracker): reject unrecognized flags instead of silently live-running (#2746)\u201D; \u201Cfix(dedup): write the blind-via key prefix as an escape, not a raw NUL byte\u201D; \u201Cfix(dedup): use the shared Unicode-aware company key instead of a local ASCII copy (#2587)\u201D; \u201Cfix(dedup): use Unicode-aware Via key for blind-employer grouping (#2397)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- dedup-tracker.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":"dedup-tracker.mjs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"35456ece57076c36597faead9069c851a844dcae995da96bbe441bdc6169c14f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: openai-eval.mjs: openai-eval.mjs changed 13 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 2 (its worst body is openai-eval.readFile at line 235), 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 model-aware MiniMax context budgets (#4650)\u201D; \u201Cfix(eval): date reports with the local calendar day, not the UTC one (#4227)\u201D; \u201Crefactor(eval): single-source the tracker-addition helpers, and fix the fifth site no copy-scan could find (#3796) (#3906)\u201D; \u201Cfix(eval): persist openai/ollama evaluations as tracker additions (#3797)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- openai-eval.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":"openai-eval.mjs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1c18db4983587e4975caa27137bec5e4b9f21a3a3f819d3156bb8d724ecc62"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/cli-fencing.mjs: web/src/lib/cli-fencing.mjs changed 8 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is cli-fencing.assertCodexArgvUnfenced at line 239), 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(web): normalize Codex config keys and stop the probe hanging on a held pipe\u201D; \u201Cfix(web): tighten Codex fencing validation\u201D; \u201Cfix(web): harden post-merge fencing checks\u201D; \u201Cfix(web): make the fencing probe suite portable, and close two scan gaps\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/cli-fencing.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":"web/src/lib/cli-fencing.mjs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a18cb5377d2af4521015889f0d486706dad1afefb50137d728ddb95a5c01e86"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: validate-system-paths-coverage.mjs: validate-system-paths-coverage.mjs changed 10 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is validate-system-paths-coverage.covered at line 112), 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(updater): drop SIGNATURES.md from SYSTEM_PATHS so a new signature stops reading as system drift (#4074)\u201D; \u201Cfix(coverage): exclude the local-paths declaration file so a fork can commit it\u201D; \u201Cfix(update): reconcile .gitignore on apply so new ignore rules reach existing installs (#2857)\u201D; \u201Cfix(test): make the SYSTEM_PATHS coverage guard actually run in CI (#2240)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- validate-system-paths-coverage.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":"validate-system-paths-coverage.mjs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed53397e49c81830cd954fd10f179d779ebc793edbd38772f6a39a44ae04c26d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/clis.ts: web/src/lib/clis.ts changed 8 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is clis.searchDirs at line 76), 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(web): give grok a parser, and make the token fold per-CLI (#2689)\u201D; \u201Cfix(web): find Grok in its default install dirs, not only on PATH\u201D; \u201Cfix(web): keep Codex JSONL \u002B exit code authoritative for web scoring (#2102)\u201D; \u201Cfix(web): enforce that no runtime grants itself blanket write permission (#2875)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/clis.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/clis.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"3603ef047105c6cb0390de0ea46823bd23c1695685cfc1fcd648ebb64ed37c02"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/run-prompts.mjs: web/src/lib/run-prompts.mjs changed 7 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is run-prompts.buildPrompt at line 103), 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(web): resolve the CV template from cv.template on dashboard runs (#4035)\u201D; \u201Cfix(web): don\u0027t let a failed fetch become a scored report (#3826)\u201D; \u201Cfix(tracker): resolve addition columns by name so score and status cannot transpose\u201D; \u201Cfix(web): honour language.modes_dir and language.output on web-triggered runs (#3253)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/run-prompts.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":"web/src/lib/run-prompts.mjs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"86bcd9032d16809197e696e0a6db713416e1b6de128b05e40752961ed0a423ec"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: batch-evaluate-gemini.mjs: batch-evaluate-gemini.mjs changed 7 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is batch-evaluate-gemini.processOffer at line 250), 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: handle dead postings in batch evaluation (#4381)\u201D; \u201Cfix(eval): date reports with the local calendar day, not the UTC one (#4227)\u201D; \u201Cfix(batch-evaluate): _profile.md and tracker-additions resolve to the code root (#4347) (#4348)\u201D; \u201Crefactor(eval): single-source the tracker-addition helpers, and fix the fifth site no copy-scan could find (#3796) (#3906)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- batch-evaluate-gemini.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":"batch-evaluate-gemini.mjs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"f334a01eb0e6a19c252a1e25af333a95cde9f2c0eef9ce5b64a888dfe82d10a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: outcome.mjs: outcome.mjs changed 7 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is outcome.archivedCopyVerified at line 540), 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(outcome,tracker): stamp the local calendar day, not the UTC one (#3989) (#3990)\u201D; \u201Cfix(set-status): the canonical tracker write path cannot find a configured tracker (#3987) (#3988)\u201D; \u201Cfix(outcome): a tracker edit forks the append-only journal, and directory order decides which half counts (#3325)\u201D; \u201Cfix(calibrate): read all 14 outcome spellings outcome.mjs writes (#3322)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- outcome.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":"outcome.mjs"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b1e79d586b01448fe75edd87100bc2a447b9beb4b018eab8ce4d7c0ba724fb0"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/avature.mjs: providers/avature.mjs changed 7 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is avature.resolveConfig at line 60), 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(avature): read article--jobs cards, titled from the h3 anchor (#4559)\u201D; \u201Cfix(providers): avature preserves facet filters across pages, flags broken parses (#4252)\u201D; \u201Cfix(providers): raise inter-page pacing to 250 ms on the eight providers still at 150 (#3095)\u201D; \u201Cfix(providers): guard decodeEntities against out-of-range code points (#2150)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/avature.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":"providers/avature.mjs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4044cc90072eee1adc260af34e8cae8e773b52a948f7176abc979d1d48017bd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/cli-fencing-probe.mjs: web/src/lib/cli-fencing-probe.mjs 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 cli-fencing-probe.readCliHelp at line 63), 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(web): normalize Codex config keys and stop the probe hanging on a held pipe\u201D; \u201Cfix(web): tighten Codex fencing validation\u201D; \u201Cfix(web): harden post-merge fencing checks\u201D; \u201Cfix(web): make the fencing probe suite portable, and close two scan gaps\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/cli-fencing-probe.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":"web/src/lib/cli-fencing-probe.mjs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdad2f1f750a752654ae0052ef609bef11365d4d1ca7fc436acca3d2f0133f0a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: cv-templates.mjs: cv-templates.mjs changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is cv-templates.discover at line 139), 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(update-system): exempt a user-configured named template variant from the templates/ prune (#3700)\u201D; \u201Cfix(paths): resolve user-layer files via the data root in batch-tailor, cv-templates and openrouter-runner (#4570)\u201D; \u201Cfix(deps): make js-yaml imports work on both 4.x and 5.x (#2656)\u201D; \u201Cfix(templates): allowlist the template format to prevent path traversal (#1776)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- cv-templates.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":"cv-templates.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5566f7ca4abb8359bd4250f9d939080f6ac0424980d95abcb3152eb4674550b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: find.mjs: find.mjs changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is find.findMatches at line 114), 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(generate-pdf): key the PDF manifest on report number and artifact kind (#3959)\u201D; \u201Cfix(find): print the one USAGE constant on the empty-query path too\u201D; \u201Cfix(find): reject mistyped flags instead of searching for them\u201D; \u201Cfix: resolve the PDF manifest from the tracker, not the install dir (#2471)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- find.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":"find.mjs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"28083515a592c93fb84bc655f3219e300e3fe7f3ebfc954ca9514709e3b35574"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/components/home/decision-card.tsx: web/src/components/home/decision-card.tsx changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is decision-card.DecisionCard at line 15), 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(web): show Via attribution for confidential employers\u201D; \u201Cfix(web): use next/link for decision-card report link (#1931)\u201D; \u201Cfix(web): Today primary action opens the report (#2967)\u201D; \u201Cfix(web): contrast tokens \u2014 AA across both themes (#1627)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/home/decision-card.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/home/decision-card.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"b346b4fd81bf17686f8bfbac53671c9fb56750874ba98589982759afb5ff7692"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/app/analytics/page.tsx: web/src/app/analytics/page.tsx changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is page.Analytics at line 20), 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(web): pluralize the Analytics evaluation count (#3161)\u201D; \u201Cfix(web): analytics tells an offer-holder they have 0 interviews (and nudges them to try harder) (#2410)\u201D; \u201Cfix(web): propagate the Hired terminal-success state across the whole dashboard (#2250)\u201D; \u201Cfix(web): portals copy \u002B analytics semantics (#1628)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/analytics/page.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/analytics/page.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"985c97b35c292f7cb83e6dc0a65d403dbe8d1bb45b045edfd63e6278e22b565d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/greenhouse.mjs: providers/greenhouse.mjs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is greenhouse.buildOfficeMap at line 111), 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(providers): read greenhouse embed slug, support myworkdaysite boards (#4515)\u201D; \u201Cfix(scan): opt-in location-aware company\u002Brole dedupe (#3751)\u201D; \u201Cfix(greenhouse): populate job.description from the boards API content field (#3175)\u201D; \u201Cfix(scan): recover Greenhouse office cities when location.name is a work model (#2104)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/greenhouse.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":"providers/greenhouse.mjs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"85226b521c40f2e2c2c67ca7d54a40e465e99d0eecfafbb6565a4e61bd42cd49"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/icims.mjs: providers/icims.mjs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is icims.pickLocation at line 223), 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(icims): stop doubling the careers- prefix on iCIMS board hosts\u201D; \u201Cfix(icims): read every jobLocation entry when picking the location (#3728)\u201D; \u201Cfix(providers/icims): fill a missing location from the posting\u0027s JSON-LD\u201D; \u201Cfix(providers): raise inter-page pacing to 250 ms on the eight providers still at 150 (#3095)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/icims.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":"providers/icims.mjs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98337b218b47a98f59e675c6ede713cc30614b72db4c23df40d5fd18c0b983d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/phenom.mjs: providers/phenom.mjs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is phenom.resolveConfig at line 75), 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(providers): a lone surrogate in one id/slug no longer aborts the whole page\u201D; \u201Cfix(providers): decode HTML entities in titles before matching so encoded ampersands stop dropping jobs (#2923)\u201D; \u201Cfix(providers): phenom pagination/retry fixes, drop dead auto-detection (#2669)\u201D; \u201Cfix(providers): dead boards throw instead of reading as live-but-empty (#2379)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/phenom.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":"providers/phenom.mjs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"22af6304e1e54b75561f976a90e8a79a5e806b969c880fdba8e6a44e3563d8c1"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/tkms.mjs: providers/tkms.mjs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is tkms.parseQuery at line 105), 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(tkms): re-encode the config locale, hoisted out of the row loop to fail loud\u201D; \u201Cfix(providers): coerce before the try; drop tkms encode of the config locale\u201D; \u201Cfix(providers): a lone surrogate in one id/slug no longer aborts the whole page\u201D; \u201Cfix(providers): decode HTML entities in titles before matching so encoded ampersands stop dropping jobs (#2923)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/tkms.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":"providers/tkms.mjs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ffc731a61482a8fcf5c97c302bd9e2053c24e338d06b0e758b1f7853d7a70e"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: followup-seed-tests.mjs: followup-seed-tests.mjs changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is followup-seed-tests.run 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(followup-seed): resolve \u0022today\u0022 in local time, not UTC (#2765)\u201D; \u201Cfix(followup): ignore an apply date cited about another row (#2610)\u201D; \u201Cfix(tracker-utils, followup-seed): floor the ownerless stale-lock check so a just-created lock can\u0027t be stolen\u201D; \u201Cfix(followup-seed): age out an orphaned recover guard so it can\u0027t permanently disable stale-lock recovery\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- followup-seed-tests.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":"followup-seed-tests.mjs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"485d7ff5c7cf6c18151ecf754c28ce06f3706b5a8c865efd11376998a6052ee6"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: sync-pdf-flags.mjs: sync-pdf-flags.mjs changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is (anonymous) at line 108), 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(merge-tracker): --help exits early and post-merge hooks resolve from the code root under an external data root (#3761)\u201D; \u201Cfix(cv,pdf): address CodeRabbit review feedback for #2213\u201D; \u201Cfix(sync-pdf): reject unknown options\u201D; \u201Cfix: resolve the PDF manifest from the tracker, not the install dir (#2471)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- sync-pdf-flags.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":"sync-pdf-flags.mjs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"12b558a84a9a1a783a91e2fa0dd3116e18766f3c42970717087119dda4c92abb"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/tracker-table.mjs: web/src/lib/tracker-table.mjs changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is tracker-table.loadHeaderAliases at line 61), 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(web): the web tracker reader drops the Apply Link and Follow-up columns (#3603)\u201D; \u201CFix web status filters for external data roots (#4410)\u201D; \u201Cfix(web): make the tracker reader agree with parseTrackerRow on row shape (#2565)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/tracker-table.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":"web/src/lib/tracker-table.mjs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"117b80afebf11f099ccef1bd27beb5eda99dd5ad3a807fde6306dcb50eda5069"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/radancy.mjs: providers/radancy.mjs changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is radancy.parseLegacyResults at line 204), 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(providers): radancy stops trusting totalResults, cache-busts JSON, retries every fetch (#3839)\u201D; \u201Cfix(providers): route softgarden and radancy through the shared entity decoder (#2487)\u201D; \u201Cfix(providers): dead boards throw instead of reading as live-but-empty (#2379)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/radancy.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":"providers/radancy.mjs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf41c1a3f87e8b8d24489db354b40f9b9069c1bdf57f5b7d5fa2efc823e0967"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/components/explore/filter-builder.tsx: web/src/components/explore/filter-builder.tsx changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is filter-builder.KeywordField at line 28), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(web): block_hard survives the Explore round-trip \u2014 type, URL params, seed and serializer (#3102)\u201D; \u201Cfix(web): ux-audit cleanup \u2014 CostBadge global CSS \u002B last sub-44 stragglers (#1648)\u201D; \u201Cfix(web): 44px tap-targets at the component level (#1629)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/components/explore/filter-builder.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/filter-builder.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"787dbcacd8759040dd45c68f53bd4409712d7707347d16bdedaa26f0f427abef"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: agent-inbox-tests.mjs: agent-inbox-tests.mjs changed 5 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is agent-inbox-tests.causeOf at line 70), 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(agent-inbox): lock resolve rewrites so a concurrent add is never dropped (#3479)\u201D; \u201Cfix(agent-inbox): seed the queue under the lock, not before it\u201D; \u201Cfix(agent-inbox): stop dropping requests queued during an add (#2614)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- agent-inbox-tests.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":"agent-inbox-tests.mjs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd96af040a78ff524ffb5d09cffd4d49d7b5729ed26441633e76afaec6dff72"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/rheinmetall.mjs: providers/rheinmetall.mjs changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is rheinmetall.parseVacancies at line 62), 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(providers): refuse redirects by default in _http.mjs (#4080)\u201D; \u201Cfix(rheinmetall): guard the slug-fallback decode against a malformed percent-escape\u201D; \u201Cfix(providers): guard decodeEntities against out-of-range code points (#2150)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/rheinmetall.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":"providers/rheinmetall.mjs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2a98d61788cc3f812b4e0cdf9e2122d36138ee154f4dbadcb78a308a0a3a48"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/lever.mjs: providers/lever.mjs changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is lever.resolveLocation at line 59), 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(providers): give the Lever board feed a 30s timeout, not the 10s default (#4284)\u201D; \u201Cfix(providers/lever): fold categories.allLocations into location\u201D; \u201Cfix(providers): support explicit api: override for ashby/lever with host-pinned guards\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/lever.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":"providers/lever.mjs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c3cb69475508f80dccf5572eb7f9e99cc4cd7c4fa7e5afc6553d3a0fe9f03b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: theme-style.mjs: theme-style.mjs changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is theme-style.styleTokensFrom 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(templates): make the CV template\u0027s second hardcoded color themeable (#3699)\u201D; \u201Cfix(deps): make js-yaml imports work on both 4.x and 5.x (#2656)\u201D; \u201Cfix(theme-style): a \u0060$\u0060-pattern in a profile style value splices the body into the CV\u0027s \u003Chead\u003E\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- theme-style.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":"theme-style.mjs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c52bf10792788daa28e1e1f950a9b346a612cc1fa4bd604f82589115b7268c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/app/api/profile/route.ts: web/src/app/api/profile/route.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 route.patchToProfile 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(web): validate profile updates before writing (#4500)\u201D; \u201Cfix(web): preserve profiles with invalid YAML root shapes (#4108)\u201D; \u201Cfix(deps): make js-yaml imports work on both 4.x and 5.x (#2656)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/app/api/profile/route.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/profile/route.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcc72288092a1e07f1403a00bac3db93e94fead035a45fe6639bbbd5248c797e"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: lib/mjs-files.mjs: lib/mjs-files.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 12 (its worst body is mjs-files.collectMjsFiles at line 131), 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(tests): a killed test run leaves no trap for the next one (#3968)\u201D; \u201Cfix(tests): guard subtree-anchored walkers against nested checkouts (#3792)\u201D; \u201Cfix(tests): skip nested checkouts by marker, not by the name .git (#3681)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- lib/mjs-files.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":"lib/mjs-files.mjs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b8412988316a2ed0ec40dccce11efd2547581177e6ab6394ec19a34ba01082d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/spawn-cli.mjs: web/src/lib/spawn-cli.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 spawn-cli.spawnHeadlessCli at line 47), 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(web): launch npm CLIs on Windows (#2626)\u201D; \u201Cfix(web): reconcile Codex fencing with the inline sandbox from #2361\u201D; \u201Cfix(web): fence agent CLIs at the spawn boundary\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/spawn-cli.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":"web/src/lib/spawn-cli.mjs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6113480f786f50097ac3f13bac71dd6b0916ab8ac84ed2515234c8ed55cac1b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/pdf-render.mjs: web/src/lib/pdf-render.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 8 (its worst body is pdf-render.pdfRunOutcome at line 48), 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(web): surface a successful render\u0027s warnings instead of dropping them (#3995)\u201D; \u201Cfix(web): ignore nonfatal CLI stderr on clean run exit (#1974)\u201D; \u201Cfix(web): take Write/Edit away from the dashboard\u0027s pdf mode (#2508)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/pdf-render.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":"web/src/lib/pdf-render.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"5844ff3821306a15a193e8afeefdcf6fa5904592fc57d1ea7415d3547db47bb1"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: providers/arbeitsagentur.mjs: providers/arbeitsagentur.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 10 (its worst body is arbeitsagentur.normalizeJob at line 110), 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(providers): a lone surrogate in one id/slug no longer aborts the whole page\u201D; \u201Cfix(arbeitsagentur): move to the v6 Jobsuche API (#2494)\u201D; \u201Cfix(arbeitsagentur): only tag nationwide-remote when homeofficetyp is VOLLSTAENDIG (#1981)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- providers/arbeitsagentur.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":"providers/arbeitsagentur.mjs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b35a5a5fb23300c8d3741b2682e9851ded971d62a9376850449a2d8f1c1c55f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/apply/cv.ts: web/src/lib/apply/cv.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 9 (its worst body is cv.resolveTailoredCv at line 16), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(web): resolve the tailored CV for THIS application, not the newest for the company\u201D; \u201Cfix(web): require the cv- prefix so the tailored-CV resolvers stop returning the cover letter (#2156)\u201D; \u201Cfix(web): a company with no usable slug must not match every tailored CV (#3214)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/apply/cv.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/cv.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"2106cdf356bbcef744051fa640296bb81710886c5762ec214049b862daa217ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: web/src/lib/core/portals.ts: web/src/lib/core/portals.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 8 (its worst body is portals.seedExploreFilters at line 66), 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(web): block_hard survives the Explore round-trip \u2014 type, URL params, seed and serializer (#3102)\u201D; \u201Cfix(web): read target_roles with the shape it is actually written in (#2750)\u201D; \u201Cfix(deps): make js-yaml imports work on both 4.x and 5.x (#2656)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 14:16:25 \u002B00:00\u0027 --until=\u00272026-10-01 14:16:25 \u002B00:00\u0027 --full-history --no-merges -- web/src/lib/core/portals.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/core/portals.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"7483b059aae9ad8c7f59642c293e47280642f4581dbd11654ae221834bfb2cba"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 12 significant file(s) lose their only recent owner: hired-wall-build.mjs, web/src/components/beta/beta-banner.tsx, plugins/apify/index.mjs, web/src/components/explore/first-score-view.tsx, web/src/components/portals-view.tsx, web/src/lib/report/report.ts, web/src/components/inbox/shortlist-tray.tsx, web/src/lib/core/followups-lock.ts (\u002B4 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"98bc43f2fb6aea4d65c4034477c0e5d171dd0b83aaffd298762226e97ce57b45"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 7 significant file(s) lose their only recent owner: providers/teamtailor.mjs, web/src/lib/status-alias.mjs, providers/larajobs.mjs, lib/outcome-types.mjs, lib/ascii-fold.mjs, lib/outcome-dir.mjs, web/src/lib/whats-new-suppression.mjs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cf029e808f8d690ff572cfb17d3fb3fa554374ab544cdefd6674923b00df5176"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 6 significant file(s) lose their only recent owner: web/src/lib/cli-fencing.mjs, web/src/lib/claude-invocation.mjs, web/src/lib/cli-fencing-probe.mjs, web/src/app/api/cv/ingest/route.ts, web/src/lib/worker-capabilities.mjs, web/src/app/api/apply/prefill/route.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c13a503f8a33f10c2522d96f94b6a13ffeecb6df81136783e1f83531141ddf31"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 5 significant file(s) lose their only recent owner: jd-capture.mjs, web/src/lib/apply/cv-match.mjs, web/src/lib/explore-error.mjs, web/src/lib/job-error-hint.mjs, web/src/lib/core/followup-view.mjs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce049b51369d83e58bfa3da9b8ef90fbca83f6dce6389a74777e38a1b987710b"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 22 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 (60 single-owned of 423 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; 423 of the 532 production source files in this repository met that bar). They are anonymized user #5 (2 file(s)), anonymized user #6 (2 file(s)), anonymized user #7 (2 file(s)), anonymized user #8 (2 file(s)), anonymized user #9 (2 file(s)), anonymized user #10 (2 file(s)) (\u002B16 more) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The opening paragraph (\u0027Months of sending CVs into silence.\u0027) gives a strong hook but does not state what the project is or what it does for readers who skim it. State the purpose (AI-powered job search pipeline) and the value proposition (zero-auth portal scanner, batch processing, TUI dashboard) in one sentence above the opening hook."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dbf18d06aa983c06246108610908ba99aae6784280b3aacd1a6655733d71be"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no licence statement: The root README claims MIT license but no licence statement appears in the visible portion. Add a Licence section citing the MIT license and the author."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc71d4465cafafc3df7a1b646a8cd5f9a306761b307dc199a6de8c1c35d8b21d"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D26","level":"note","message":{"text":"Split web: The web project is enormous (24k LoC) and sprawls over 69 namespaces, clearly a dumping ground. Suggested: "},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91deecbd166748a197025677cf11eb00f82988df1d6bbd4728aa0b00217d1791"}},{"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":"d5b8f11381d61a58459ffc7c595fd52d09c03c711894a63a9578043d2338412b"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6f7e2eafe5dc1e5facb17cb524536f1661f350eedd61f5bc35764d7fc45b0521"},"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":"ddc49ef52c93f5d89390c80bf8f0444bb97743496eeea781d1b7fcf904a3ea48"},"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":"565cb0a25235d1502010c8d34a025c6ae5aeb826c7d5e305b97bb45399050c67"},"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":"d112b6f258e061fd939d09a36e988dba2a88c73b3317b1ed425fd13ee4ef8856"},"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":"b9517cc4ae56162be6ef5c2593f4757b2854c319ee602e4c89f34f65769f92a5"},"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":"fdd80ff4efa055538dc59aafc5e380459b7d05030fbc7ee936f19fa678b3e896"},"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":"d6c016eaf9ca358ce72b638edb3f0dabd386e6ade35ea0f16ccdc6b78f59194d"},"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":"cbeec5ea8c84aac3e5fb0bda9b3ab7ccdde682813aaeedeb58b3c27564750366"},"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":"acfbae85faa68ebe4e02bc53d248bf5ca33b9a5ba2f954f9bcd5c40982461d71"},"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":"3da0ac29c51eb4c97825431fba929cb163f1b2ca71dc0bdcca574df447813966"},"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":"ed6cf53afcf282421b36b49abe497a6b87e148d1a97810d2870a115773e62e59"},"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":"32e2e07c4a8d7b25c7be8e11e8502ca9bafa86eae120b35ff310d4989b641b8f"},"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":"7d623ce18feabe498c289a6bd95a44aa79492ba63c5303aea83f316ceb2b3ada"},"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":"9c379e702c45b4d0acf2e50224c00242b644f6d649710cdf9134dc6c9e26b6bb"},"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":"9e8bca542949bd6b73ec7011af482bd12077b2f34b1ef366fcdadebc6e56a83d"},"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":"b0163d5af79743dc7843f7bdf2795e2c356d1b8c714e64eb544f3b48d7bb2b78"},"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":"c0519a1055d1f1d571dd76b2c4d33975af0bd44ee7dcba023c8a3e51fb5e121c"},"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":"2ad442bcbfb707cc4dda5ca69a009097602d162ee05cfa8d9cd6455321009790"},"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":"2f224e8bee1dae594c13a0033794fdd9355abb02ea63952ea60a2b5fdeec7f21"},"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":"c9e4637f8f9d88fcee0a34d35c62e66b091a314c9d75d3fe2e63eec04fe7a229"},"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":"fb24af9895446e30596d7e8ca2a7f46ffddd743a2d03ffb1c2406af4c9d7ed60"},"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":"acafacb63747b5d515ba430f0fec3bc155cc5a80f376f3989a2c11e7285156c5"},"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":"a14130a7a7a07ec67a36d880321f9c4ca28d7b4016af97432b75b1b83b0d9cc8"},"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":"996375866be20ba0e04568742d2c4f5016457eaeb869e7a05f533d0146725a9e"},"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":"693249723480b7d3690fbc9002e4acaa2fd5c4f5277d52948268b51530c89d1e"},"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":"538b4462a8f944e60a21502f361ca1938d39b9fa1fed0ca1792a30b02d41eef0"},"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":"e7a31241949e07d6fc6f460055a9c961119289560a0bd8354a9c9af18a5edd85"},"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":"7d51c1f014e07be271fea715c5afc1fb0ea108f0fcda9f037c833e5a316691e8"},"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":"299e8cdcf39a7964e3a14151109fc327010c385fb0b49dfea11badd82511539c"},"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":"fe10805262b24837ba752d0bdfcc07db57d82f471076c42afcaf7cf402c69dc9"},"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":"1509cef75e2f950fad121c624040187ba4832f472034915daf905134f819cd76"},"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":"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":"55a9feee9774121f2f799f78815f48406c361b20f27615a6b6c4aa576c312700"},"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":"c2c63503510bd646698a535a1cc8bfae212902ffac10e52d0fd5b7357b4d0a78"},"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":"5b679b4d7d976e97b3d1f8dccdff92c01d63131911827b8012dd9ec51b662a28"},"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":"3b86d01b31e1d7848adb2c82937a66e899ce18e5b34515d14ac815138dc3fb00"},"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":"929889218fe2adba5577454da6e2fffb54a21f38de62c057ea511bf22abbc080"},"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":"12457d83dafe7797f63429e65d46438243fefd6e566f0e7068ad839750f52a5c"},"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":"171d0053bd4af3abc51d2dac6e82ccae94fb79c6fd63bc05de96af12a8f61fe2"},"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":"6f0755402f96d549f9e95a0a053b7929c4f7de8d602e693a1b2eaf2122275745"},"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":"6333b23d951e0011c3c669b0813549f0a9cce09403cab57f05d536677b8c3fb8"},"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":"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":"66825c2fd69aa741853c2b2af929b6b6dc87e8f0614d4991b4bf515dd6199734"},"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":"5ebd72768699db5439c07e8b1351d6c4f0000e4ed4dc7f14081b571d2ac6c820"},"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":"578e8bd20844c89f4b0f2c3ad5738ee5747101b57e7b24ca29ca5d2fbcdc8ca9"},"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":"b998998a4e4385cb27a36ef4d0f85658b94a6bfc3549fb2975c42ed2011a5bac"},"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":"011f92ad641d06792f2d1ff9bf206a1051f571a9b89aa043023aed736efff4fe"},"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":"0b85fcb0d345a2db15e19a5dbf9abdeb83ac632ccb63a19b11d842679d2e2935"},"taxa":[{"id":"CWE-252","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-391","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":"062ba90c3527690573b77aa57dc950fc74d195b76b936cb425f3df27bb5a526d"},"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":"7a81d6d31cc991161f1b709a07cea10d295c10841c820adfbf47afbc1038c92f"},"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":"c8c93fdde3109acc7b02cc82c79fa8661c5b022c872df2a81dfda06b8f25ba41"},"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":"4870f2c7661742e8dde480ebb62e2fe595d6441cb076b3612af4841f0c780a8d"},"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":"9c4c4a4205d54641ef7c14e34de80a19ebb6c387aeb822d7bbbcc4b8597fb32e"},"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":"687e88d92cecaa8ecd8d5b8f4db90ade911c6c20e65d89e9d1a5fa582415356b"},"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":"e8dad57c97668ed44dfac0e450c04b733a3cdad8bb893621e40f393d0a6553b5"},"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":"3d22c843a9bd341f9af5275a171e23961cb91e9e781d5fc766eb73fc476f7473"},"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":"d6941383e1990ea57c7dd6827b70262b317819138015c7464bb96693a850a331"},"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":"ad71026a80fff784909a8a19fa441e3a390529c1b65f5ef782013d5e49725c0e"},"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":"094f8f23f0ccfedac16f2458d6f60187cc5caa682ae2cd8c556884c870fa78a0"},"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":"66baca5bf0fe14d0ca731277b3e2ca724fd18cba265eae551c43c61fc3fa1127"},"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":"c7f9dc7db6a62675c03397d15b8567d8bfa0f1ef3c08b2d90b9eade714f69f68"},"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":"80fd28ce663d73281be39ff07bf74d655216e310ac80c971282853f6fb97066a"},"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":"51922a3582c14d6272f08ccb056987e2600fb46b99c5f146fc566792db33cfe7"},"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":"5134ccbc1a2f913db5811b083de3e19a0c3109c4d73e3b2c010a1622b6cf7ea3"},"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":"d37e5d7405fb2abc7582f030f3122a972698a9025576cc00033b6c71b4250c5e"},"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":"d1bfd6bbab306b45f9d4b0fafd6ac3ef9a7b6878e1c316bf5d7435d2c5f93e3f"},"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":"3e8855649edcb263e72e0a32f277f61858d7e9f63e1fbba7427f5f8af9ec21d4"},"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":"1ed9abf0c177adea5d4279dc022d2ff80e78bef8e818561e98ef99c9e68412e9"},"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":"592de710cb236cd618f68269c555b4056c91b94ebf0462ee83058be251da5d8d"},"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":"4ec1523ae8be92b343b553f4edd84fcbaf79e93f0ddb79daeb5507f37b312f54"},"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":"a39c728035a934db606fad2783006128bcfef340477c99253175e9983fa1b1ca"},"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":"ed0701881cb776950d354b163d096abc025202906d80240a200e2ab19b943afb"},"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":"767f44c07a66f29b8f361e5e8b061140d813dbb41bccb0cff61675762e2b94ff"},"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":"98f63a47a7fef66761dc758e67d6b827e05085ea7a795a9c9a3b1061c0155c77"},"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":"c82d283bffe88e4dbf78cd00411829ef0762e4d131acec5fdc2a763bd34b9280"},"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":"180ea3decfe260ba2e48d4d9e67ac0b508b02392ad60ca933bb422597c524b67"},"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":"e0189b09fddc57f1df0ced58c6f3ed78efd2c476f30567e71d22871e996b0bcf"},"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":"0ca4c0b8e203cd15f82945f4bdf1fa5c64039e4d6f972fa3b3088f1771aa6a0f"},"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":"9d953eb59253ad4e93695a050051253434d20dc8e78199e991d9d482e44ebfe3"},"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":"fd3b96c4daba5f3c27cec0458824d7544dcff8221b92b6628046b5fa9d00c1d4"},"taxa":[{"id":"CWE-79","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":"68a928d7b22e2a79d9462b8c7402cfe600901f5bbc7205977bd6c55e097551ae"},"taxa":[{"id":"CWE-79","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":"42eb998e27dcbe4ce00d32ce5dd2bab7b0e8ecdb3845f999346f26704f23b1bb"},"taxa":[{"id":"CWE-79","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":"d334b9c427ed491cadf9aacb016b090badd3a7529c740e99a3477cc324520aa1"},"taxa":[{"id":"CWE-79","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":"69984c934c9d51e476b6941e4fce29654042f04adc14e35a7747710351632941"},"taxa":[{"id":"CWE-79","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":"a31cbab61871b0d7b51324ef2f9b6cc12b7c39d00b6c62d4504fd1b12abd1425"},"taxa":[{"id":"CWE-79","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":"3e62310b6dc0554d6442d3735ecb8766a85753bd54f5e2e35f25c32312076727"},"taxa":[{"id":"CWE-79","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":"126d5008d9bd6e7763a3dc66eef99f9015821ccd865972ecc3b645434318868c"},"taxa":[{"id":"CWE-79","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":"80e8d37a5a7c50a988ee99eb9b4355c329ca764b7d8dbb700f0184328e06c55e"},"taxa":[{"id":"CWE-79","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":"25352354485cf30b2657ec37597d702a5ccf2192eea3a3900c213a9b3ce0976a"},"taxa":[{"id":"CWE-79","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":"a48c7e74ff8ac040028e8d11a478e872beaf1194f6085fa21a8cbe2491402fb7"},"taxa":[{"id":"CWE-79","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":"d2dd53e1fde34fe3be147890676f278f69880f86d8378fafc8115020b6809c73"},"taxa":[{"id":"CWE-79","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":"1ced57f522bd815da3ed815937d7bf0c3977b5018ca9d07f071679d17ac20327"},"taxa":[{"id":"CWE-79","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":"d033cfbbcd1f85f50e8f0df5b5d7c18883f229d4c12ccabddedfbe28027eef3c"},"taxa":[{"id":"CWE-79","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":"177ae788c6991cb98898c784c5c958246d70bc6102254d4ac1cc6d3ac6325a76"},"taxa":[{"id":"CWE-79","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":"68936adb747272c92d668c1b484b9818f93d6941eb2f156b8707dd7ae461d021"},"taxa":[{"id":"CWE-79","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":"77fcb414c621cccb171df6b45070b06283fc03ddcd2332956e17a3682d98a05b"},"taxa":[{"id":"CWE-79","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":"a7698600e6df3eb9e8a4e7c156754919cd4094e8a1a825760fcb29fe26b3b9a9"},"taxa":[{"id":"CWE-79","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":"fc1bab07be01d80770e8a156215252d172da853220d3bd499465bb8f1bbcb7ce"},"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":"ae9dab5388a0d35137091f512e3347f34f629817b12c5a1127927019c8d8d7da"},"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":"1cac177b1efb74b27947570695c413471e653e67c754da111daeb4efddb83e3f"},"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":"22fc0b1bda1abf68d07a2606b2b955962632f5dadf4e6e9ead33cf1d69885a55"},"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":"6a0821d159b8b635fa07281586c6e78034e17b1bd8578b334c47ee0a1a9a88b0"},"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":"67a77af1493e7b6d311bab336b959e552f2a4254fea1a1b9f6c7e05d8b607e93"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7acab3385f7747f06799c7253bce6a07f8e62f0fe102bbfa01497e8e8f7f2eac"},"properties":{"dependency":{"package":"next","version":"16.3.4","advisory":"[GHSA redacted]","reachability":{"kind":"production","file":"web/next.config.mjs","line":1}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2544e985bc6464c868673c34efa0b264c67e51be92b7c8a8a23e14fa937e2543"},"properties":{"dependency":{"package":"sharp","version":"0.35.3","advisory":"[GHSA redacted]","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ac615ddfdcff85a62f922cb40cfd322a68f9ef4ecfcbbe0d5777e0e1e9e46619"},"properties":{"dependency":{"package":"stdlib","version":"1.26.0","advisory":"GO-2026-4599","aliases":["BIT-golang-2026-25679","BIT-golang-2026-27137","BIT-golang-2026-27138","BIT-golang-2026-27139","BIT-golang-2026-27142","BIT-golang-2026-27145","BIT-golang-2026-32280","BIT-golang-2026-32281","BIT-golang-2026-32282","BIT-golang-2026-32283","BIT-golang-2026-32288","BIT-golang-2026-32289","BIT-golang-2026-33810","BIT-golang-2026-33811","BIT-golang-2026-33814","BIT-golang-2026-33818","BIT-golang-2026-39820","BIT-golang-2026-39822","BIT-golang-2026-39823","BIT-golang-2026-39825","BIT-golang-2026-39826","BIT-golang-2026-39836","BIT-golang-2026-42499","BIT-golang-2026-42504","BIT-golang-2026-42505","BIT-golang-2026-42507","BIT-golang-2026-46600","BIT-golang-2026-56853","BIT-golang-2026-56858","BIT-golang-2026-56859","BIT-golang-2026-56860","BIT-golang-2026-56862","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","GO-2026-4600","GO-2026-4601","GO-2026-4602","GO-2026-4603","GO-2026-4864","GO-2026-4865","GO-2026-4866","GO-2026-4869","GO-2026-4870","GO-2026-4918","GO-2026-4946","GO-2026-4947","GO-2026-4970","GO-2026-4971","GO-2026-4976","GO-2026-4977","GO-2026-4980","GO-2026-4981","GO-2026-4982","GO-2026-4986","GO-2026-5026","GO-2026-5037","GO-2026-5038","GO-2026-5039","GO-2026-5856","GO-2026-5942","GO-2026-5972","GO-2026-6088","GO-2026-6089","GO-2026-6090","GO-2026-6091","GO-2026-6218"],"reachability":{"kind":"production","file":"dashboard/internal/data/career.go","line":6}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9d8cb712ce25d83b507ae17e5ed39a7603c11c3b6cfa75419cf9f76c1028a241"},"properties":{"dependency":{"package":"golang.org/x/text","version":"0.3.8","advisory":"GO-2026-5970","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"55527a0e11714ea007f56860c1c4ac905e3661a61b3a3efb849af04978c76b87"},"properties":{"dependency":{"package":"baseline-browser-mapping","version":"2.10.38","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"228c8b334ed5541920917fe5b6007f69036c0948fcc24da846c7fac5bc1687b6"},"properties":{"dependency":{"package":"js-yaml","version":"5.3.0","advisory":"[GHSA redacted]","reachability":{"kind":"production","file":"web/src/app/api/followups/cadence/route.ts","line":4}}}},{"ruleId":"D31","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fe2d688610b51e0a5a02c7c5dd1724a4986e40f2689fb84510e2ec0164c27d6a"}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5cfed0ee4e80785ce23c7083cffdead9acc6c64f9dce56a00ca7178bd3d7bee5"},"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":"D35","level":"warning","message":{"text":"Change coupling: _types.js \u2194 scan.mjs: \u0060providers/_types.js\u0060 and \u0060scan.mjs\u0060 change together 57% of the time (8 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00605c26e4af\u0060 fix(scan-ats-full): collapse a Workday requisition served under sever\u2026; \u0060ba836064\u0060 feat(portals): probe non-ATS boards through the provider layer (#1529); \u0060ef07461a\u0060 feat(scan): add early trust validation and job trust metadata (#985) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_types.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"130781f72b34aadffea8868fa7fb0ffc66059904ae05d29b3b85d24fd2223512"}},{"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":"c5928b81075799790cb18fed2980a6b6e8aa5072772041c9951633efe8eb3542"}},{"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":"4f1e7684f8281bd255ddef97105c7055c2ebae06964c8745716b83e174debe83"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb10f7f835bc2a77284fc627e3aa5abfa7471af67afc44b12f745c4c7e83060d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e0cec13d4e96579e7a4395d862d8abcfe8f03bff4c57a965125bb28c83695f"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b290314446cb25f9c076a94831a5dae5096cc86c5af984021aeff26d7b2e93"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"6046d6111101cf29e67ce41c8f3ead682b94b5cb61e0c633c8a9387372c2079d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/assistant-console.tsx"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf73aebb64848baea158acab0bdf6de5c732b2429f393801263b610923a497c"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/beta/beta-banner.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2fa841c62a1b7c7c490986e4b38c3302e7a477b2701c826e13b68130a2c96a6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"5963df22eb9dd1c59b46037dcff6fdf3161f8c64e5cab9d4a2ca8e992910b457"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ef011b2e76d1d028d7bb2d643033be3cdd17659d4aa411aaca581c1d46b4a0"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07f6d410258cdf926e1a9c53efe7b1a4ab6e159be8e239266b93fa345205f03"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"6893c6e9a83168946519ff5b85ec466d3532c8c0b3c4fb8172f0bc7dbc694963"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/config-form.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"18911fe05cb24491dcaca92de85d89acd3d7dddc6d89ce667628577359559071"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv-editor.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"95d448d23ea8b05eb90dd5d801737427ff7cca6826d51e432596eb497d9dc1b1"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"e368c52e9d11352834b2aa8ce36349a5fd7f1b72aa550dad9a9f4a1625bbce96"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"4433193be7b2a9bca08e9cd42b59e1f71cdf17ef86d6bdf2eeec719ba276d77b"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/ai-search-box.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"560f67529d0e6d7a4c0381c6f0eacec5da63c7e1230b0995c39046bf81773ee6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/filter-builder.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dcd800fd05b03923682f17834b94a28be12e9479cd87522d1f76b674cfc27ae"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/results-list.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e464a2225eef95e49e77ba2dff9ecf7523720c8ba1a77e8a8d755a8a7a4cfe6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/cadence-settings.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"008f3f3b0697bf284dd8230ec253bf7f7f12de45cbbb3d5a39c57b897df56dc4"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c26afb6d00a557232a0ddc2f6b86657a58743a88fce1961257546534480db26"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/inbox/facet-chips.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"91f3b5069af7ecd63bba5184bb9a12a8425a7907defb3152c45dc39283619c9a"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/inbox/facet-chips.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d9636f0b3cbca58925bc3e3dfe715b0fc39d03004175657c8eeb46b2e15597"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/pipeline-view.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"f508047c697518831f7f9f83f8201aba072722b2abde45c0a8ace2a9fe597cf0"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/quick-evaluate.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"973594f707114fbf90a759d9ac28a821a8e038be14f9ce573790c384cc9214fd"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/status-select.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4a98f5fb124c64f1aede5c9b7d9c67e2ed3201b9c4d28bbb82723a569c1b40e"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/status-select.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc4373f5fa259825bcb0b678416e3ebaacc50ad9e3ed8d210c83b9f9ba9298fd"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/ats/cv-template.ats.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"85853621cfbdcebe54703d0288d0e82fa047bf2608d5fd9871e996ca1e2a1a4b"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cover-letter-template.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd592f395f19be4008768bdb3dceecdb45c8de70be53c8c8cc75a0b18eaf127c"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.compact.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"80e2b6d37603afbd58ff3fccee38746f941f16ad1ba811e10d36b083758d6eac"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.executive.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bba2e40a0cffcf026b965e8d7e59ec49136a7272c55a415eb6a0b8be9ff609"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"70517ecacceddae24001ba433e56224161f1af5bed73cd7943ac69565f1429c0"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.jake.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"27b00c1744fa3aa66c526872164de641bd1812f37d4bcd930d78741194e0ee16"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.leadership.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c4cd4a3eca5b2cf105958a7341657241f33f200ac580a02a329767931c8c0f"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.modern.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2a21740040c84ba29b16382423fee6650fdca74796225262033f9463b8b089"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/cv-template.zh-minimal.html"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d027ea708b5e52c01ef70b0effb346f4dafb94b4a5447ae54c91202daa00602"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"templates/resume-template.html"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"4198e43ef56a6ad730e6ee78c84f8daf9ab0ac42196d9031196151b8d6c5553e"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/mobile-nav.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d945cb3ab5f0afb736f4daa1feea8281acd2b1ecd862e103dd7a9f4a71590b1"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 no a11y linter (eslint-plugin-jsx-a11y) and no axe/pa11y/Lighthouse in tests or CI. Start with the linter to catch issues at author time. What was searched, so you can tell an absence from a miss: the 97 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository\u0027s test and CI files \u2014 matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d46019b86eff5ddad9db289e6802ac158899e980df54c34f67722442787ead62"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"P2","level":"warning","message":{"text":"No structured logging: No logging call was found in the 533 JavaScript/TypeScript, Go production file(s) this check read across 4 module(s). Each was searched for its ecosystem\u0027s logging libraries (Go: log, log/slog, zap, zerolog, logrus, klog, hclog, logr; JavaScript/TypeScript: pino, winston, bunyan, log4js, loglevel, consola, the NestJS Logger) and for a call on a receiver named \u0060log\u0060/\u0060logger\u0060 (or ending in \u0060Logger\u0060/\u0060_logger\u0060) with a level verb. It cannot see logging through a repo-local wrapper named otherwise, or in source it did not read \u2014 this is \u0027no logging found by this walk\u0027, not a verdict that nothing here logs. If it is right, production issues will be hard to diagnose."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9f10d71351c6778ebe84e761f82a90d4f9ed6c64f5e01975ede8fda7e4e2ebc5"}},{"ruleId":"P4","level":"note","message":{"text":"No rollback/health safety: Deployment is orchestrated by compose, but no service declares a \u0060healthcheck:\u0060 and nothing pins a previous image to fall back to \u2014 the runtime can tell that the container is up, not that it is serving, so a bad release is harder to detect and reverse."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db6bab8a28a2145f47e5a4e6683cda39d2ba0296c723238e8057da979ae1c706"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls readFileSync, existsSync, 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":"add-entry.mjs"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"648cf279c91f973c035373db62704c0c88da822c7d2feceaabbd62dd3397ed59"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060acquirePipelineLock\u0060 is async and calls existsSync, mkdirSync, writeFileSync, statSync, 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":"pipeline-lock.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d0f0bedefd5c17b6e267f724b8607ccded84a4c084faa3148383b1c9e450c4e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060add\u0060 is async and calls appendFileSync \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":"agent-inbox.mjs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90ae471d06728b5f77ca9cbef85da5c79fa1d94ec3b4575da9978f3f96baaff"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060resolve\u0060 is async and calls readFileSync, 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":"agent-inbox.mjs"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"64261f278f4aeafa6c6611c1d155ee460c57489c9efd99ac8d5e88521f398ed5"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls readFileSync, 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":"application-answers.mjs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee836243d884de5ead3b6236e2180a1bccef0cef95e564aa72b90c23781f7a6d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060extractPipelineEntries\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":"archive-posting.mjs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"b711f6389571bd08acafa6a4889c01d8e3718ce4c9ddfb7232a594336c202e51"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060archiveUrl\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":"archive-posting.mjs"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"c078633c521498a823d46e90f0ef2b8d21cbc1b3419045854f7ee0c9896cdd64"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060loadProviders\u0060 is async and calls existsSync, 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":"providers/_registry.mjs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"163e14410c67f4ce1997f49258e6b9367ccc7b3c4acd9e3cc266493b8ace6936"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls readFileSync, 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":"audit-portals.mjs"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"35565a35c0bec3a3ae73c69669bdb020044b966e817b454c1fa990304531475e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060processOffer\u0060 is async and calls 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":"batch-evaluate-gemini.mjs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ef70def5d6185f27c4761b35fae74b8aec84540a529e643454ad7fac36ff2e1"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync, writeFileSync, 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":"batch-evaluate-gemini.mjs"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"9de9b63eb41bccc9084a5e836bf9a4989fd62e9ab80730dfd3d928d55d951f2b"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060writeAndReport\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":"build-cv-html.mjs"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ddc2443236e3c818223ab7fe59f03cf66badf6a19961d9dac3234f51ac34865"}},{"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":"build-cv-html.mjs"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"64206a4a5fe38edfc530e882e83ee755c68f17d0acb116c6be213fad8c0198e5"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060runSelfTest\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":"build-cv-html.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b26d214b92b024e4c2a3c791a25458af267f79162dee94a72ef05e142b0006f"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\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":"build-cv-latex.mjs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"818cd0ba78ef71b0a312ac7075a6bafb222dc5ce1bbd261e40117d89d428a2a7"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060runSelfTest\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":"build-cv-latex.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f931beb1d6a5b3be9eaa14ac302ceade1f828cd4595c021664454b9e6e94cca"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060acquireTrackerLock\u0060 is async and calls mkdirSync, writeFileSync, rmSync, statSync, 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":"tracker-utils.mjs"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da139c81d9badf8ed73a616c9aac5ef14b8f12e31ef9afa96e96463367b541e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060openTrackerTransaction\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":"tracker-utils.mjs"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6d897bb87474fce782f2c00a9f561aaa7284c8cb0d423b33b581f6f06d8b40b"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060doImport\u0060 is async and calls existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, 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":"career-profile.mjs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"710a9d6269a6e0706fe29df42cd576b16ec26929a02bedc08c6c395556992810"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060runSelfTest\u0060 is async and calls mkdtempSync, writeFileSync, 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":"company-history.mjs"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc99806aa6d8827bab2097094d40567caf220c4391b5d18c93066fa26fb8af4"}},{"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":"paste-reply.mjs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a8ddddb44ec401980ebcfb6ce1279f1df8598eb8dba36ab7f733cf9a869f7e"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendContact\u0060 is async and calls existsSync, readFileSync, 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":"contact-extract.mjs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"01819ee4968601fd621e4b73d274a75091092ee1bd79732ae9f36201250ca001"}},{"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":"contact-extract.mjs"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee6a73cc3a36de2abb0f9fa22170760b5d6ee78aeb2ec431cf888ad3bdd4970d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync, 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":"discover-ats.mjs"},"region":{"startLine":1060}}}],"partialFingerprints":{"codehealthFindingId/v1":"638711ad11721a223d1b6596f9cff861729740f40f0f1045f012764809f559fa"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060loadPluginConfig\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":"plugins/_engine.mjs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"4befed7237edd3f2277e68987dfd3773b8738f32551ca5202c4f13cdac0e980d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060mergeProviderPlugins\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":"plugins/_engine.mjs"},"region":{"startLine":705}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f666eb8a391e5ecc9bf1b7cb9b29e095bfbba5369566fcd52bb1acfd2f31fbb"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060verifyPortalsFile\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":"verify-portals.mjs"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cdf97b925a022abd44055318c83b9863a38d6d668d196956ad994d92b29600a"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060acquirePortalHealthLock\u0060 is async and calls mkdirSync, writeFileSync, 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":"portal-health-lock.mjs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"c62a061d5ad50f5fcd9459f6c5901f70039447ee29810bc74dec94928e5f946c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendToPipeline\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":"scan.mjs"},"region":{"startLine":2704}}}],"partialFingerprints":{"codehealthFindingId/v1":"e609d96f32a0b2c87031d5da1f23c53ed13132a0af11708cb3a594ab48d291e5"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendToScanHistory\u0060 is async and calls existsSync, mkdirSync, appendFileSync \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":"scan.mjs"},"region":{"startLine":2748}}}],"partialFingerprints":{"codehealthFindingId/v1":"d87ce10bba62ccb644c20df3f4ba35a8ddb34e819907b9c5a7d1ffeae690b54d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060appendPortalHealth\u0060 is async and calls mkdirSync, existsSync, appendFileSync \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":"scan.mjs"},"region":{"startLine":3042}}}],"partialFingerprints":{"codehealthFindingId/v1":"03332d94fcaedf794c7613e76e6e0ac6f74b6bf903cfca90c655356ed8e030ef"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync, 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":"scan.mjs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"1564fba66e336968f27d6f073914e87288a213078859e993762949536afbd07f"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060checkPortalSlugs\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":"doctor.mjs"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb962891fe2acf532d6a951583da63a6bc954d60f8bcd894e88a131a40182dd7"}},{"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":"extract-latex-content.mjs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb84c2fe355a03ea2d3d14a2a6a5a76defca5cf922fce7110657c596e4735424"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060main\u0060 is async and calls existsSync, readFileSync, 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":"fix-slugs.mjs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"feeb183fc7abd0f5bd7eaa0f68d2cd70d14b26a9b98b6015ccde9d5a36b41bc6"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060acquireFollowupsLock\u0060 is async and calls mkdirSync, writeFileSync, 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":"followup-seed.mjs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a36b8f3d149f9f67dc81bf61f19d4017676c2ea7f367f68014da34488e0e19a"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060seedFollowup\u0060 is async and calls existsSync, readFileSync, 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":"followup-seed.mjs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c51835ed8754f72602486984369fe101a146f125181c0c7546278ca241a59bf"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060seedBackfill\u0060 is async and calls existsSync, readFileSync, 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":"followup-seed.mjs"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"be17125bf6f240485d1027a955e7c0f11498c58cbb6438d537350005d4554ff1"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060reserveReportNumbers\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":"reserve-report-num.mjs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e31776db8da52fd70fe34bfd296b3035235541be89041303d7ef570ec8f6d3c"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060releaseReportNumbers\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":"reserve-report-num.mjs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"33fcfb4d6870732a95c95e26a7550ef5f801d851ec771c0bf14f8f9ad3ebbfe9"}},{"ruleId":"R1","level":"warning","message":{"text":"Type Safety: 151 typed \u00B7 911 plain JS \u2014 the untyped files are add-entry.mjs, agent-inbox-tests.mjs, analyze-patterns.mjs, application-answers.mjs, application-artifacts.mjs, archive-posting.mjs (\u002B905 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d00ee7953f55325a823d27e5db9657c80ca9b9861c0c0abf8fe487cd3fa586d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 15 sibling directories (16 clone groups): 16 duplicated blocks under web/src/app/api/ have copies in at least two of the sibling directories apply, assistant, cover-pdf, cv, cv-pdf, doctor (\u002B9 more sibling(s) not listed) \u2014 14 of them are reported below, and 2 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 16 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 16 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 16 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/assistant/route.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf273adeb1c7b51d3fbc2f4f25922d26ce668746ecc6fe877f37a0f4131c162"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 8 sibling directories (7 clone groups): 7 duplicated blocks under web/src/components/ have copies in at least two of the sibling directories apply, beta, cv, explore, followups, home (\u002B2 more sibling(s) not listed) \u2014 3 of them are reported below, and 4 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 7 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 7 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 7 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply/apply-provider.tsx"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6e19a44f1411e23386d23b85c61eea57e91eaa3ddcadd15839625512f54d07c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (6 clone groups): 6 duplicated blocks under web/src/ have copies in at least two of the sibling directories app, components, lib \u2014 4 of them are reported below, and 2 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 6 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 6 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 6 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/tracker/delete/route.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ea5fee464bd91e114df7f7a1d888df3478119654a2cb20dbdc0b7ea499f1aa5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 7 sibling directories (5 clone groups): 5 duplicated blocks under the repository root have copies in at least two of the sibling directories batch, lib, plugins, providers, seeds, utils (\u002B1 more sibling(s) not listed) \u2014 4 of them are reported below, and 1 is counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 5 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 5 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 5 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/ascii-fold.mjs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"411013b69337d58b0665969c32fa5e1a2cfcf916966f36dd62a5d598c84f1ec6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (237 matched lines \u00D7 2 locations): ollama-eval.mjs:41 \u00B7 openai-eval.mjs:47 \u2014 the two spans are one implementation copied and then locally edited \u2014 1732 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":"ollama-eval.mjs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d23489db8354779d6b43bd006f54cbcdda30aa15637aee4c8e11a8bdd25e1b2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (80 matched lines \u00D7 2 locations): providers/justjoin.mjs:8 \u00B7 providers/nofluffjobs.mjs:8 \u2014 the two spans are one implementation copied and then locally edited \u2014 589 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":"providers/justjoin.mjs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a779ea576e8e57ab62d5971f88580bd97a550cdaf82395793926813e7eca9b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (76 lines \u00D7 2 locations): providers/nodesk.mjs:12 \u00B7 providers/weworkremotely.mjs:12 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/nodesk.mjs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27d326d6115721f27b33ada0a3e1bdc3f04ce087a9999a23718dba8516fecf4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (75 matched lines \u00D7 2 locations): openai-eval.mjs:178 \u00B7 openai-tailor.mjs:129 \u2014 the two spans are one implementation copied and then locally edited \u2014 475 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":"openai-eval.mjs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"7319d9e31b14f3c4486c60e521365962cc94340148a27bb019cbf9cde16cdc66"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (68 matched lines \u00D7 2 locations): providers/alibaba.mjs:69 \u00B7 providers/tencent.mjs:43 \u2014 the two spans are one implementation copied and then locally edited \u2014 508 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":"providers/alibaba.mjs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdb5c74f6445d038129fe034796cecd7fb1502c0d8dc7e73f79130f282e9c973"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (66 matched lines \u00D7 2 locations): web/src/app/api/assistant/route.ts:93 \u00B7 web/src/app/api/cv/ingest/route.ts:109 \u2014 the two spans are one implementation copied and then locally edited \u2014 410 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":"web/src/app/api/assistant/route.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"332580216f353974ea447bcd2ca936e01cb786ea1efb56b793d58def3581d811"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (62 matched lines \u00D7 2 locations): providers/careerviet.mjs:49 \u00B7 providers/itviec.mjs:37 \u2014 the two spans are one implementation copied and then locally edited \u2014 427 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":"providers/careerviet.mjs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b75d57d868c476a0c183b9de4eb973bddfeac5b4a51fcf7ab0dfd1a6d81304a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (59 matched lines \u00D7 2 locations): web/src/components/followups/log-dialog.tsx:25 \u00B7 web/src/components/followups/next-date-dialog.tsx:31 \u2014 the two spans are one implementation copied and then locally edited \u2014 364 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/log-dialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6a9962ac76110ee7e0f2ab969bee3fbf625c5d4991e72d9f6c31273b6112594"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (54 matched lines \u00D7 2 locations): providers/feishu-jobs.mjs:86 \u00B7 providers/mokahr.mjs:173 \u2014 the two spans are one implementation copied and then locally edited \u2014 345 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":"providers/feishu-jobs.mjs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe51d3fcc7583b25f5ef9ff94088f38109be905d4b9733339722e41a43ae1868"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (48 matched lines \u00D7 2 locations): build-cv-html.mjs:1185 \u00B7 build-cv-latex.mjs:385 \u2014 the two spans are one implementation copied and then locally edited \u2014 414 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":"build-cv-html.mjs"},"region":{"startLine":1185}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d90a222ffde61d936a538b167bd4892f26ac6c8f647977e3b1d929ad49d826d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (46 lines \u00D7 3 locations): providers/careerviet.mjs:263 \u00B7 providers/itviec.mjs:227 \u00B7 providers/senjob.mjs:155 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/careerviet.mjs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b968de5e6e0d86c1d467a2d3a572a792e49e771cf4010b23602df5c45ef3f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (46 lines \u00D7 2 locations): providers/pinpoint.mjs:22 \u00B7 providers/recruitee.mjs:12 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/pinpoint.mjs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"523677be1d344391b1458e2ca2bac9712c0ad3f095b8fcb40ea7165936eb1096"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (45 lines \u00D7 3 locations): providers/larajobs.mjs:16 \u00B7 providers/nodesk.mjs:12 \u00B7 providers/weworkremotely.mjs:12 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/larajobs.mjs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe19e571ea80d7e9f102191e97094b5304c7cde9ebab6fd766e1552f4f50f905"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 2 locations): analyze-patterns.mjs:777 \u00B7 upskill.mjs:672 \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":"analyze-patterns.mjs"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6479a8b30af678d39c1c4aa975e5b5c5974f18bb2a0114a02e733ccf11bb328"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (44 matched lines \u00D7 2 locations): providers/neogov.mjs:29 \u00B7 providers/schoolspring.mjs:20 \u2014 the two spans are one implementation copied and then locally edited \u2014 295 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":"providers/neogov.mjs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7909f2923bb8c45792a1333c7e943d6cbf7e2c17b2197d038f8f3524ba26aea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (43 matched lines \u00D7 2 locations): providers/hecklerkoch.mjs:24 \u00B7 providers/softgarden.mjs:27 \u2014 the two spans are one implementation copied and then locally edited \u2014 315 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":"providers/hecklerkoch.mjs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba573ba891fade4db8f39e282f94ac00d78afacfc5392cccfb00a7a0bb4dfbd7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): providers/csod.mjs:38 \u00B7 providers/phenom.mjs:53 \u2014 the two spans are one implementation copied and then locally edited \u2014 275 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":"providers/csod.mjs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"28b3b844535785f73238d1379a167d7f666ab8eaf85bbcfa9bff7cd064ecc094"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2 locations): providers/bamboohr.mjs:55 \u00B7 providers/breezy.mjs:16 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/bamboohr.mjs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"374f321b6c85f1304ff13b2392e3e75f6090d8bec3e366b19aee2bf96fd86e1c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): build-cv-latex.mjs:214 \u00B7 build-cv-latex.mjs:500 \u2014 the two spans are one implementation copied and then locally edited \u2014 339 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":"build-cv-latex.mjs"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"0247731c982f2935b54066e9770018329ba508dafc2f5033ae1ef6a8ca1ea126"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (38 matched lines \u00D7 2 locations): providers/radancy.mjs:251 \u00B7 providers/rheinmetall.mjs:56 \u2014 the two spans are one implementation copied and then locally edited \u2014 253 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":"providers/radancy.mjs"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"093674a23cd76b04e5518e4f1f4c624f1b2b95c99855d2dec2e996ce2505ba17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (36 matched lines \u00D7 2 locations): providers/phenom.mjs:92 \u00B7 providers/tkms.mjs:55 \u2014 the two spans are one implementation copied and then locally edited \u2014 316 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":"providers/phenom.mjs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"986f2b0d84f028aeb7351801e780012dbbc438fc79a81c0add39b6fd5a298540"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 3 locations): providers/jobspresso.mjs:37 \u00B7 providers/nodesk.mjs:38 \u00B7 providers/weworkremotely.mjs:38 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobspresso.mjs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"5daed86b0f278c7ca148258f6700a7a70e016d4ddc28567c5cffa6d63631438c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): test-all.mjs:14653 \u00B7 test-all.mjs:14710 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test-all.mjs"},"region":{"startLine":14653}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e8e9fc4c6547f65ce636423d377c2d7175759803910758e24b866f6276e6b59"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): url-key.mjs:42 \u00B7 web/src/lib/core/url-key.mjs:33 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"url-key.mjs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"30ee828f822411dd96ff12c22b8f8af18d8fe660d564a374561c07bd5e98bc15"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (32 matched lines \u00D7 2 locations): providers/breezy.mjs:52 \u00B7 providers/prevueaps.mjs:143 \u2014 the two spans are one implementation copied and then locally edited \u2014 216 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":"providers/breezy.mjs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7e579213a0e88e1dfbf511c31e81d859dd23bc5f43656b0fad5e5f92c3a713"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): providers/higheredjobs.mjs:42 \u00B7 providers/weworkremotely.mjs:50 \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":"providers/higheredjobs.mjs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"dafe456193030ffb674bdf817ebb861ac032477468cebbcf977bfe3c9485c579"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2 locations): web/src/components/app-shell.tsx:36 \u00B7 web/src/components/mobile-nav.tsx:149 \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":"web/src/components/app-shell.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cc0ef00e6b028680ec2be70ba3ca3f9dba38b1cf15c074dc216b4c426e7b28c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): scan-dayforce.mjs:592 \u00B7 scan-interamt.mjs:366 \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":"scan-dayforce.mjs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb072e625a378c65eac21def401236ee9d9ceac6116039024e9b89459152a6b0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): providers/mycareersfuture.mjs:186 \u00B7 providers/vdab.mjs:263 \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":"providers/mycareersfuture.mjs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01d85017ae24b100b5f02e06ee2b116437b5a701a01b9175a25dc470f3a0ab3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): lib/ascii-fold.mjs:54 \u00B7 web/src/lib/core/ascii-fold.mjs:49 \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":"lib/ascii-fold.mjs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8bec6ee84db42f8df427937af0ad44fe6682b35c4b3fe1920e202a4525c28d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): openrouter-runner.mjs:240 \u00B7 openrouter-runner.mjs:299 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"29446dcb206ed6c7d1160010e29010c37392f9c6b65295118baa914f01141c9d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): pipeline-lock.mjs:654 \u00B7 portal-health-lock.mjs:222 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pipeline-lock.mjs"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebfcba39e78002b4e0416c6c04bd124543d3c5da0b96bdc5e9224ae82d0646d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): providers/meituan.mjs:98 \u00B7 providers/tencent.mjs:76 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/meituan.mjs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b04870bf1870deae267b90b08ffcd177be4c6b9aa713e5f07946c636a37aa59"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): build-cv-html.mjs:1118 \u00B7 build-cv-latex.mjs:337 \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":"build-cv-html.mjs"},"region":{"startLine":1118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed72f98402de5537130ddc3fc33439473166b953799557fb034c95d3db31ba9c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): providers/deutschebahn.mjs:91 \u00B7 providers/tkms.mjs:136 \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":"providers/deutschebahn.mjs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d9391c68830d05710a056ec980646759e09cd1d3a0f0a0665b93e17b67ea353"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): web/src/components/followups/followups-view.tsx:107 \u00B7 web/src/components/pipeline-view.tsx:55 \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":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"8332911f2af9653b71ea72a7c7572443adf18f078a4bbeaee77e9f0b8429b1dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-suite-dependency]: set-status-tests.mjs:36 imports tests/helpers.mjs, a module inside the test suite \u2014 test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"set-status-tests.mjs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"95b828e54dc007b321cf9aba86ffefe49f8ab95d183e5cfc7d04a07e443b8d4e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-suite-dependency]: test-all.mjs:58 imports tests/helpers.mjs, a module inside the test suite \u2014 test helpers carry no compatibility contract and are maintained for the suite, not as an API, so production code that depends on one is coupled to a module nobody keeps stable. Move the shared helper into a source directory both layers may depend on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test-all.mjs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a8fa7ad6fb76a591335ed5ecee85e2710922fcb1e1233ee1f80426059038c0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: tracker-columns-tests.mjs:355 reaches into another package with a relative path (./web/src/lib/tracker-table.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-columns-tests.mjs"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"33aef7e745ef43706d62c0b4976048d72b9bf2e2c504375979d59ce71e6c7b92"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: tracker-columns-tests.mjs:446 reaches into another package with a relative path (./web/src/lib/tracker-table.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-columns-tests.mjs"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d8643feff2d23e3929b345f73369527d42d031b36193c158c2f340337dc2749"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: tracker-columns-tests.mjs:682 reaches into another package with a relative path (./web/src/lib/tracker-table.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-columns-tests.mjs"},"region":{"startLine":682}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f20e84b1b4742279a81eef94a4ac826b431767de437e6d1830970fb9617662c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: tracker-columns-tests.mjs:763 reaches into another package with a relative path (./web/src/lib/tracker-table.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-columns-tests.mjs"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc75e96e150d119ddf888f875042f2f36624572cee8ad1a4fa554e6bae283d04"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: tracker-columns-tests.mjs:1163 reaches into another package with a relative path (./web/src/lib/run-prompts.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-columns-tests.mjs"},"region":{"startLine":1163}}}],"partialFingerprints":{"codehealthFindingId/v1":"09235b8a428dd50cac8e82aba055736012a7ee993aadbe99cb141f2ec0b75274"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: update-system.mjs:3020 reaches into another package with a relative path (./scaffolder/bin/skill-entrypoints.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3020}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44b5ddf6c81a78bd573d9c69f62efccf6f3c0de0c38988f4dcdc2c2f408fc13"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:relative-cross-package]: update-system.mjs:3691 reaches into another package with a relative path (./scaffolder/bin/skill-entrypoints.mjs) \u2014 import the package by name instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":3691}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bb9fb4f7b04b254691e59d825179d304f5c5b253b5933550ab38fa9d266fd1b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 134, cognitive 176): main has cyclomatic complexity 134 and cognitive complexity 176; 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":"scan.mjs"},"region":{"startLine":3268}}}],"partialFingerprints":{"codehealthFindingId/v1":"12294c62414a51f572b59e3a85f112acab92a532463bbd84142624f69a1b8561"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function runSelfTest (cyclomatic 111, cognitive 135): runSelfTest has cyclomatic complexity 111 and cognitive complexity 135; 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":"analyze-patterns.mjs"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed053634ffd1ef990ccd65644d984cb6756dead4d7a98c6f224f4f8bd19b585d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 90, cognitive 132): main has cyclomatic complexity 90 and cognitive complexity 132; 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":"scan-ats-full.mjs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a147f84a3b13723dd90b520aea469481030b9f676e2710f50d32348f91b863"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function runSelfTest (cyclomatic 80, cognitive 86): runSelfTest has cyclomatic complexity 80 and cognitive complexity 86; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c227c66f888ebee1739b3fdecd312c10dd10582225705852761b3d327d45b7"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function apply (cyclomatic 78, cognitive 127): apply has cyclomatic complexity 78 and cognitive complexity 127; 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":"update-system.mjs"},"region":{"startLine":3276}}}],"partialFingerprints":{"codehealthFindingId/v1":"623a34a4e84609ee0d540907003c6b8ea65e8f2cd71d74610ed2d553ac9bbb7f"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function runSelfTest (cyclomatic 61, cognitive 76): runSelfTest has cyclomatic complexity 61 and cognitive complexity 76; 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":"upskill.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ac977402a855dae7c055252c9927f1668c76cd0f861880922d30910f6382a48"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseReport (cyclomatic 50, cognitive 58): parseReport has cyclomatic complexity 50 and cognitive complexity 58; 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":"analyze-patterns.mjs"},"region":{"startLine":954}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c172039c1a0a4bb45d7e6cf8c2d61b48225193878b182ab0577298270b2090"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function validateManifest (cyclomatic 49, cognitive 54): validateManifest has cyclomatic complexity 49 and cognitive complexity 54; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive 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":"plugins/_engine.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"852942255e23b1e76eac8d47e64b33b56353b4281822087cb00a47bb5a1fc550"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 46, cognitive 123): main has cyclomatic complexity 46 and cognitive complexity 123; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"batch/aggregate-tokens.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5927547c384d7b2a6059a4ff0a040faed2e6bc8d61dd3b5b5a9cce9918408f0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function driveSession (cyclomatic 46, cognitive 82): driveSession has cyclomatic complexity 46 and cognitive complexity 82; 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":"web/src/lib/apply/drive.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"aedd57dc5b2d358c72f5c25a339d60e761fa86b9b8114a43db91a8042ce0d8d1"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function runSelfTest (cyclomatic 45, cognitive 50): runSelfTest has cyclomatic complexity 45 and cognitive complexity 50; 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":"build-cv-latex.mjs"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"815ceffc6b92bd2a9a775b6795a4c5386f91ec1a58741c328a52093d51e921eb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 43, cognitive 82): (anonymous) has cyclomatic complexity 43 and cognitive complexity 82; 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":"web/src/components/explore/explore-provider.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"a587f3992b4fb891e0e401a45594389356ff430b575d9017c46222617bc1a529"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function fold (cyclomatic 43, cognitive 54): fold has cyclomatic complexity 43 and cognitive complexity 54; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive 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":"salary-gap.mjs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"9783011a517599337970cfa1c3fb08793d631fcb2de4c8d59a9adb2514af1c1f"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function fetch (cyclomatic 42, cognitive 88): fetch has cyclomatic complexity 42 and cognitive complexity 88; 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":"providers/radancy.mjs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"257e6293593d5e7a88245eb036f1a4d67a3e8b1b74cc150417868c1a1656e43c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function generatePDF (cyclomatic 42, cognitive 51): generatePDF has cyclomatic complexity 42 and cognitive complexity 51; 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":"generate-pdf.mjs"},"region":{"startLine":1367}}}],"partialFingerprints":{"codehealthFindingId/v1":"203b8399a5e468e776c64f620806d69199b3f04efdab78bf80bafb3e391e6286"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function normalizeProfile (cyclomatic 42, cognitive 32): normalizeProfile has cyclomatic complexity 42 and cognitive complexity 32; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/export-ats-text.mjs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"323ff43b200ac1fed5c3ca6ecdb258f0bcf7a7bfefaa8cb62492dde296890093"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function codeMask (cyclomatic 41, cognitive 95): codeMask has cyclomatic complexity 41 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":"tests/local-today-gates.test.mjs"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"91bfdf0d81a16dbacbaf8c0df5ecec6b78e84b84188e60627dd8862a5a03176c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function locallyModifiedSystemFiles (cyclomatic 41, cognitive 86): locallyModifiedSystemFiles has cyclomatic complexity 41 and cognitive complexity 86; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":1861}}}],"partialFingerprints":{"codehealthFindingId/v1":"05f4ce8917f6e55475414fbfe3bfe5ce03adb88b798c447aae58cb73cfdbd8ab"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseCvMarkdown (cyclomatic 41, cognitive 85): parseCvMarkdown has cyclomatic complexity 41 and cognitive complexity 85; 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/export-ats-text.mjs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cee06b384ab26e18b668aa8788a30a380e498e93b7df7446e389b9c7e456b78"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function fetch (cyclomatic 39, cognitive 62): fetch has cyclomatic complexity 39 and cognitive complexity 62; 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":"providers/peoplesoft.mjs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48310e0788156d4aed0d36361b35c6e88695da0313a0855ce7bb37c5df325c5"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 87 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: update-system.mjs (3924), scan.mjs (3802), generate-pdf.mjs (1985), merge-tracker.mjs (1854), company-history.mjs (1655), analyze-patterns.mjs (1619) (\u002B81 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: web/tests/lib/profile-input-validation.test.mjs:10 imports \u0027../../src/\u0027, which names no file in this repository \u2014 and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/tests/lib/profile-input-validation.test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab5eefcfe0301dcb1e8b9b6fb586f14ae66ecfbfe0bdf361c8c46c5c27372e85"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: web/tests/lib/profile-write-shape.test.mjs:12 imports \u0027../../src/\u0027, which names no file in this repository \u2014 and no rule in its .gitignore chain could cover one, so no build writes it either. The import throws as the runner collects this file, so none of its test cases run and nothing it was written to verify is verified. Restore the missing module or delete the test. It is excluded from the reachability measured above, because a file that cannot load reaches nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/tests/lib/profile-write-shape.test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17a9b0235c8c9e1e3bac09adca53814e625726b9b0071c5f75eacf890f86e55"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-columns-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc668ef9727db8806285186f1e457bf08f376d66489853fad559853c0044764b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"set-status-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a356933c50f24045ad44dd800e8cec975adfc4f98c835c4f458c13c2157375f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cc2febfbeea6bcd49acc866e8bdf53de8bc1b7b258896dc6d1f5609abed2bbf"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"upskill.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1315360f225cbf76887cd57e3b675015374e7f964003e45f8a8b0f01107fae9b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-funded.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f5e98d272366c9ec1fa89e4c4942bbc9c50e0e02d78e17d1283fb6fb5390bc7"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/peoplesoft.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"114ebf76687eb838bb1d5a9191f3d73c72a6fb5f5564a3271cfbdff797a7abcd"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jd-skill-gap.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8360c624cc1484be44570c1e3f5fd80f312c91b947b3908d72ea4f6883c3dabd"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker-writer-lock-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e9b160a92f5f9499f6dd17c1fe27bb2f9f8d1532a12d922c8623df0fe2c53a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"set-status.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"911e48108ae8d7a91561007fc85d2afb4e60a9ccb6519263cfc5840276f8c6a3"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"salary-gap.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff055a1c5a46e7978ab0fa761f75f8f9464d619843892c231b43969da43e8d6a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rejection-latency.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdc7b4dfde43b01a5bcdb9b2db3bac90ec07ce3990f6cce99fdb7290fea3b0de"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"weekly-digest.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec44b9e60ca289f89b8db16ca40034a8be5e2559f0fc4994b0fac044abb54c42"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"negotiation-roi.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"501b5d2d774703a814521516252185ecc5b915ec27d6c8b786a48a79915da504"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"gemini-eval.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"799dcdf48dc27f8957b3bb395962240436e934bad164a115415a4d5f7ea7df67"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/apply-view.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"925a1675f41c3e95831bc8cf2d2fffad18cd6380dff2a9eb9914f39f7c268c23"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/run/route.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80d25ee7281f01a32f599bc0ab9345a3e4b580173b69676c6c0e5cc1d8b232f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-latex.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c472c15e1ee8fd8e41bbc173fe79d78a4f23f23a76cb046213d59f0f3169825c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-seed-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f200ccfd53d1f70b572bfba6b1e378c3ee61969ade567a08cc7a5714ee3c9397"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/apply/session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23d2557d1b0c0864b43605f50e906f9c2e76d97c9944d9d2dca2f8d2ee6b2dfe"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"agent-inbox-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec45272c75475114c89ac9555c19db8b0d1a7a0aeb7f36c1a6e90db88c737c5b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins/h1b-sponsor/lib/api.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cdd04735a6ed52e1b624c28b37b8937600d010c8bd40ccfb0c9ad8193ddc63"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openai-eval.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb080e559a61bda6a2160b8831e327fb188ab0bd6d71d6b24f489ebe80d1df96"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ollama-eval.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac7177acc6070b6575368d2e0a15d6a710d46dc66b2784448bbeaf992d280c9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/radancy.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac28ca66fa840f5689dc801a7da1edfe275a746c20a6a75f5615989d9940bcb8"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/followups/followups-view.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d19a9c01644ddf9d7a1b17844e1cfb6bd4dfb3030cd1f99c86140d424175115"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rank-pipeline.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"604e7e461fc38a13d9d93953c5904fd3b072ad8cfd0029cec30f27b432f3b259"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"contact-extract-tests.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d24da8524168cb0eb22ca0b141571d2c49bfd0d4e70028466cccd7ab09767b"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"intake.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"329184fbd3d2dc3b62ccdaf6fb37e815730fc7e761b582fed9acf2ce9e269a27"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"archive-posting.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d565d25cd7ec455ef92809a07b4ae1f0d720e0bea54d64ec5d07feca2cf3465"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/ultipro.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8144a32bf29e87d04ba0d45060e2d31b8918da7b0b8e53369aa909db442f37ce"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dedup-tracker.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75317fe4a87346a99895761afab2d3f72f47f447049a916894b1dc3a1dbe4705"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"plugins.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47221c1d2d1aeed502502c76f633d5c1699ac30ba7df097a51124e63c6d69a86"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/telegram-channel.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b0bc73900f0c7be2af310ddc6b477f1edd1e592376f865b5181ecb72e5528e9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobvite.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"847136e71faef74d30fcd43a68d11806d277a20b495424f0c094019fbb1cca3d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/successfactors.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e6ffeeb1bdaddf1d0a9fabb62455ace72b83af1f7d5753fffc23d94ea530ab"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/explore/ai/route.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed0b2922c40aee06ff5031adb3d0def0c9daef18f78bb627ee06b7707f3e5e6"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/explore/explorer-view.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad476526941f70aa20ca06fa9729800ac33cf9707060c3a2f994a8aeadc9130d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan-interamt.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d0a93888cdd139f5d43840ac1994182499decff8d734a0c36958b795472c70"}},{"ruleId":"R6","level":"warning","message":{"text":"The declared test suite includes a file that cannot be loaded: This repository declares test tooling, and the \u2713 above records that declaration \u2014 but web/tests/lib/profile-input-validation.test.mjs and 1 other test file(s) in this workspace cannot be loaded at all: it imports a module that names no file in this repository, so the runner throws while collecting it and none of its cases execute. The wiring is present and the suite it points at does not run as written, which is why the tooling tick must not be read as a statement that the tests pass. Fix the unloadable file(s) \u2014 each one is reported with its failing import under Test Coverage \u2014 then the declared script exercises what it claims to."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/tests/lib/profile-input-validation.test.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"459bfc828493a2b45efc91a7a193bd2500547ac2dac7e9e6ae6070e524c0cbb1"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~945 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/peoplesoft.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04425bd7ec1c79c6d18388767aa31f6755229da4ca605dbb386f111abf0a0a17"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~511 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/radancy.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c56a14d0856592fcfbb51264bfe5c299c34471e2a378bc92b6197810c08ab3"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~479 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/ultipro.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d3316e58c6b6e4a15083a97e1568292b028ca6861e358d06b70776a46696273"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~444 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/telegram-channel.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f74906ca9f5518ce5cba970d5c0bff3f1471e59d2df440a99682fcbee842d837"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~443 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/jobvite.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5195abdafcfcde5c694d9e7e7fe1201b53481a431f6429604a47cd8a61af71ac"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~433 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/successfactors.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f11b1953607f014fc071048fcef98a8d2bfadd2b9bccec8fa5a43ae9a0fc68"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~335 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/generalist-world.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c29713b1c6aeb3b8959d36f68dc028b1ac2795cb9f04ad3716be81c3b96283e7"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~334 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/careerviet.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6a0e115760848f983078a1011cbeabe55381726c5c3c80e18e83b9f37860b02"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~326 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/remotli.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf824a96d5e6a3c35479eb5f33d4c673dd5c833d39de46d8df3d6ad0b0efa75"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~322 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/gem.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc73ef6c205e8f2235561dd16d34b0e34815d1d11775462c30263869392f7f9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~322 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/vdab.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23893ba8f80189e3ef21631a7cca542b5b477b30de2a604a1c3f1f837fd238c9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~307 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/mokahr.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dea99894350945422f549643bb2fd809f07bc4e3b4999a8bba3e343fa807a22"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~304 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/taleo.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a0cea431ef0b660821915988314d28369e3861be4fc07a5261db1bcfd047253"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~297 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/jobbankca.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b48cac93b0038a510abb8f0e4a6adf90a702998c8152abdd4dae0353441d8f06"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~293 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/getro.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f009c14cc0019623c3f208eec710fb468e160076117eb5fe019e6337269538"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~280 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/occ.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab9ec49fa9f1e546fb76b76c70c6c1d308aba1b34ca0bdc63685761584262320"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~273 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/oraclecloud.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2c731f91d5b4ca49749fc5cd6631cd8d96d74ad76df73aa7750f7e14c35c34e"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~272 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/phenom.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eafa8cf43bf53caa6ee9042258b51936e518be1c116054e3375daa45a163357"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~269 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/avature.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d907ad36ae39e3d000e33dada4f74d96181468b018acec14b61bc357ab5d2c"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~269 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/csod.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8347c7c61a68cf792f4e330e7466840b364d996219808b1e3bd79ede09163557"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~265 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/arbeitsagentur.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"926ff861af359fc1dfe08e2efb998d17a559b0c1bf027a0a44723279d92ca3c8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~260 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/eploy.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9de2cf9cb1194e4de2241eadaa5810bff98d375cca7882f3b85e285d984b54b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~258 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/jobstreet.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b3df387c187d072da4d2cf316e368ca40515b9d5db553e52f0786cf91475f0"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~253 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/prevueaps.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f66a7ffac3d80dc24b4410ca4ef56e8de05a6c25e902ffcfdd51f0b7124272d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~250 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/glints.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13ea0cf5c19ab7a5afa0f107accc429b39d163ef7e21397319cb2d6e859b4941"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~249 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/wttj.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16c981e22e3490788925508dfdb8866d0fe96ef04e5acbbe1cace336d26d4b99"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~247 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/personio.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b3224ba29536ae89655fd8c863c44c1d4b6f8ba9bdbcb3401207bcba3e26c86"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~238 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/jazzhr.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"688e28e966ec688ad2eb60fe8fe8f9dd9324cbd871e4002c6ff10eca76e444e8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~233 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/torre.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"183cdf85d8ffd17512214419e60f4edc494de0f93d6c7de884f6d3c87ce84bd0"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~231 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/senjob.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4038b389429a6338e15a69a8682e2b34e1cbcf659421c740402e993f09b9da4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~223 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/mycareersfuture.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fef628f058ce667137d9f104a0f4492b244ef7bc23ff92fdb87bf0822f06683b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~222 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/manfred.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b310783f75c849ceb36fd6d58ab821b4b67548825a507cfaad9d4a6c5809eeed"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~214 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/a16z-speedrun-talent.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68da0c8a04f628c186eff8e2ff1930b87d1e113996207b1ad9e4de883135e9f7"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~211 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/yourator.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92386779621d72ddc04e8efc194bd0b052b77fa8c5a677fdaa6a509ac6f7db12"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~209 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/consider.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"898eacae3cb1e4102688bffd7bc01a0555d9d5665d15b7649a2412cc73a4b5b8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~202 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/schoolspring.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"943e3e9a4e108b82b0541aa21691adf873dd6835ca7e462a4bc8c57ec12c1290"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~199 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/feishu-jobs.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a1db1342cef9ab7d952d47127536071792c1ac8b3b7962f0ba79aa46701eaa4"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~197 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/agentic-jobs.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad4eb0a7d88062a23ae7bade102b9defb2965535eb4c43b632276af21b8ededc"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~197 LoC): no import path from any entry point (222 application, 125 tooling, 570 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":"providers/getonbrd.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23492465a3ab2d6758e5b629eebb5f01d085730c9c84d0957ca664faa7070048"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): web/src/lib/career-ops.ts \u2192 web/src/lib/core/pdf-index.ts \u2192 web/src/lib/career-ops.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/career-ops.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c04bbf9d174b76de4616bca3382768b3e290a815144e896ed4cb2c8326f18c0"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!!v \u0026\u0026 typeof v === \u0022object\u0022 \u0026\u0026 !Array.isArray(v)\u0060 appears character-identically in 2 files \u2014 web/src/app/api/followups/cadence/route.ts, web/src/app/api/profile/route.ts. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/app/api/followups/cadence/route.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da5ec19ab8b74f4f3c8a0c0c18569fe185a6c60c21a9168afd457ebc903a6ee"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!String(job.location || \u0027\u0027).trim() || /^n\\/?a$/i.test(String(job.location).trim())\u0060 appears character-identically in 2 files \u2014 providers/icims.mjs, providers/jazzhr.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/icims.mjs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"749b6b40e38d748b7a4044e7a9dca7c06cb36216456fb7095d55505753682908"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!entry || typeof entry !== \u0027object\u0027 || Array.isArray(entry)\u0060 appears character-identically in 2 files \u2014 lib/cv-payload-schema.mjs, scan.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/cv-payload-schema.mjs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"7caa82e8e328ebf0cdea70d0bd6094195ec1959d5e75c6a917ba82b2b787e4fc"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!parsed || typeof parsed !== \u0027object\u0027 || Array.isArray(parsed)\u0060 appears character-identically in 2 files \u2014 analyze-patterns.mjs, upskill.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"104f8b4ece369b5be95a9650756bea276a519757912dbe0650c2c90db5134965"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!repoRelative.startsWith(\u0027reports/\u0027) || repoRelative.includes(\u0027..\u0027)\u0060 appears character-identically in 2 files \u2014 analyze-patterns.mjs, upskill.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"analyze-patterns.mjs"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"6676d36e1779969c5c0fc553b32060ee4c7df25c253508a5c139ab92c6dde5c3"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!value || typeof value !== \u0022object\u0022 || Array.isArray(value)\u0060 appears character-identically in 2 files \u2014 web/src/lib/portals-config.mjs, web/src/lib/profile-patch.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/portals-config.mjs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0151362e1a9b166d763a383d9730d7df6c8062b201297f52f41654738b0a48e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Array.isArray(j.locations) \u0026\u0026 j.locations[0] \u0026\u0026 typeof j.locations[0] === \u0027object\u0027\u0060 appears character-identically in 2 files \u2014 providers/4dayweek.mjs, providers/landingjobs.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/4dayweek.mjs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6186d814d370a38a81ae1b948aac368850c03c33286b330ddeb7be1a42cc22a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060JSON.parse(localStorage.getItem(\u0022career-ops:config\u0022) || \u0022{}\u0022).cliId || null\u0060 appears character-identically in 3 files \u2014 web/src/components/cv/cv-ingest.tsx, web/src/components/explore/explore-provider.tsx, web/src/components/explore/explorer-view.tsx. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/components/cv/cv-ingest.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44e985b9e3bb8604b6260a1181fbde4f1c7a6a44cf0201a3f7234d130b0a771"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060Number(throttleArg.split(\u0027=\u0027)[1]) || 5000\u0060 appears character-identically in 2 files \u2014 check-liveness.mjs, scan.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-liveness.mjs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"de6fa6016f1b47a03c2e808b625456a4f14ba47b6415498e33524996be67276e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060String(title) .normalize(\u0027NFKD\u0027) .replace(/[\u0300-\u036F]/g, \u0027\u0027) .replace(/[^a-zA-Z0-9]\u002B/g, \u0027-\u0027) .replace(/^-\u002B|-\u002B$/g, \u0027\u0027) || \u0027job\u0027\u0060 appears character-identically in 2 files \u2014 providers/phenom.mjs, providers/tkms.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/phenom.mjs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0396820e4d4d9fa42c7d1ed5d54f68e01600c8791ff59ccd183fa5a4a1a11a0"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060VALUE_FLAGS.includes(a) \u0026\u0026 args[idx \u002B 1] !== undefined \u0026\u0026 !args[idx \u002B 1].startsWith(\u0027--\u0027)\u0060 appears character-identically in 2 files \u2014 company-history.mjs, discover-ats.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"1393622a2336d53560045e5749a3ff88d712f39b6fadefe23fa328a660621b1b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060a === \u0027--throttle\u0027 || a.startsWith(\u0027--throttle=\u0027)\u0060 appears character-identically in 2 files \u2014 check-liveness.mjs, scan.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-liveness.mjs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"58f27eeaffcfd0c8eac5371f2fcd389ac96d43f982b040abb5275bdf168486d9"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060a.startsWith(\u0027-\u0027) \u0026\u0026 !KNOWN_FLAGS.includes(a)\u0060 appears character-identically in 3 files \u2014 find.mjs, jd-similarity.mjs, plugin-audit.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"find.mjs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a8087373769e876f5ad831cf451d5ed86afcd62f0a4f36d1e61a24539604925"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060a.startsWith(\u0027-\u0027) \u0026\u0026 !consumedValueIndices.has(idx) \u0026\u0026 !KNOWN_FLAGS.includes(a.split(\u0027=\u0027)[0])\u0060 appears character-identically in 2 files \u2014 company-history.mjs, discover-ats.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"company-history.mjs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ddc55416e0d11618c1bb97b735c15a4244a48244f9eccb06a36169d5acfb68f"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060args.includes(\u0027--help\u0027) || args.includes(\u0027-h\u0027)\u0060 appears character-identically in 16 files \u2014 assessment-log.mjs, check-jd-archive.mjs, check-liveness.mjs, company-history.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"assessment-log.mjs"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f122758e5798e959b2ab2dc19459cd82d09183327f3f43c63ea63d37b80051"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060args.length === 0 || args.includes(\u0027--help\u0027)\u0060 appears character-identically in 2 files \u2014 build-cv-html.mjs, build-cv-latex.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build-cv-html.mjs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3f4f3baf7df1e6dca21a3fe6d1e288698d0ae039935f7c4262458d1142cb16a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060args[i \u002B 1] === undefined || args[i \u002B 1].startsWith(\u0027--\u0027)\u0060 appears character-identically in 2 files \u2014 archive-posting.mjs, discover-new-companies.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"archive-posting.mjs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"224d3f5d8d8fdd8ff2bec76e8239e938952cf37c67320f59e7935a25db880652"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060f.endsWith(\u0027.mjs\u0027) \u0026\u0026 !f.startsWith(\u0027_\u0027)\u0060 appears character-identically in 2 files \u2014 providers/_registry.mjs, validate-portals.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_registry.mjs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"706e16c9b0d2cc10eb9df13e0950f62f6e2827ff913ff635f5face95ed556325"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060host.endsWith(\u0027.local\u0027) || host.endsWith(\u0027.internal\u0027)\u0060 appears character-identically in 2 files \u2014 providers/consider.mjs, providers/eploy.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/consider.mjs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b31e8aa76b79f6154d886d63e07f4a10157c79f66b8ac0811e454b17e2fb2bd2"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060host.startsWith(\u0027[\u0027) || host.includes(\u0027:\u0027)\u0060 appears character-identically in 2 files \u2014 providers/consider.mjs, providers/eploy.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/consider.mjs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7872a1974b57ed03367b8b1a350d92fac172f1f6eeb4d9ccd7e8eb499baab15"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060hostname === domain || hostname.endsWith(\u0027.\u0027 \u002B domain)\u0060 appears character-identically in 2 files \u2014 providers/_trust-validator.mjs, scan.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_trust-validator.mjs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f2a02f7ba76f97e2b273fdc4680983a458d7d025cff4040f5a108802cda13b5"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060idx !== -1 \u0026\u0026 args[idx \u002B 1] \u0026\u0026 !args[idx \u002B 1].startsWith(\u0027--\u0027)\u0060 appears character-identically in 2 files \u2014 discover-ats.mjs, scan-ats-full.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"discover-ats.mjs"},"region":{"startLine":1020}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab173f71fa1a3605d95787d44c2625204da2c0ee1b1e120aae808fad0c83407e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060j \u0026\u0026 typeof j === \u0027object\u0027 \u0026\u0026 typeof j.title === \u0027string\u0027 \u0026\u0026 j.title.trim() !== \u0027\u0027 \u0026\u0026 typeof j.url === \u0027string\u0027 \u0026\u0026 /^https?:\\/\\//i.test(j.ur\u2026\u0060 appears character-identically in 2 files \u2014 providers/remotive.mjs, providers/workingnomads.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/remotive.mjs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c63cfe0594493ae52fd864a1a0c6650cb285f5f9098d17243935a37404ddbc0"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060j.company \u0026\u0026 typeof j.company === \u0027object\u0027 \u0026\u0026 typeof j.company.name === \u0027string\u0027 \u0026\u0026 j.company.name.trim()\u0060 appears character-identically in 2 files \u2014 providers/4dayweek.mjs, providers/thehub.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/4dayweek.mjs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b87a9fd0ac7a33ea7643f60c08be661094c5d6396791e90d620fb2ba344f36"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060parsed \u0026\u0026 typeof parsed === \u0022object\u0022 \u0026\u0026 !Array.isArray(parsed)\u0060 appears character-identically in 2 files \u2014 web/src/lib/career-ops.ts, web/src/lib/status-cli.mjs. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"web/src/lib/career-ops.ts"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84ed029f8beb99684956a0906981a86b2f741ff5d43af94a62ac6ace85581c1"}},{"ruleId":"X6","level":"note","message":{"text":"Hand-rolled JSON/XML parsing via regex: A regex whose pattern encodes JSON/XML syntax is parsing a structured format by hand \u2014 malformed or differently-typed content (e.g. \u0060\u0022amount\u0022: \u00225\u0022\u0060 as a string) silently mis-parses instead of failing validation. This JavaScript/TypeScript code already uses a real parser in the same package; use it here too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/csod.mjs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"82146368bc514e68e6b0bf1b59aabd0c1fbc9cfce3fdf3cc2a4474a634a872cb"}},{"ruleId":"X6","level":"note","message":{"text":"Hand-rolled JSON/XML parsing via regex: A regex whose pattern encodes JSON/XML syntax is parsing a structured format by hand \u2014 malformed or differently-typed content (e.g. \u0060\u0022amount\u0022: \u00225\u0022\u0060 as a string) silently mis-parses instead of failing validation. This JavaScript/TypeScript code already uses a real parser in the same package; use it here too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/consider.mjs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"035dfb009ce1bfd3c3397185036619720e149b65155d6f8d13aa1d3a9f92bed9"}},{"ruleId":"X6","level":"note","message":{"text":"Hand-rolled JSON/XML parsing via regex: A regex whose pattern encodes JSON/XML syntax is parsing a structured format by hand \u2014 malformed or differently-typed content (e.g. \u0060\u0022amount\u0022: \u00225\u0022\u0060 as a string) silently mis-parses instead of failing validation. This JavaScript/TypeScript code already uses a real parser in the same package; use it here too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/builtin.mjs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c101c894a03a51eb33d7841cf86a3cf7869a8292d1186da7cda2f3cfc21f2f"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on error: \u0060getRepoRoot\u0060 turns a non-nil \u0060err\u0060 into \u0060return \u0022.\u0022\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or return it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the \u0060if\u0060 or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f0608d29abbeae746cfce0e3f0e7598b28c028784a2ac22972574035e2b1ed"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on error: \u0060sortPDFsNewestFirst\u0060 turns a non-nil \u0060err\u0060 into \u0060return 0\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or return it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the \u0060if\u0060 or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7d41d5f921fd13e73dc6fd9395e9243652e154034269b26fe3208e715182da3"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on error: \u0060ResolveHTML\u0060 turns a non-nil \u0060err\u0060 into \u0060return \u0022\u0022, \u0022\u0022\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or return it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the \u0060if\u0060 or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/pdf.go"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"e541e37593ddb19597dbc78c01614b063d2702b1a10839198ad1d20a5ea1d5fa"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on error: \u0060calculateWeeksToHire\u0060 turns a non-nil \u0060err\u0060 into \u0060return 1\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or return it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the \u0060if\u0060 or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/ui/screens/pipeline.go"},"region":{"startLine":1075}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9aace0c1bf8378a5845800ab9eee67c0dc06d914cedfeb0307403a36ef73d11"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on error: \u0060getRepoRoot\u0060 turns a non-nil \u0060err\u0060 into \u0060return \u0022.\u0022\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or return it. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the \u0060if\u0060 or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/main.go"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"312ddf20f6f7a5cc3fb0ab7e2be761d07fa49b8906a354eda54ea6f38620d410"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060normalizeUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"url-key.mjs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09e1fd89e7871072cef2fe0708690decae1d00c9721aac79a71817608232742"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/weworkremotely.mjs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca80b0a12f28e687de6f898ad240990ace86bda59d56ef461a2a472da06a6108"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseMeta\u0060 swallows every exception into \u0060return {}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cv-templates.mjs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a49f59a086dd8c63abdbd52d962c1bffdd5449315854d15c66c6dd29ced08109"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060mtime\u0060 (in \u0060outcomeDirsFor\u0060) swallows every exception into \u0060return -1\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lib/outcome-dir.mjs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5249fc38cfa1cf6351b0e79b7504e32858561e759da4ff5770b3139024159fa"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060findUnarchivedApplications\u0060 swallows every exception into \u0060return []\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"check-jd-archive.mjs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"0affd08bf85244176b4b84d375e5e7599ebe4a952ed537c4fb2820fd7e7022c9"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060loadProfileCadence\u0060 swallows every exception into \u0060return {}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"followup-cadence.mjs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bae023cfd488a816d6194f484f0ed2efc1c472803e8570d0e55dbbbb39fa202"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060locationHintFromUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae59b44abdb1f7ac5e3604149960444a08dabb0d2bc28fdea1893fc801de1cb"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060loadCandidateCountry\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1172}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c9a7cffeeca1a53d7b65b225ff92fdf865336da63b0984f67317fdafa3aedb2"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060loadReApplyWindows\u0060 swallows every exception into \u0060return {}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scan.mjs"},"region":{"startLine":1200}}}],"partialFingerprints":{"codehealthFindingId/v1":"42b9797a880dc8c339a8e7d587294da81767d841ccf5fbce60df058fb024bbe8"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060readStyleTokens\u0060 swallows every exception into \u0060return {}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"theme-style.mjs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8459198c849c91ecf88d6eb5e1480a80ceb55f6794676870d6dda71178a906d"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060readCvSectionOrder\u0060 swallows every exception into \u0060return []\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"theme-style.mjs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e81c48562eb1f290107c7bba43b5b89ab5632da55b81fc0bd70e3ff23249656"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060readIfPresent\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"history-ats-seeds.mjs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"6791a5ec78d2be3be8b0b6e9f160612167c8e6034483e21aa4b680d11e08611c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060loadPersistedBlacklist\u0060 swallows every exception into \u0060return []\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"openrouter-runner.mjs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"042c8b828f18aaa88f659fff2d9c0983c7ff81efdeaaaa9a9c3d671870f0c62f"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060resolveProfileKeywords\u0060 swallows every exception into \u0060return []\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/_profile-keywords.mjs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"5218583f67f90f62753f79875314341563f363bd0436ac28ba5cfd3bdcce33fc"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060countryName\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/agentic-jobs.mjs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d48f677ee7306aed386221e4fbdadfac5a77716eaec35aee5e039dc3577e70a"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060absoluteHttpsUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/collage.mjs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a413d94b1e1b66ef9a250a47a79d18e2b8864a510ee70db29096282873e271c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060deriveBaseUrl\u0060 swallows every exception into \u0060return \u0027https://glints.com\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/glints.mjs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8c2a4eb38c35bd53c08463f65d8e4ee4761d6d12372bd40c40c433be1a81ca0"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/higheredjobs.mjs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"609d39c3a55d66654c493f7171b9aa89f9b06a4496d40187207e0bda8cd32ea4"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanHimalayasUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/himalayas.mjs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc426d6515380a80d2be5424ce517bb5cea2251e3d6ac42c3092acf2a9f6a634"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobbankca.mjs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b775e74b72bab6d1009f621a3381f9758623cf3d10d0e5eb76e204f42b1395c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0022\u0022\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobspresso.mjs"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a77317b9ec2937786b9beb1ad7a7ad28e4c9599153290cd71dd4fa9c2c2a0bd"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060deriveOrigin\u0060 swallows every exception into \u0060return \u0027https://id.jobstreet.com\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/jobstreet.mjs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5232a1969510eae5737e15819bccce7a8995e43b694296fe74da89a1574356"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060companyFromUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/landingjobs.mjs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd4cc9fc83ff3572a97d91e7db282e9dadfa35b8169bd96f598678d914e505d3"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/larajobs.mjs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"25189bd8a78ae525a7e2c99011bc93b6970ec15a2edc1b053cf54c5aa9cdda3d"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060normalizeJobUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/local-parser.mjs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"0676ae9d012c60e7bd01ef5bded93bd3c7e071bb23b314fce3d8809cae6b0ec0"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/mycareersfuture.mjs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e1f0e8569b6ab9963cc43341148e8ef762066b790903f8367d52058a3f386d"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/nodesk.mjs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc844ba7029f971407d4dfcb15716b4e5d282d4215e77e17837125255590092"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/pythonorg.mjs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"694a9e1c7b2ca7455a696cea8dd54a89e2d4d06b880b0536fd7058dd649f1474"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cityFromSlug\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/successfactors.mjs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"5534ce194a7e95b7c47ee5b03c105409a3dc81fb13e2b5797451ce1f03c706cc"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060cleanUrl\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"providers/teamtailor.mjs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d987a044eb27834ad4a9c7a3ccad1bd6378080c5e1be6b79bd75fdccc7d0d2"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseBatchResponse\u0060 swallows every exception into \u0060return []\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rank-pipeline.mjs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"189c26ef571b6f67ba5ac7d72d3bf2c96d15636f4d969176eb10ab2251c60c6e"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060loadProfile\u0060 swallows every exception into \u0060return {}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rejection-latency.mjs"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"a144cfb74082245d9f15fa6dac70732b425f6a468e9788063e3e9978e9e9a254"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseExtras\u0060 swallows every exception into \u0060return {}\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tracker.mjs"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa4cfe0218082ec2e793ab789cb459ebe6281834bb2f0e84162922702510e67"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060consumeReexecMarker\u0060 swallows every exception into \u0060return false\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"6660ad933792f73b9879257b176463c775ca44bff6026475723a02a4d8fa690e"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060localShortSha\u0060 swallows every exception into \u0060return \u0027\u0027\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"update-system.mjs"},"region":{"startLine":934}}}],"partialFingerprints":{"codehealthFindingId/v1":"c516484eab170a84dc3860bd38ebdf87561412b3527d3d11a3bab9e97a042f8d"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060strings.Contains(r, \u0022administrator\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060strings.Contains(r, \u0022administrator\u0022)\u0060 also satisfies \u0060strings.Contains(r, \u0022admin\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/stats.go"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb192073097f3c4fd39d026550b1fbfe2dfc769baa38fac98f66d6d33ec8326b"}},{"ruleId":"X9","level":"note","message":{"text":"Subsumed condition operand: \u0060strings.HasPrefix(s, \u0022duplicado\u0022)\u0060 can never decide this \u0060||\u0060 \u2014 every value satisfying \u0060strings.HasPrefix(s, \u0022duplicado\u0022)\u0060 also satisfies \u0060strings.HasPrefix(s, \u0022dup\u0022)\u0060, so the \u0060||\u0060 chain is already decided by the latter. The expression is equivalent to the chain without it, which means it is wider than it reads. Delete the dead operand, or narrow the surviving one if IT is the accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"dashboard/internal/data/career.go"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fb1cc7f62e5f3ec8c73ce7e89bd926a54fca04c644680f3f9349d548d786810"}}],"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-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-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-252","guid":"78915dc5-e486-f858-bc3c-aa570ad9010d","name":"CWE-252","shortDescription":{"text":"CWE-252"},"helpUri":"https://cwe.mitre.org/data/definitions/252.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-391","guid":"d9ef5687-8d79-9b51-b509-b83411fbcdc3","name":"CWE-391","shortDescription":{"text":"CWE-391"},"helpUri":"https://cwe.mitre.org/data/definitions/391.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-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":114,"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."]}]}