{"$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":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"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":"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":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"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":"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":"D33","name":"JS/npm Dependency Vulnerabilities","shortDescription":{"text":"JS/npm Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D33","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D38","name":"OSV Dependency Vulnerabilities","shortDescription":{"text":"OSV Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D38","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"]}}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"watchSearchChange (cyclomatic 22): watchSearchChange has cyclomatic complexity 22 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/query.js"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"b453737f9d6204212316143ebb17272e48f5fd114a81ad96fa99796b8e19567c"}},{"ruleId":"D2","level":"warning","message":{"text":"watchSearchChange (cognitive 26): watchSearchChange has cognitive complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/query.js"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"d63c2fb6461b50faccd6801d219e898199b0213762d6f72900b87ecd03dcb42c"}},{"ruleId":"D2","level":"warning","message":{"text":"manageUploadedBy (cognitive 20): manageUploadedBy has cognitive complexity 20 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/query.js"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c76f235d294d4043431535b88f9ea9aadcdfd8f4df7ca023a190450ce36f65"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 19): (anonymous) has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/query.js"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"c41c93136150785fe3379defc799b7228b0c326c1f22064ad9821e514ec44e03"}},{"ruleId":"D2","level":"warning","message":{"text":"notificationMessages (cognitive 17): notificationMessages has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/results.js"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80f7b27ec1196f8c88ed59505b5d9f3523f9f9d3ca82da1d65176da22878b22"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (190 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/Parseable.java:86-275 | scripts/src/main/java/com/gu/typesafe/config/impl/Parseable.java:298-237"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/Parseable.java"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"f88fd3e117d4e861ecf99c03f529d66b5546239923f968a830aea3ba54008626"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (119 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:202-320 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:342-359"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"77cc55f2ac85999330a9029aec0d1bc2c37c025a1e3bbd0b75df236e418c2d67"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (115 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigImpl.java:286-400 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigImpl.java:491-410"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigImpl.java"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b86301d8bc0912e6cef7685edd970abff93b18ae1ea0584a758487fe30920e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (88 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/ConfigFactory.java:943-1030 | scripts/src/main/java/com/gu/typesafe/config/ConfigFactory.java:1060-943"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/ConfigFactory.java"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"5247b06dfd2959e6bb8af3b1ce89d6af728256a3f900ed187b9962dc250f4794"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (75 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/Tokens.java:366-440 | scripts/src/main/java/com/gu/typesafe/config/impl/Tokens.java:441-431"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/Tokens.java"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab6a431aec0c0afaf242b6f984d950cbac548d8202bc4a84a438daec37fd2a80"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/ConfigException.java:50-88 | scripts/src/main/java/com/gu/typesafe/config/ConfigException.java:367-381"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/ConfigException.java"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a84c64a7455a4403800a7af01c6c0a8cca35bfb61638fec192943321ea9d18d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 3): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMergeObject.java:119-153 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMergeObject.java:154-26 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMergeObject.java:164-168"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMergeObject.java"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c8ed589f19fd1046a22f2affe12335ba0ba14f86c849ecb119d7ccf1671f3f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigList.java:388-405 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigList.java:418-425"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigList.java"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"7531f52f0b3f547b5f75063dae472c89ba3e23ff34a1a4681c5a4b82b5eb6538"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ResolveSource.java:192-204 | scripts/src/main/java/com/gu/typesafe/config/impl/ResolveSource.java:223-233"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ResolveSource.java"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d80bace23405bc54b473f47be2c662abc1db66fa58cbc5e4c31996aaeb2582"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigList.java:273-285 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigList.java:299-311"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigList.java"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"5010a6b7774f1c34ec84b05e1dcc8402a2c4dc44bc098a61e3dd9010932a2d1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:105-111 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:118-124"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"0740b6e7136dffbfc90fa26218bf8be18d9122c3fec9fffa71733424a444a28f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:621-626 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:675-680"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f6b50540ea54489b909b6d0467d6628d62543fb7f3cf8d815db69573656ad8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java:376-381 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java:470-475"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"5702a3e4b3169dd74aa0a0478b90af315a45956bb47924bac9c09737180a7147"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java:649-654 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java:733-738"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"5702a3e4b3169dd74aa0a0478b90af315a45956bb47924bac9c09737180a7147"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:411-416 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:566-571"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f88dd9cb8dd6125b5f1f40f20bed54645212c670d1ffeb9344aa7c03c2ab1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:459-464 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:545-550"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f88dd9cb8dd6125b5f1f40f20bed54645212c670d1ffeb9344aa7c03c2ab1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMerge.java:83-87 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMerge.java:100-104"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDelayedMerge.java"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a1bc8679e022198e9d85837ebb97b52384f6b36c24cafa19af3bfaa77ecce96"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:322-326 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:374-378"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"0369d42fc2d35cb13b8c08674bfc2654e14d2bc6132c025dffd0666a288dabd9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:552-556 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java:566-570"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigDocumentParser.java"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"0369d42fc2d35cb13b8c08674bfc2654e14d2bc6132c025dffd0666a288dabd9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigImplUtil.java:263-267 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigImplUtil.java:272-276"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigImplUtil.java"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"829b0af7c9d0f6e598850c9f823141dde3e1a9a0d7e3f71f9dca33514c7e79b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ConfigNodeRoot.java:33-37 | scripts/src/main/java/com/gu/typesafe/config/impl/ConfigNodeRoot.java:54-58"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ConfigNodeRoot.java"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e35a0c18ff9e5f3efd04d069679ca6cbdeed2254d424b7012643403c39fec922"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ResolveContext.java:179-183 | scripts/src/main/java/com/gu/typesafe/config/impl/ResolveContext.java:192-196"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ResolveContext.java"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"3baa78a8766c62d3a2e5e63d2d63f704a7c40ca689fe832e005b13ddc49dd4a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/ResolveSource.java:99-103 | scripts/src/main/java/com/gu/typesafe/config/impl/ResolveSource.java:105-109"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/ResolveSource.java"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c547d0b20c1d87f5cf8080e66baa55b08ccaf5102bd62ba2b85b60450529d625"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java:643-647 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java:727-731"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfig.java"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4d83c4eca2663cc099d6b60cf3cb9a4a394e916d95cb9724246889397cd181"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:241-245 | scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java:260-264"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/java/com/gu/typesafe/config/impl/SimpleConfigOrigin.java"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"7144e439c598679d88f80b39be4a97edb4c1291733b4232f8ce3ab3ee70972ca"}},{"ruleId":"D8","level":"error","message":{"text":"No automated tests: No automated tests \u2014 the solution has no test code. Untested code is the largest single risk to changing it safely."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3132564c6310e5d01a231f252a02d5d2f5a542c0a8fa29a14c89693f1e3df871"}},{"ruleId":"D9","level":"note","message":{"text":"No tests found: No test projects found in the repository."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c9bf64cbb5a4ae13d6bcd01fa3bc8d2879d860c73bc67f176ee3c2cecb8adce3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: kahuna/public/js/search/query.js: kahuna/public/js/search/query.js changed 16 times in last 90 days, max complexity 22. 1 of those changes were fix/bug commits \u2014 a defect-dense hotspot worth prioritising."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/query.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62ca0fff884a3193594c1a2ad5e50234a773eb83c555b309663e6d942a40edb6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: kahuna/public/js/search/structured-query/syntax.ts: kahuna/public/js/search/structured-query/syntax.ts changed 7 times in last 90 days, max complexity 15."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/search/structured-query/syntax.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"532305958f8c8c6b74281bac3aab694bdad052e0349ac2f6e7624950326226a2"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no decision; only a file-structure reference: Replace with the real problem (e.g. inconsistent cross-project documentation) and the explicit decision (e.g. centralise architecture docs in README.md) plus consequences"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/00-about/02-structure.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5d5539ef4366e221a0229f4086c7cdb10ca8f551ca289e075df4cb3f0ecc6b"}},{"ruleId":"D20","level":"warning","message":{"text":"Decision is an install list with no context/problem and no consequences/trade-offs: Add a Context section explaining why these tools are required (build/CI/continuous delivery) and a Consequences section on alternatives or trade-offs"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/01-setup/01-software-dependencies.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e42b8563471b59ed0a74005cf9a04018616e997d792d8094eb26fd6e63ccf19d"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line dependency list with credentials and resource linkage is present: Add why AWS dependencies are needed (e.g. S3 for data storage, DynamoDB for structured data) and the trade-offs of using localstack vs real AWS in production"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/01-setup/02-aws-dependencies.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84cd79dc534b0616323edff6544b2f3742c1da6b47308f84c973090011059ac4"}},{"ruleId":"D20","level":"warning","message":{"text":"No consequences/trade-offs section (the host-resolve-to-127.0.0.1 requirement and the need to add each subdomain via hosts are noted but not framed as trade-offs): Add a Consequences section noting that changing DOMAIN breaks access on media.local.dev-gutools.co.uk until the hosts entry is added, and that dev-nginx must be used for any new subdomains"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/01-setup/03-configuring-setup.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"78e3c2a24b763144fae6ee79c65da8f21800112c52682c1ac13a3a7833de8b12"}},{"ruleId":"D20","level":"warning","message":{"text":"The body is a runnable setup script with flags but the context/problem driving the decision and any consequences/trade-offs are absent: Add a Context section explaining why local development of Grid requires this setup (e.g. Docker/CloudFormation/localstack/nginx auth stack) and a Consequences section noting trade-offs such as the need to run setup.sh each time, the authentication flag\u0027s real-world cost, and how to handle failures"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/01-setup/03-running-setup.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cfa278235b3a2fdfab6187783d202b1971d2900cd120095ee4186d3b2b07551"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a runnable script list with no rationale for why local running matters: Add the problem (e.g. CI/CD needs to run locally without external auth) and the trade-offs of each flag (e.g. test environment vs real data, long setup time)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/02-running/01-running-locally.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae5a07d2fb3f1cda74e1cd1d1621be7c89205d3170a5f81dea76e7922d8816a"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no decision; only a name and build command are present: Add the problem Kahuna solves (e.g. single-page app with hot-reload) and the explicit architectural decision it embodies"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/02-running/02-kahuna.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff53d3279ff2b99ada62b68583bb27fd6744312899ee0e70fe79df3f5c8117c8"}},{"ruleId":"D20","level":"warning","message":{"text":"Consequences/trade-offs of adding a Stopwatch logging construct are not stated in the visible portion (e.g. overhead of wrapping every do_thing): Add a Consequences section noting that each function call now adds a log line and any performance cost of the Stopwatch wrapper"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/02-running/03-logging.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b6f1b1371b1395cc31e91aa82ac853ab295f18aeaaca81d78e83beefe70042"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision (API-only root collections with a script) is stated: Add why root collections need a UI versus being created via API, and note trade-offs such as requiring an external dev script and the risk of human error"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/03-apis/02-collections.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d920e23161db1162ccb2d9f6b53faaf18409a09c0fb1b5b89f4eb9a3c81af23"}},{"ruleId":"D20","level":"warning","message":{"text":"Only a one-line failure pattern is stated; no context/problem (what dependency was missing) and no consequences/trade-offs: State the specific dependency that failed to resolve and its impact on build, plus add a Consequences section noting retry cost and cache persistence"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/04-troubleshooting/02-sbt.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fffbd381a0d1146b0a22d1759a94ce4d5c6a2ec39bbc264df1aefadfd4aba632"}},{"ruleId":"D20","level":"warning","message":{"text":"No consequences/trade-offs section (e.g. certificate rotation cost, dependency on Java_HOME): Add a Consequences section noting that mkcert installation and certificate replacement require JAVA_HOME to be exported, and the cost of re-issuing/replacing the root cert when needed"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/04-troubleshooting/04-ssl-certs.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b52e9ac0bd5fd8ad7ff7beb3e981fd78b74a2718eb0c52ee107f582da27cc99"}},{"ruleId":"D20","level":"warning","message":{"text":"No consequences/trade-offs section describing why layered TIFFs are handled this way and what could go wrong: Add a Consequences section noting that handling each layer separately (moving -n files) can be error-prone for new users or when the original file is renamed/modified, and how it avoids exploding the output directory"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/06-objects-of-interest/01-tiffs.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef363390a7030f680efddf125d23f5d86225d2f67498d3cc257f037ae094181e"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line status line and the template link: Add why this setup is needed (e.g. running Grid without a shared stack) and what happens if it fails or is broken"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/01-cloudformation.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4c7479af2f6dd0bb0787374ab720ac8fde97028468fa6e606b9707014ec9e5"}},{"ruleId":"D20","level":"warning","message":{"text":"Uninformative title and the body is a runnable setup guide that reads like an installation list rather than a documented decision (e.g. what trade-offs or consequences are present for each step): Give the ADR a descriptive title summarizing its content (e.g. \u0027Local Development Environment Requirements and Configuration\u0027) so readers can find it without reading the body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/02.01-dev-setup.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"faddd06624dbb8f46310f75d5fd4311d23b117b8854886fe17113962bc5193cd"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences; only a one-line file-location statement plus a link to generate-config: Add why configuration is stored in /etc/grid vs ~/.grid (e.g. secrets/production vs dev flexibility) and the trade-offs of each path"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/02.02-configuration.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b58a5b470ad855fb10ac12ac2bd037f328328d9d9b6cf888513b07e7c16ee1"}},{"ruleId":"D20","level":"warning","message":{"text":"The title \u0027Grid API\u0027 is a bare label with no context; the body is a list of links pointing to documentation rather than describing what the Grid API does and its consequences: Give the ADR a descriptive title (e.g. \u0022Direct media API access for kahuna\u0022) explaining the problem, then state the decision (how to hit the media API directly via curl) with authentication/authorization requirements and consequences/trade-offs"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/04.01-api.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fdd266083ccf897211733831ac3735f646416197c606887d7b60fc1cf62f6e8"}},{"ruleId":"D20","level":"warning","message":{"text":"Context/problem is thin; only authentication options and one short test example are stated (the key-creation command is shown but its purpose is not explained): Add a Context section explaining when each auth type applies (client-server vs server-server) and why keys are needed over Panda Auth, then add a Consequences section on trade-offs such as the 10-minute sync window and the need to delete keys locally"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/04.02-authentication.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"452d8e0a9eb74c090d0c9b03cc2063af1c708c2f589b172a50f42850390bc109"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences; the body is a one-line curl command with no rationale or trade-offs: Add why direct image upload matters (e.g. faster uploads than multipart), the problem it solves, and its alternatives, then document the consequences such as key exposure risk from TARGET_KEY in the curl"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/04.03-upload-image.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b87a70fa8ea0d55523b835c7838d1b172d881a540d4d31adee8c34984cb7ec1"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences; only the one-line decision \u0022Thrall needs to be manually started before it will ingest images.\u0022 plus a bare curl command: Add why Thrall requires manual start (e.g. it is an API endpoint that cannot be triggered from outside) and the consequences of this design, such as how to restart it after failures or what happens if someone forgets"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/04.04-start-thrall.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce006ed4a9c895a88dee4a39829eecd141d93f457a86e865bf99bc106473f93b"}},{"ruleId":"D20","level":"warning","message":{"text":"The body is a single curl example with no context/problem and no explicit decision; the only content is md5sum output: Replace the code block with an explanatory problem (e.g. why media requests require authentication) plus the actual API decision (e.g. how to obtain and use the target key, what happens if it fails)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/04.05-media-api.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7179d27988c9122b7eb24935b8a8c67b121df95f57fdc9821aba29ab6a98f39"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line decision with runnable steps and an arbitrary URL (logs.local.dev-gutools.co.uk) without any rationale: Add the problem being solved (e.g. centralized log aggregation needed for debugging or compliance), the trade-offs of running ELK locally (maintenance, storage cost), and why the Stopwatch wrapper is preferable over a custom logging layer"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/99-archives/05-logging.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fac61743bc090442ecd5e3f9be7ea8a02186b2d40e2839a959c9332980e60a2f"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90fd4b3366ccaac0bdbb9fc72f8840aa5f37cbb4ebda0650a396ccaa6c5177eb"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"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":"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":"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":"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":"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":"0dbb915274563a1a1c7710b67a8c19d2a107f22fcaf0daddfce999f66be50e9d"},"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":"0dbb915274563a1a1c7710b67a8c19d2a107f22fcaf0daddfce999f66be50e9d"},"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":"28d23805263c02dbdd78ddd71006338da50308e58c8778c58da43c11be60dd33"},"taxa":[{"id":"CWE-89","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":"49e823b440b41546d9b67d3943b68630d13652f437e41029ac92422e82f47f49"},"taxa":[{"id":"CWE-89","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":"3d2043ebe6a9f57b37ce7e6a648b63c165cdd9558d3603e71c9169e5fbadca8c"},"taxa":[{"id":"CWE-89","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":"7e543dc23440b7c2333d3dc6b475af1bb0625925101c4243d4f4a0534e966cc7"},"taxa":[{"id":"CWE-89","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":"7e543dc23440b7c2333d3dc6b475af1bb0625925101c4243d4f4a0534e966cc7"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"761404d5d4bee45a337974a33093cf89e9adb6ac883c5af6a2cbcb0814ce04fe"},"taxa":[{"id":"CWE-89","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":"860d40e2047b7bd65093f4a889c7921e94b5bd63de408553f5a0ce3740b21ed0"},"taxa":[{"id":"CWE-89","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":"860d40e2047b7bd65093f4a889c7921e94b5bd63de408553f5a0ce3740b21ed0"},"taxa":[{"id":"CWE-89","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":"860d40e2047b7bd65093f4a889c7921e94b5bd63de408553f5a0ce3740b21ed0"},"taxa":[{"id":"CWE-89","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":"860d40e2047b7bd65093f4a889c7921e94b5bd63de408553f5a0ce3740b21ed0"},"taxa":[{"id":"CWE-89","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":"860d40e2047b7bd65093f4a889c7921e94b5bd63de408553f5a0ce3740b21ed0"},"taxa":[{"id":"CWE-89","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":"50f3105964469e5551f365cff80306a42bc89da98c19b2c63e8a1e16df0c5f54"},"taxa":[{"id":"CWE-89","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":"50f3105964469e5551f365cff80306a42bc89da98c19b2c63e8a1e16df0c5f54"},"taxa":[{"id":"CWE-89","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":"5d07a5f64714b5146e943c9413e9be3c6837ed10f0f55f3ba50821e69c58775a"},"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":"5d07a5f64714b5146e943c9413e9be3c6837ed10f0f55f3ba50821e69c58775a"},"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":"5d07a5f64714b5146e943c9413e9be3c6837ed10f0f55f3ba50821e69c58775a"},"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":"a78713ca94c765e588ae57c2cdcb735cbcd8b7c125fee6b16b0c5d97e324452a"},"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":"21f1c15ae503b72e29f9803ceed95cbc8c26b5f912df539ac35c02988a9589eb"},"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":"21f1c15ae503b72e29f9803ceed95cbc8c26b5f912df539ac35c02988a9589eb"},"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":"09ec8ece2a57b1d7b05cc9df46e271d8b15aa8a0056835c96cabde23db12d1c7"},"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":"09ec8ece2a57b1d7b05cc9df46e271d8b15aa8a0056835c96cabde23db12d1c7"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"d3683396d06668a19399814c412b975062dc88fcc944a905636fd331d05f146f"},"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":"76dbca040cdc8acf15bbf1ee602dbe40d7fc58b8393ee95fc7abe54aac89e165"},"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":"50ff71852fb3927299ad756907bdca37dfd408f0c4e159846164e1e4e0a3bf93"},"taxa":[{"id":"CWE-345","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":"1150bd97d7715eed1c4979f2b68706e8a265ea42a230fe1ba03317df10a1b51e"},"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":"dd63d50a646d9cd765bd322f7482baa062e118933af854b502e31240a0d91282"},"taxa":[{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"719365fd51f6d69b107f1b842964e275a6dd19e6af77b3fff4eac83e4d1d1f35"},"taxa":[{"id":"CWE-290","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a1a74e78ad406f5606b801dfe37d368d1a344707de3241b39906760ccbb9c7e2"},"taxa":[{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"fc37250287af05bd1898ea3b99daa7856a8abbce632d9a0d9d06a3cef5e09dcb"}},{"ruleId":"D31","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"17f0c32d3aec9486d5555466b0955593560a09a54952aa775e47c51ebfd9689a"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: image-embedder-lambda.ts \u2194 embedder.ts: \u0060cdk/lib/image-embedder-lambda.ts\u0060 (context cdk) and \u0060image-embedder-lambda/src/embedder/embedder.ts\u0060 (context image-embedder-lambda) live in DIFFERENT modules yet change together 52% of the time (12 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cdk/lib/image-embedder-lambda.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85ed2989d540e8292031ddb49f0813cbf947dc71b1b8d7f55c13a02d1be212a2"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: image-embedder-lambda.ts \u2194 imageResolver.ts: \u0060cdk/lib/image-embedder-lambda.ts\u0060 (context cdk) and \u0060image-embedder-lambda/src/embedder/imageResolver.ts\u0060 (context image-embedder-lambda) live in DIFFERENT modules yet change together 50% of the time (8 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cdk/lib/image-embedder-lambda.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d116dc7f209fcd3e0996936195eefda889e0e86ab2ef69bc687ca6357301fe"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: image-embedder-lambda.ts \u2194 imageEmbedder.ts: \u0060cdk/lib/image-embedder-lambda.ts\u0060 (context cdk) and \u0060image-embedder-lambda/src/embedder/imageEmbedder.ts\u0060 (context image-embedder-lambda) live in DIFFERENT modules yet change together 50% of the time (7 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cdk/lib/image-embedder-lambda.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ef1490736245e714d6393c8cb929335b23589635c0f363d8bcc8691cbb9690"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gr-chips.js \u2194 gr-text-chip.js: \u0060kahuna/public/js/components/gr-chips/gr-chips.js\u0060 and \u0060kahuna/public/js/components/gr-chips/gr-text-chip.js\u0060 change together 87% of the time (13 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/components/gr-chips/gr-chips.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"931db8cfc7ca33117c8f3e193b4e57e1a20e0582c7b7e1e9373adbaab515f204"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: imageResolver.ts \u2194 models.ts: \u0060image-embedder-lambda/src/embedder/imageResolver.ts\u0060 and \u0060image-embedder-lambda/src/embedder/models.ts\u0060 change together 82% of the time (9 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"image-embedder-lambda/src/embedder/imageResolver.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bcd39b01ab68ac70e0159de9693b1ed3ee0ce79704e075a69e4826104895051"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: backfiller.ts \u2194 localRun.ts: \u0060image-embedder-lambda/src/backfiller/backfiller.ts\u0060 and \u0060image-embedder-lambda/src/backfiller/localRun.ts\u0060 change together 82% of the time (9 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"image-embedder-lambda/src/backfiller/backfiller.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"557bbd236fa28b5ee37255f07733cd3b181606eee471fe9e99db5d58a275f85b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: edits-api.js \u2194 media-api.js: \u0060kahuna/public/js/services/api/edits-api.js\u0060 and \u0060kahuna/public/js/services/api/media-api.js\u0060 change together 80% of the time (8 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/services/api/edits-api.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"975e532f773aab331b26dd94d1775f2e1ce6b621bce18df9db43e8a89a8d46df"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: webpack.config.dev.js \u2194 webpack.config.prod.js: \u0060kahuna/webpack.config.dev.js\u0060 and \u0060kahuna/webpack.config.prod.js\u0060 change together 80% of the time (8 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/webpack.config.dev.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"199e0632e857c75d1188f6f1d596716b51fae4f3a950550975d6201c3445f887"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: embedder.ts \u2194 imageEmbedder.ts: \u0060image-embedder-lambda/src/embedder/embedder.ts\u0060 and \u0060image-embedder-lambda/src/embedder/imageEmbedder.ts\u0060 change together 79% of the time (11 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"image-embedder-lambda/src/embedder/embedder.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a2e06057e63cd595a3692bc7a9d658f8b0746e57148e054ae622b03c1d27b2c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gr-display-crops.js \u2194 controller.js: \u0060kahuna/public/js/components/gr-display-crops/gr-display-crops.js\u0060 and \u0060kahuna/public/js/image/controller.js\u0060 change together 77% of the time (10 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kahuna/public/js/components/gr-display-crops/gr-display-crops.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd168e2297dc1e2b8238d4ca02a3a4d6c3ea8a9450ada26fe02415b832d02f6d"}},{"ruleId":"D38","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":"24a57a4e2f4a108bbf8168d57019949faf6fce41d1576e22ec1edc0ce2e67e67"}},{"ruleId":"D38","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":"02b9c7631e7401ca8fffb1048bcdeb8502aadeeb4e29a1761bd6fe23493d1b9b"}},{"ruleId":"D38","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":"13bead1f1b5cd7068f128b0a454fb2c8e11c6ec62fe8a86ba54bf1b05656eeac"}},{"ruleId":"D38","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":"654e4e47f90ea29315f34ddc682d0fad06ff142ea25f7b0994e3420f810eeee1"}},{"ruleId":"D38","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":"185f3056ef01b52553852cc3a05e8a82e32d3aa722dfce4a8d8b0db0f5e1b243"}},{"ruleId":"D38","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":"ed7ff75d51de72abb6d8c952d57ba780c2ee28f23bfb1b432933cee6cc0120ad"}},{"ruleId":"D38","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":"1120ef253028ce73aa6c271c87d266b533fe782dcbc870555ea79b56aa9ed70e"}},{"ruleId":"D38","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":"d417f9030655fc4bd0a1bc6da5c246fb9c6befeaf12af86fff29e2b523988923"}},{"ruleId":"D38","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":"4a0ca5e230a420e800b9bf30e8f7a8dfeb6ffc9df993196a70706fd7c1531eca"}},{"ruleId":"D38","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":"45a3736a35b920f03081af3efc4d015a33699a349bc374f530f6a04326a8421a"}},{"ruleId":"D38","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":"4bb6d11c1069ec77c89643556c3f1a56586cdf332403355ad24172bc7dd2f58f"}},{"ruleId":"D38","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":"19c872da1fd789b9ca2a253962d39be618a9bce262278d747e11a2cef497c66c"}},{"ruleId":"D38","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":"11fc2eff6d8d6f6ce380572f448e27d8bcbb6b848c0623913d3eac4a8c9410b0"}},{"ruleId":"D38","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":"186db1ccdbab571663541664c85722e98ff1f60a8b9c92bab5fde48b1e6153f9"}},{"ruleId":"D38","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":"d3688bb787f660d24575792c6b74f9df21fce9d1949e258a99b67398dd6a51f3"}},{"ruleId":"D38","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":"d133f97c33784c8574158a7718a5b45565db9f3594a213d19e5a3802383232f3"}},{"ruleId":"D38","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":"ee3d6c6b36303e01cc2324949d0790631cb0036eb91f860e78a662d034dae37c"}},{"ruleId":"D38","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":"ac0b7ecfac4f2c35768f92dadbb3826bcaf6e70f59ef300499fb0dec61ab0c6a"}},{"ruleId":"D38","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":"e72877a9443ea5097d05eb03cb251d75fb39061dbefef8118c9167ae62a8e5f1"}},{"ruleId":"D38","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":"8fbd04b50c6ceda4dd24efff1d85153a64271186e2c0f013c3d0c372a66cd753"}},{"ruleId":"D38","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":"f83391f5d9a06c97e6863d354bc763ef4b688a2ac94c515086b9eca5159b5d40"}},{"ruleId":"D38","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":"eac7155e2ca27cf1022fbf7b01f6fa380543045528becd831d305da4b0b81864"}},{"ruleId":"D38","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":"75d3a436c292a10aae91d3c30629506720b9408845d222c503de6b8bad28476a"}},{"ruleId":"D38","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":"4c5c1e39b8efb20864dadee802a44087e3649f278ece4eb3e3e0e695f1ce5e79"}},{"ruleId":"D38","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":"0c887a5bb4b8dcffabae037b6bb59fcec5643d9cffb667564514223227a73bd2"}},{"ruleId":"D38","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":"4cd065228b25dfd29952b55bb09365d952afe42248e3b724c3c944c253381937"}},{"ruleId":"D38","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":"4eb442334d78d5b34dc2178774e1b0b8dd2df4a01825987fbe22358746aeb51b"}},{"ruleId":"D38","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":"0927b3a7197f507281cb034f40d444f34288e9db9d1deac21914bb0ccac19e7e"}},{"ruleId":"D38","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":"235a6dd4895811fcd1407fd4377d79d8ea242623e99c854c9cf4f779e240f27f"}},{"ruleId":"D38","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":"51a392515e5a5ed80cab9b167606102c6365009dd22942e2deeab2423eb50814"}},{"ruleId":"D38","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":"e2d6bb762e8fb82965507942389078e63ff87e5f151d5a01136b9333a8da7123"}},{"ruleId":"D38","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":"6d1a7263e5084c71f067a29a886795a07dacdacde7e151d4805900dd5dd86719"}},{"ruleId":"D38","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":"5f9f85b450b5711c7cd28359a22afb1f230e15a9ac351649ef2d3f244c8a8b9c"}},{"ruleId":"D38","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":"3f4fb31af3faf11a115e3b658b4d70a6230b667ce6ee94f81226736bd1575d68"}},{"ruleId":"D38","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":"35bbf6d53e8fb866286cdf4f2e9c4e26a5a58387137bf0ddcfc969a9e3f94da1"}},{"ruleId":"D38","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":"669cd3daccbb974b7789b47dddb3f99959b06a003451e668d782825e397b6147"}},{"ruleId":"D38","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":"e97529fc1a9218948b5e4327b52e32525ac77d54a79131df5a25ee87fa462988"}},{"ruleId":"D38","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":"d0351a806462e827061a4e0a4b54b335b6d01480a1d6b70b978bf284bc30d1fe"}},{"ruleId":"D38","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":"17640752be6f9c4e9152312ac5212ed1580ca4643ed8da11dd08f4aadd120398"}},{"ruleId":"D38","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":"beec6fb4c52e19eaed82beb1c69324aed31ad3ec002ec21748fbab16215f0fa4"}},{"ruleId":"D38","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":"06e19e00af1dafd1a54839101f2b89437a3e9bbf82f0dbe2875d10df39e67340"}},{"ruleId":"D38","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":"d76e4e7826009ff34969d732921f04aede27ccbbc4465dc0ef0633bb09f2b6bf"}},{"ruleId":"D38","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":"f53531f7bcef1902ea86603de490aee14b43199883de7d44e72845b7a7f2f2c4"}},{"ruleId":"D38","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":"0f1fa1453325f3ec575f6adc5b8db94cb6cf94ea194b5b366bad087f9001ee20"}},{"ruleId":"D38","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":"00329b33093a2e62813be030766f14ddb5c30d9ae1f966f1147fad6e60232e03"}},{"ruleId":"D38","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":"8d2664d3d43bc762d5090b15ac9772c9142bef19543b1e09fa29826b09f291bf"}},{"ruleId":"D38","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":"0db33bc10ce2be04aa1b2f360812d2f83a2f889d22c260383245ac73597f3bde"}},{"ruleId":"D38","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":"62eefb86a4b4448f8637945f7beb68336331532cc265eb3f2b21e3b4ff85d258"}},{"ruleId":"D38","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":"a1bb36cf1250496af499fb16cda0af5deb3b3ba6d10fc564fc8f83f454cf8966"}},{"ruleId":"D38","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":"f5ede7107c043386c2aa35c3d4edfef1f1e133104a2d1063d97b702e54f6253e"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1032","guid":"5f21e517-68aa-a650-9a25-5771ef024637","name":"OWASP Top Ten \u2014 Security Misconfiguration category","shortDescription":{"text":"OWASP Top Ten \u2014 Security Misconfiguration category"},"helpUri":"https://cwe.mitre.org/data/definitions/1032.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-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-290","guid":"379b1e66-a292-7b59-aa1e-a5bb4a6a99e9","name":"CWE-290","shortDescription":{"text":"CWE-290"},"helpUri":"https://cwe.mitre.org/data/definitions/290.html"},{"id":"CWE-345","guid":"d80d4b65-bbbe-b65d-958e-7ac466af18f9","name":"CWE-345","shortDescription":{"text":"CWE-345"},"helpUri":"https://cwe.mitre.org/data/definitions/345.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-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":104,"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."]}]}