{"$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":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"]}},{"id":"D32","name":"Data Compliance (PII/GDPR)","shortDescription":{"text":"Data Compliance (PII/GDPR)"},"helpUri":"https://codehealth.canine.dev/dimensions/D32","relationships":[{"target":{"id":"CWE-359","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-312","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-200","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-359","CWE-312","CWE-200"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37","relationships":[{"target":{"id":"CWE-1059","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1059"]}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"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":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"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":"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":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R11","name":"Import Boundaries","shortDescription":{"text":"Import Boundaries"},"helpUri":"https://codehealth.canine.dev/dimensions/R11"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"S1","name":"Web-Security Posture","shortDescription":{"text":"Web-Security Posture"},"helpUri":"https://codehealth.canine.dev/dimensions/S1"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"linkSubscription (cyclomatic 131): linkSubscription has cyclomatic complexity 131 (threshold 15). Of this number, 124 points are the body\u0027s own statements and 7 belong to 11 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":1223}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b18c0de09624c3c72ac170f9123c3ac0e76a2d1f99e118e5edae9b0d1c1867"}},{"ruleId":"D1","level":"warning","message":{"text":"save-engine.createSaveEngine (cyclomatic 130): save-engine.createSaveEngine has cyclomatic complexity 130 (threshold 15). Of this number, 115 points are the body\u0027s own statements and 15 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":"apps/admin/src/editor/engine/save-engine.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a3b204865a69f631b253fc541c7adff113aca8186428ec7b7b35b0bf412a6c8"}},{"ruleId":"D1","level":"warning","message":{"text":"onSaving (cyclomatic 120): onSaving has cyclomatic complexity 120 (threshold 15). Of this number, 113 points are the body\u0027s own statements and 7 belong to 14 function items inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/post.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ff51287aa914c8f948b5e2978682c60115359121976a7e049f68014b3d841e"}},{"ruleId":"D1","level":"warning","message":{"text":"theme-code-editor-modal.ThemeCodeEditorModal (cyclomatic 113): theme-code-editor-modal.ThemeCodeEditorModal has cyclomatic complexity 113 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 89 belong to 19 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":"apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"207aa34fea092941922e731125d1a01dfc2374875b714b3dd6c3c5efce32cb15"}},{"ruleId":"D1","level":"warning","message":{"text":"feed-item.FeedItem (cyclomatic 109): feed-item.FeedItem has cyclomatic complexity 109 (threshold 15). Of this number, 76 points are the body\u0027s own statements and 33 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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce97ccc8c3b8ed89a6d23b85bdffc7cfdef9c774bb7812a3849729b0b4cd6dc4"}},{"ruleId":"D1","level":"warning","message":{"text":"api.setupGhostApi (cyclomatic 107): api.setupGhostApi has cyclomatic complexity 107 (threshold 15). Of this number, 72 points are the body\u0027s own statements and 35 belong to 29 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":"apps/portal/src/utils/api.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e221ff8ee12137f5962713dbb418a621ae7889da74e2ccde4f2c54a730020a"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-preview-content.NewsletterPreviewContent (cyclomatic 98): newsletter-preview-content.NewsletterPreviewContent has cyclomatic complexity 98 (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":"apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"37eda39cdb3b0636ae48f874089b8c59d1d48320525dbeca6d665432d1ba7fd7"}},{"ruleId":"D1","level":"warning","message":{"text":"reader.Reader (cyclomatic 92): reader.Reader has cyclomatic complexity 92 (threshold 15). Of this number, 47 points are the body\u0027s own statements and 45 belong to 16 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":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b1ce01655b27097c8c14f83e15c603d52870dfba88b2d2924f7dc6004ff1fc9"}},{"ruleId":"D1","level":"warning","message":{"text":"editor-session.createEditorSession (cyclomatic 92): editor-session.createEditorSession has cyclomatic complexity 92 (threshold 15). Of this number, 66 points are the body\u0027s own statements and 26 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":"apps/admin/src/editor/session/editor-session.ts"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04cca6e93adb575ff5746c20f031e31128ff6094052dd9ff0a1c1f285d7b8d4"}},{"ruleId":"D1","level":"warning","message":{"text":"tag-detail.TagDetail (cyclomatic 87): tag-detail.TagDetail has cyclomatic complexity 87 (threshold 15). Of this number, 47 points are the body\u0027s own statements and 40 belong to 13 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"73d7ed9ca5deb84158abc190813024da2308ab140ded972290ed125f40ffa088"}},{"ruleId":"D1","level":"warning","message":{"text":"notifications.Notifications (cyclomatic 86): notifications.Notifications has cyclomatic complexity 86 (threshold 15). Of this number, 44 points are the body\u0027s own statements and 42 belong to 7 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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"80779a669b48f670361e993b4d7579958441a0be42d7ce5c4e92e0a6b353f108"}},{"ruleId":"D1","level":"warning","message":{"text":"filters.Filters (cyclomatic 84): filters.Filters has cyclomatic complexity 84 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 56 belong to 18 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":2947}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e08218aa831f04294b8ef2d97b1fe28eefe42f6ab7c53c166c3a891f0fe5b6d"}},{"ruleId":"D1","level":"warning","message":{"text":"domain.Domain (cyclomatic 83): domain.Domain has cyclomatic complexity 83 (threshold 15). Of this number, 64 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":"apps/activitypub/src/views/preferences/components/domain.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"96a41cdfe04b650a88f7f025c30b61ae80e13ffb1b8863584e61d448848e2622"}},{"ruleId":"D1","level":"warning","message":{"text":"new-note-modal.NewNoteModal (cyclomatic 79): new-note-modal.NewNoteModal has cyclomatic complexity 79 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 50 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":"apps/activitypub/src/components/modals/new-note-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ce95074e88d7d717025e5dd3d86e5f88f245462171e49c2fa44d3b76897c9c"}},{"ruleId":"D1","level":"warning","message":{"text":"tier-detail-modal.TierDetailModalContent (cyclomatic 79): tier-detail-modal.TierDetailModalContent has cyclomatic complexity 79 (threshold 15). Of this number, 42 points are the body\u0027s own statements and 37 belong to 19 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":"apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbb706ab0bf33b011ceacb8b40b948710de7e0e94055b1a5038e76088263b60b"}},{"ruleId":"D1","level":"warning","message":{"text":"filters.FilterValueSelector (cyclomatic 79): filters.FilterValueSelector has cyclomatic complexity 79 (threshold 15). Of this number, 63 points are the body\u0027s own statements and 16 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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":2182}}}],"partialFingerprints":{"codehealthFindingId/v1":"9358c608a48161e31ec74857a56594b95b245022adabfe14ebd2b18955ca205f"}},{"ruleId":"D1","level":"warning","message":{"text":"post-preview-modal.PostPreviewModal (cyclomatic 77): post-preview-modal.PostPreviewModal has cyclomatic complexity 77 (threshold 15). Of this number, 56 points are the body\u0027s own statements and 21 belong to 11 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":"apps/admin/src/editor/preview/post-preview-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bd667e075a8820f9dff2d2eaa7a400d866e88a4566cbbbf7e704e01ff1d2d48"}},{"ruleId":"D1","level":"warning","message":{"text":"member-detail.MemberDetailPage (cyclomatic 75): member-detail.MemberDetailPage has cyclomatic complexity 75 (threshold 15). Of this number, 47 points are the body\u0027s own statements and 28 belong to 11 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":"apps/admin/src/members/detail/member-detail.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c7ea6d1aa2754330c633b4941c1670ecaddcd398ada5bb354c7c556088ad5f"}},{"ruleId":"D1","level":"warning","message":{"text":"editor.AutomationEditorContent (cyclomatic 74): editor.AutomationEditorContent has cyclomatic complexity 74 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 41 belong to 12 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":"apps/admin/src/automations/editor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a44aafc0b6ca57caf3a7c5044108649c164b48ab61c8246ed3887e1653e1462"}},{"ruleId":"D1","level":"warning","message":{"text":"gift-page.GiftPage (cyclomatic 73): gift-page.GiftPage has cyclomatic complexity 73 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 41 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":"apps/portal/src/components/pages/gift-page.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b546e93bea66bf133520441d6d4cf379ecfae6bbe635c6ee74cedc8d8688046"}},{"ruleId":"D1","level":"warning","message":{"text":"add-offer-modal.AddOfferModal (cyclomatic 72): add-offer-modal.AddOfferModal has cyclomatic complexity 72 (threshold 15). Most of this is not in the body itself: 10 of the 72 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 540, 748, 817, \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":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee1903f66a542a51c0aa81b27445e51640c5c3e19bf1160b97a84b8e54082de"}},{"ruleId":"D1","level":"warning","message":{"text":"global-settings.GlobalSettings (cyclomatic 69): global-settings.GlobalSettings has cyclomatic complexity 69 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 51 belong to 7 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":"apps/admin/src/settings/site/design-and-branding/global-settings.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aac2b18cb3ecde0d75926f43b83b134bd4e789a8971a362b36af66e50809db9"}},{"ruleId":"D1","level":"warning","message":{"text":"user-detail-modal.UserDetailModalContent (cyclomatic 69): user-detail-modal.UserDetailModalContent has cyclomatic complexity 69 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 32 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":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"e50db3943d1738c7fad6ce7e81204af3932dbe71ea1830da2503281f9dca8fa7"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter.Newsletter (cyclomatic 66): newsletter.Newsletter has cyclomatic complexity 66 (threshold 15). Of this number, 44 points are the body\u0027s own statements and 22 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":"apps/admin/src/posts/analytics/newsletter/newsletter.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ddf17c0958465a252d8b7569f896fe6a4a389a8f392c29f14e2bdbd0325c93"}},{"ruleId":"D1","level":"warning","message":{"text":"edit-retention-offer-modal.EditRetentionOfferModal (cyclomatic 66): edit-retention-offer-modal.EditRetentionOfferModal has cyclomatic complexity 66 (threshold 15). Most of this is not in the body itself: 9 of the 66 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 586, 675, 563, \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":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0ca2c94227e5489ea674970f7340dac7bc91347fc9bbe6ca5e9fe61cd066c33"}},{"ruleId":"D1","level":"warning","message":{"text":"change-tracker.createChangeTracker (cyclomatic 63): change-tracker.createChangeTracker has cyclomatic complexity 63 (threshold 15). Of this number, 62 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":"apps/admin/src/editor/engine/change-tracker.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ffc1643e67dec46dd23d29850eb47b7da8803d88c20b9e9778fef5803f2c88b"}},{"ruleId":"D1","level":"warning","message":{"text":"description.getDescription (cyclomatic 61): description.getDescription has cyclomatic complexity 61 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/description.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"721431fd1aff53956130d5eb261a3562dbde1a1fef9b514d93ed91e6061715c5"}},{"ruleId":"D1","level":"warning","message":{"text":"settings-modal.SettingsModal (cyclomatic 59): settings-modal.SettingsModal has cyclomatic complexity 59 (threshold 15). Of this number, 46 points are the body\u0027s own statements and 13 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":"apps/shade/src/components/patterns/settings-modal.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"22f00317117a73912214bd1d4fd95c7ecd8924d717263f94ba96104f299fbc6d"}},{"ruleId":"D1","level":"warning","message":{"text":"profile-page.ProfilePage (cyclomatic 58): profile-page.ProfilePage has cyclomatic complexity 58 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 13 belong to 9 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":"apps/activitypub/src/views/profile/components/profile-page.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"db9749d6f1a0329cbf6bfc1b6f1cfa4cfee5184e601bfdd855b6ba01130444d1"}},{"ruleId":"D1","level":"warning","message":{"text":"profile.ProfileCard (cyclomatic 57): profile.ProfileCard has cyclomatic complexity 57 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 12 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":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc25ce6e81cea92a5393d9006ffdac92fe1f8590b8bdb441f1f0f303d1d4da1"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletters-kpis.NewsletterKPIs (cyclomatic 57): newsletters-kpis.NewsletterKPIs has cyclomatic complexity 57 (threshold 15). Of this number, 38 points are the body\u0027s own statements and 19 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":"apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1fcefbb4811c0c6bcd04773f8f3449d2fb8fe988a7540135da1fff7d9c05f4"}},{"ruleId":"D1","level":"warning","message":{"text":"publish-options.createPublishOptions (cyclomatic 57): publish-options.createPublishOptions has cyclomatic complexity 57 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 34 belong to 8 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-options.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9fb9d89150689dab7d223ea14640d9cdb40407ed186743e2b2f1c6a15bfa3fb"}},{"ruleId":"D1","level":"warning","message":{"text":"import-members-modal.ImportMembersModal (cyclomatic 55): import-members-modal.ImportMembersModal has cyclomatic complexity 55 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 39 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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d0638736472c85d26cd305de86380fbf1789fbe7850a6b3bd6e8471c0130885"}},{"ruleId":"D1","level":"warning","message":{"text":"update (cyclomatic 55): update has cyclomatic complexity 55 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"d42c80534d1680d2ff937e89c58ffcdbaa6a1bf0404937733db997363e3dc497"}},{"ruleId":"D1","level":"warning","message":{"text":"mapping-step.MappingStep (cyclomatic 54): mapping-step.MappingStep has cyclomatic complexity 54 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 37 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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0d1eeb19fc2434af97b2642beed8bde898a82a3d723f5f70602579dd416814d"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-detail-modal.Sidebar (cyclomatic 53): newsletter-detail-modal.Sidebar has cyclomatic complexity 53 (threshold 15). Of this number, 28 points are the body\u0027s own statements and 25 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":"apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"49122cb58780edde8870097bdb578340657798c65915a4a6851cdc49826de9e0"}},{"ruleId":"D1","level":"warning","message":{"text":"authors.extendModel (cyclomatic 53): authors.extendModel has cyclomatic complexity 53 (threshold 15). Most of this is not in the body itself: 1 of the 53 points is its own statement and the rest belongs to 13 function literals inside it that branch (lines 340, 141, 40, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/relations/authors.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a848e0c0e033ad6e4287f2d701fedb4ae9b7b830818bab7a7caa759c052d735"}},{"ruleId":"D1","level":"warning","message":{"text":"service.createLlmsService (cyclomatic 53): service.createLlmsService has cyclomatic complexity 53 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/llms/service.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c37a444766c18a714541d375e0f608922b8570bd766eafced33aedc2a7d36f4"}},{"ruleId":"D1","level":"warning","message":{"text":"slug-machine.createSlugMachine (cyclomatic 52): slug-machine.createSlugMachine has cyclomatic complexity 52 (threshold 15). Most of this is not in the body itself: 9 of the 52 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 358, 263, 297, \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":"apps/admin/src/editor/engine/slug-machine.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"610e384311650c051be023009ca8c41e580240e9cd173efc43010f02e5a29ae0"}},{"ruleId":"D1","level":"warning","message":{"text":"posts.default (cyclomatic 52): posts.default has cyclomatic complexity 52 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 15 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ce3a80613d8bee41d4a23fb5d4cb57c1e137e88de1a7c80e44bab2118fb09b"}},{"ruleId":"D1","level":"warning","message":{"text":"ghost_head (cyclomatic 52): ghost_head has cyclomatic complexity 52 (threshold 15). Of this number, 51 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/ghost_head.js"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"44466bcf2e5a073f8e8968c8f974260892a0ad8c8578c493f134ae87fef109e4"}},{"ruleId":"D1","level":"warning","message":{"text":"import-members-modal.ImportMembersModal (cyclomatic 51): import-members-modal.ImportMembersModal has cyclomatic complexity 51 (threshold 15). Most of this is not in the body itself: 12 of the 51 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 217, 108, 195, \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":"apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"013babffa387fce2848933393f270b50da55bf94cc7d7ecd7478e6aba73ee9b2"}},{"ruleId":"D1","level":"warning","message":{"text":"overview.Overview (cyclomatic 50): overview.Overview has cyclomatic complexity 50 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 11 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":"apps/admin/src/posts/analytics/overview/overview.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1fdb6922e52c5650a0c979c774fe87af352dcacaa7dca07d27e72ff83a99a9"}},{"ruleId":"D1","level":"warning","message":{"text":"use-publish-flow.usePublishFlow (cyclomatic 50): use-publish-flow.usePublishFlow has cyclomatic complexity 50 (threshold 15). Most of this is not in the body itself: 1 of the 50 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 385, 483, 228, \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":"apps/admin/src/editor/publish/use-publish-flow.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd20dbf8e5a60bdefca7b49c92918a818f6ad825a6d9f8f1c495f9d203eb0d80"}},{"ruleId":"D1","level":"warning","message":{"text":"App.fetchQueryStrData (cyclomatic 50): App.fetchQueryStrData has cyclomatic complexity 50 (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":"apps/portal/src/app.jsx"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39d934be857d486b6d93bfd7988e98a13afa0213ccadcbfdaac8a897205a560"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-preview.NewsletterPreview (cyclomatic 49): newsletter-preview.NewsletterPreview has cyclomatic complexity 49 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 23 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":"apps/admin/src/settings/email/newsletters/newsletter-preview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d21b1abd2845099a02b1f302a5506125c3132c1df42ea1d37ad7cfd7a90fef"}},{"ruleId":"D1","level":"warning","message":{"text":"session-service.createSessionService (cyclomatic 49): session-service.createSessionService has cyclomatic complexity 49 (threshold 15). Of this number, 47 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/auth/session/session-service.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c419204fc1d47f4d252c1a4d5eaf2ae08d7d2556b3311e9814efcfbb59eb562c"}},{"ruleId":"D1","level":"warning","message":{"text":"member-activity.ActivityPage (cyclomatic 48): member-activity.ActivityPage has cyclomatic complexity 48 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 12 belong to 6 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/member-activity.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ed6ac6e5f53c3be3689e32d3c36ab0383921eeb0251ae0414616ca69180eb85"}},{"ruleId":"D1","level":"warning","message":{"text":"App.fetchLinkData (cyclomatic 48): App.fetchLinkData has cyclomatic complexity 48 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc76aea11c8717cd7136ed41fcdde8e0c169385c31c9939911a96dc6da759b64"}},{"ruleId":"D1","level":"warning","message":{"text":"permissible (cyclomatic 48): permissible has cyclomatic complexity 48 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 12 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9da5a4742ba02df24e9a20b17b0e09132a082751cfc9b8e628e2a0cd67d2386"}},{"ruleId":"D1","level":"warning","message":{"text":"reader.ArticleBody (cyclomatic 47): reader.ArticleBody has cyclomatic complexity 47 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 24 belong to 12 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"00a006fd1e26087dc05c6895f0238525f2a31704d39abbc85f47d29d084cead5"}},{"ruleId":"D1","level":"warning","message":{"text":"member-event.getAction (cyclomatic 47): member-event.getAction has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ad44f8328eaac7aaaf0c269e94d7d48e17ce3265a42a3ccf20c056f7fec65c2"}},{"ruleId":"D1","level":"warning","message":{"text":"edit-profile.EditProfile (cyclomatic 45): edit-profile.EditProfile has cyclomatic complexity 45 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 22 belong to 6 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce666db69ed9367c586e1571e192ce134b21054bb8598634916e44e9c87452a"}},{"ruleId":"D1","level":"warning","message":{"text":"automation-canvas.AutomationCanvas (cyclomatic 45): automation-canvas.AutomationCanvas has cyclomatic complexity 45 (threshold 15). Most of this is not in the body itself: 14 of the 45 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 639, 421, 470, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/canvas/automation-canvas.tsx"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"bec9f883804ca78fabcdd615f02dfeda1d9aead3506c0209d90542d0488c77e7"}},{"ruleId":"D1","level":"warning","message":{"text":"search.Search (cyclomatic 44): search.Search has cyclomatic complexity 44 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 26 belong to 6 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/modals/search.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"28bb830ff43c056fbdc9ae7195b6787332b2e7408dc1946eb77f74ab8b85ab52"}},{"ruleId":"D1","level":"warning","message":{"text":"source-utils.processSources (cyclomatic 44): source-utils.processSources has cyclomatic complexity 44 (threshold 15). Most of this is not in the body itself: 14 of the 44 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 307, 390). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/source-utils.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb6e4eff5c168ab242894d0a456c81b76f648dfb0aaa123e6dda5305ef7a535"}},{"ruleId":"D1","level":"warning","message":{"text":"post-editor.PostEditor (cyclomatic 44): post-editor.PostEditor has cyclomatic complexity 44 (threshold 15). Most of this is not in the body itself: 7 of the 44 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 170, 199, 158, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/post-editor.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ead7356d2cc01326d39516e54346b163285f8515377e02c4b708cb599ee1cc82"}},{"ruleId":"D1","level":"warning","message":{"text":"chip-picker.ChipPicker (cyclomatic 44): chip-picker.ChipPicker has cyclomatic complexity 44 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 28 belong to 9 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":"apps/admin/src/shared/pickers/chip-picker.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa706baa5f94624320b96db361d0679fddae1ed6cf6a7e46a1f5db2b317e559b"}},{"ruleId":"D1","level":"warning","message":{"text":"note.Note (cyclomatic 43): note.Note has cyclomatic complexity 43 (threshold 15). Most of this is not in the body itself: 13 of the 43 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 287, 65, 55, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/note.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"da647a240571db44e2ad0ede057021af8faaa6cddd9c7a19b26d461c8c9a5a92"}},{"ruleId":"D1","level":"warning","message":{"text":"sidebar.Sidebar (cyclomatic 43): sidebar.Sidebar has cyclomatic complexity 43 (threshold 15). Most of this is not in the body itself: 15 of the 43 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 172, 133, 145, \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":"apps/admin/src/settings/layout/sidebar.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"514125e96899aec3129a446a0610deadac9d2583abaa9528ca597e4efe3b3568"}},{"ruleId":"D1","level":"warning","message":{"text":"post-analytics-header.PostAnalyticsHeader (cyclomatic 43): post-analytics-header.PostAnalyticsHeader has cyclomatic complexity 43 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 12 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/components/post-analytics-header.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bd7eabae72cdb99ece8106b03af68e5c59061d0aa552b0a44a0a9c7e61e3794"}},{"ruleId":"D1","level":"warning","message":{"text":"ParseMemberEventHelper.getAction (cyclomatic 43): ParseMemberEventHelper.getAction has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f8df54f5afa6f0f3a01c5d4afacd9c7c9cf5a9b68c109672e0afbc12f756b4"}},{"ruleId":"D1","level":"warning","message":{"text":"paid-subscription-change-chart.PaidMembersChangeChart (cyclomatic 42): paid-subscription-change-chart.PaidMembersChangeChart has cyclomatic complexity 42 (threshold 15). Most of this is not in the body itself: 6 of the 42 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 217, 465, 200, \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":"apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"a006223caa53aa30934a93e02a633cee4589d384d5ccddfa71f7b368fe9a743a"}},{"ruleId":"D1","level":"warning","message":{"text":"update-flow-modal.KeyedUpdateFlowModal (cyclomatic 42): update-flow-modal.KeyedUpdateFlowModal has cyclomatic complexity 42 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/update-flow-modal.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"28231bcdc18bc92e003e463a744b5309f81d1745df6e67edbd0500c96a449556"}},{"ruleId":"D1","level":"warning","message":{"text":"comments.commentMapper (cyclomatic 42): comments.commentMapper 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e455215064d147b947a30d1f23004f447ab4a7dea78baba200f2b783f4daac3b"}},{"ruleId":"D1","level":"warning","message":{"text":"#mapPosts (cyclomatic 42): #mapPosts has cyclomatic complexity 42 (threshold 15). Most of this is not in the body itself: 14 of the 42 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 205, 229, 238, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/posts/posts-exporter.js"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"88f0d99bcadb80aa5440bdb8ea75c057b2833c44202301b57e6e93cf424d5a1d"}},{"ruleId":"D1","level":"warning","message":{"text":"latest-post.LatestPost (cyclomatic 41): latest-post.LatestPost has cyclomatic complexity 41 (threshold 15). Of this number, 38 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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"370dec28dd715ff82c2f3cde583b7eb7eef302d5840e334acc918e145e680c49"}},{"ruleId":"D1","level":"warning","message":{"text":"email-content-modal.EmailContentModal (cyclomatic 41): email-content-modal.EmailContentModal has cyclomatic complexity 41 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 21 belong to 12 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/email-modal/email-content-modal.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"666d2eca4b991a514499b5998e65d384fcdbcaa2f4dad5474bb7b1824923337f"}},{"ruleId":"D1","level":"warning","message":{"text":"profile.Profile (cyclomatic 40): profile.Profile has cyclomatic complexity 40 (threshold 15). Most of this is not in the body itself: 13 of the 40 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 255, 315, 289, \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":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"1274e1b9943726cf2fdc19f82fe1dfb1f1f27aed76ccc38d6704803c85219550"}},{"ruleId":"D1","level":"warning","message":{"text":"custom-field-modal.CustomFieldModal (cyclomatic 40): custom-field-modal.CustomFieldModal has cyclomatic complexity 40 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 13 belong to 9 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":"apps/admin/src/settings/membership/custom-fields/custom-field-modal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"044ad0eafe27323249602433a6744800d27a2e84c89db2b81eda5fbdcfcf7056"}},{"ruleId":"D1","level":"warning","message":{"text":"MembersCSVImporter.writeRows (cyclomatic 40): MembersCSVImporter.writeRows has cyclomatic complexity 40 (threshold 15). Of this number, 37 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":"ghost/core/core/server/services/members/import-export/import/importer.ts"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d11eba40751776a52b160ead62b5032c60bd6a551dca0699b77da7a3070c03"}},{"ruleId":"D1","level":"warning","message":{"text":"ProductRepository.update (cyclomatic 40): ProductRepository.update has cyclomatic complexity 40 (threshold 15). Of this number, 39 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"03e63c954cc1fba4935090f4b78a95f174f15a2b44920d7a607f1d16454c7fee"}},{"ruleId":"D1","level":"warning","message":{"text":"title.getTitle (cyclomatic 40): title.getTitle has cyclomatic complexity 40 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/title.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ecf05af3a2db492c72eea87ca5a309b21ea165114ac48593aaf2ecad6e6f4f3"}},{"ruleId":"D1","level":"warning","message":{"text":"create (cyclomatic 40): create has cyclomatic complexity 40 (threshold 15). Of this number, 39 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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b65408b2dcd6b0386679ed1ca8327a0d2fe90d6d5bc2864acfe9b07d2e3e395"}},{"ruleId":"D1","level":"warning","message":{"text":"feed-item.renderFeedAttachment (cyclomatic 39): feed-item.renderFeedAttachment has cyclomatic complexity 39 (threshold 15). Of this number, 30 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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc08e801d0d8d1f4220a35882a807e731857986d98e472b0f21218c6320a72da"}},{"ruleId":"D1","level":"warning","message":{"text":"growth.Growth (cyclomatic 39): growth.Growth has cyclomatic complexity 39 (threshold 15). Most of this is not in the body itself: 14 of the 39 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 313, 156, 119, \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":"apps/admin/src/analytics/views/stats/growth/growth.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad49d9d4f61d87dca7fbc64ee7b527735eca8f39c96028a534ae75dc49468ef0"}},{"ruleId":"D1","level":"warning","message":{"text":"LexicalEditorController.saveTask (cyclomatic 39): LexicalEditorController.saveTask 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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ebcf1157ac7956a09db5ecf0c3043c75a9915314ffee4bd5a01dd399af58253"}},{"ruleId":"D1","level":"warning","message":{"text":"filters.ResolvedSelectOptionsPopover (cyclomatic 39): filters.ResolvedSelectOptionsPopover has cyclomatic complexity 39 (threshold 15). Most of this is not in the body itself: 13 of the 39 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 1947, 2068, 1931, \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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"57954cde9192503aa07dfa91152164e051b29a00cb679fbfb9bb290b30ff4438"}},{"ruleId":"D1","level":"warning","message":{"text":"reactAppConfig (cyclomatic 39): reactAppConfig has cyclomatic complexity 39 (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":"configs/eslint-react/index.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"39decb8a587af10f6d74526193dee13308c06d2d0bfec1f5f3ebd8570906259d"}},{"ruleId":"D1","level":"warning","message":{"text":"profile-preview-hover-card.ProfilePreviewHoverCard (cyclomatic 38): profile-preview-hover-card.ProfilePreviewHoverCard has cyclomatic complexity 38 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/global/profile-preview-hover-card.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ff8ee84d5a756c6aa17763ebd0e710999d345da575b73f9f6dc3f9acf535d5"}},{"ruleId":"D1","level":"warning","message":{"text":"web.Web (cyclomatic 38): web.Web has cyclomatic complexity 38 (threshold 15). Most of this is not in the body itself: 14 of the 38 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 105, 157, 68, \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":"apps/admin/src/posts/analytics/web/web.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b14bfcd708202f1dac26518abb12a090da54a33335474b3befc1fce23b5ced"}},{"ruleId":"D1","level":"warning","message":{"text":"members.MembersPage (cyclomatic 38): members.MembersPage has cyclomatic complexity 38 (threshold 15). Of this number, 35 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":"apps/admin/src/members/members.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5073d0d8036d23987e5fc5201285ac04a854bbf221d0bc63e116aa86e5e657e"}},{"ruleId":"D1","level":"warning","message":{"text":"welcome-email-customize-modal.WelcomeEmailCustomizeModal (cyclomatic 38): welcome-email-customize-modal.WelcomeEmailCustomizeModal has cyclomatic complexity 38 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 19 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":"apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.tsx"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"28486e8fe13f569877c3e9da318124cd0b56aba46a9de5874ca58e770eb8f578"}},{"ruleId":"D1","level":"warning","message":{"text":"app.App (cyclomatic 38): app.App has cyclomatic complexity 38 (threshold 15). Most of this is not in the body itself: 3 of the 38 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 312, 155, 249, \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":"apps/comments-ui/src/app.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fce1696848b9621ae566e0df36289fa2cbba03da3546d902cafc5b9b4e346b7"}},{"ruleId":"D1","level":"warning","message":{"text":"notification.NotificationText (cyclomatic 38): notification.NotificationText 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":"apps/portal/src/components/notification.jsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc582e970b5f8a7ea5174f18e75f6ba5ea412cb7e2db2ecbd25ea9e56dfe2f50"}},{"ruleId":"D1","level":"warning","message":{"text":"email-sending-status-provider.EmailSendingStatusProvider (cyclomatic 37): email-sending-status-provider.EmailSendingStatusProvider has cyclomatic complexity 37 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 10 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/email-sending-status/email-sending-status-provider.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"df14be76d90224ed516bb2153babf1cbd799818f2674a5a84f796576487e68be"}},{"ruleId":"D1","level":"warning","message":{"text":"getTemplateData (cyclomatic 37): getTemplateData 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":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6e8bfa9a92ababb995d74ed472cdfdc90760b33ffe686b699f8eb0da670afd"}},{"ruleId":"D1","level":"warning","message":{"text":"change-password-form.ChangePasswordForm (cyclomatic 36): change-password-form.ChangePasswordForm has cyclomatic complexity 36 (threshold 15). Most of this is not in the body itself: 14 of the 36 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 73, 167, 142, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/users/change-password-form.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcb581c648f54e6ccfb260c892799dd7043fcd5bb7f977998860c19f21406239"}},{"ruleId":"D1","level":"warning","message":{"text":"add-offer-modal.Sidebar (cyclomatic 36): add-offer-modal.Sidebar 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, 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":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"7619f0ae217a7396b89e1281907b88913b004a48cde6bd53481e6d9573490acc"}},{"ruleId":"D1","level":"warning","message":{"text":"access.Access (cyclomatic 36): access.Access has cyclomatic complexity 36 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/access.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fa5942f13afbb4cb17fb3e7a08f56176736ff776c218a27d8c02bca7e48bf9e"}},{"ruleId":"D1","level":"warning","message":{"text":"api.setupGhostApi (cyclomatic 36): api.setupGhostApi has cyclomatic complexity 36 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 18 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":"apps/comments-ui/src/utils/api.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d726411452526644b985459dea1ad6bc223d90e4ddf9dfbe96c1b86e5394232"}},{"ruleId":"D1","level":"warning","message":{"text":"PopupContent.render (cyclomatic 36): PopupContent.render has cyclomatic complexity 36 (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":"apps/portal/src/components/popup-modal.jsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"05c46a117924ba8f3718e0b07f1ae3c3e812ced213d5e627499cab346ef90e61"}},{"ruleId":"D1","level":"warning","message":{"text":"foreach.foreach (cyclomatic 36): foreach.foreach has cyclomatic complexity 36 (threshold 15). 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: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/foreach.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe2053f94db1fcd7ef3bfa9823702eae4e90dd3b11a1624d5e8708da77c1d69"}},{"ruleId":"D1","level":"warning","message":{"text":"design-and-theme-modal.DesignAndThemeModal (cyclomatic 35): design-and-theme-modal.DesignAndThemeModal has cyclomatic complexity 35 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 18 belong to 7 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/design-and-theme-modal.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f38aaa5f9579c25458aa5f5a859224eb3beb0a0aa3ea6c915e010510cef69c5"}},{"ruleId":"D1","level":"warning","message":{"text":"signup-options.SignupOptions (cyclomatic 35): signup-options.SignupOptions has cyclomatic complexity 35 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 17 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":"apps/admin/src/settings/membership/portal/signup-options.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9afae55c2ee62f365e3d2f8e72c46a6fe89763b18c7a8c0726f800bd8f84216d"}},{"ruleId":"D1","level":"warning","message":{"text":"tiers.Tiers (cyclomatic 35): tiers.Tiers has cyclomatic complexity 35 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 9 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6727c2281494a3220cefc4a5b96f41a29775430f2340d7676cb6c45db4e16e9"}},{"ruleId":"D1","level":"warning","message":{"text":"locale-validation.validateLocale (cyclomatic 35): locale-validation.validateLocale 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":"apps/admin/src/settings/utils/locale-validation.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"504f755d1d6256e80cff60f04ae7d1a6a2431767803bb44ea963132b99d8dfe2"}},{"ruleId":"D1","level":"warning","message":{"text":"gift-redemption-page.GiftRedemptionPage (cyclomatic 35): gift-redemption-page.GiftRedemptionPage has cyclomatic complexity 35 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 12 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-redemption-page.jsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"209bd260164498b4bf856542c09b76c8a9fd061f2424617fb5f076e8601ed892"}},{"ruleId":"D1","level":"warning","message":{"text":"PostsStatsService.getTopPostsViews (cyclomatic 35): PostsStatsService.getTopPostsViews has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 15 of the 35 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 1450, 1341, 1318, \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":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":1256}}}],"partialFingerprints":{"codehealthFindingId/v1":"180d6745da61df08f1ec65c5d4ce4eb378ebe66ba2e8d1336b2f32531e31efbf"}},{"ruleId":"D1","level":"warning","message":{"text":"unblock-dialog.UnblockDialog (cyclomatic 34): unblock-dialog.UnblockDialog has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 5 of the 34 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 43, 69, 152, \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":"apps/activitypub/src/views/profile/components/unblock-dialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd47846cde798261eef5036b385340af08de89f0be32265d2d0b24721fc2cb9c"}},{"ruleId":"D1","level":"warning","message":{"text":"locations-card.LocationsCard (cyclomatic 34): locations-card.LocationsCard has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 6 of the 34 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 298, 110, 152, \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":"apps/admin/src/analytics/views/stats/locations/components/locations-card.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"64105d8e5a5c2b8f315d0b33d2ccb7c6fc2951b1eb31d4a722e3be2a6709d73e"}},{"ruleId":"D1","level":"warning","message":{"text":"top-level-group.TopLevelGroup (cyclomatic 34): top-level-group.TopLevelGroup has cyclomatic complexity 34 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 9 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":"apps/admin/src/settings/components/top-level-group.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c50ee85270a74a8c4fbaecf8ff49937b3fca727e318448d00537bb04aac7b506"}},{"ruleId":"D1","level":"warning","message":{"text":"unsubscribe-page.UnsubscribePage (cyclomatic 34): unsubscribe-page.UnsubscribePage 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 6 function literals inside it that branch (lines 200, 316, 105, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/unsubscribe-page.jsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"073265acac8b74d4e416c0a15aa60b9f23b104845cb05b070263e5448a5c1fcf"}},{"ruleId":"D1","level":"warning","message":{"text":"posts-list-screen.PostsListScreen (cyclomatic 33): posts-list-screen.PostsListScreen has cyclomatic complexity 33 (threshold 15). Of this number, 30 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":"apps/admin/src/posts/list/posts-list-screen.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2246b5fa07d504167574d664aa269abaede5f0ccca93a23eb4169ae664430ec0"}},{"ruleId":"D1","level":"warning","message":{"text":"edit-retention-offer-modal.RetentionOfferSidebar (cyclomatic 33): edit-retention-offer-modal.RetentionOfferSidebar has cyclomatic complexity 33 (threshold 15). Of this number, 30 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":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e889b065f98c53e824e6eacf595fb415ccd247bdf6d745c3d9380364ae8cb6b"}},{"ruleId":"D1","level":"warning","message":{"text":"check-internal-packages.validateCompliantPackage (cyclomatic 33): check-internal-packages.validateCompliantPackage has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-internal-packages.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d57159b9450e1a5af7dbffb5874efdd25e9aac626612979a93637c16dd4a00d"}},{"ruleId":"D1","level":"warning","message":{"text":"use-post-selection.usePostSelection (cyclomatic 32): use-post-selection.usePostSelection has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 2 of the 32 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 86, 181, 212, \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":"apps/admin/src/posts/list/hooks/use-post-selection.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"489549217fe4fd772375e25deb1a68e216e3f4092a94e43d3e2f77a3e6b6e464"}},{"ruleId":"D1","level":"warning","message":{"text":"use-editor-session.useEditorSession (cyclomatic 32): use-editor-session.useEditorSession has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 4 of the 32 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 323, 311, 378, \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":"apps/admin/src/editor/session/use-editor-session.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"645e0446a2025bc59a7dc1ff0ba10f470ed0322d07866d1ba1ccd7232d50eb4f"}},{"ruleId":"D1","level":"warning","message":{"text":"actions.default (cyclomatic 32): actions.default has cyclomatic complexity 32 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/actions.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f1569b4a238d3685de591a365fb68e8daf072f6b5c7ae148a1d07d973504ea"}},{"ruleId":"D1","level":"warning","message":{"text":"growth-kpis.GrowthKPIs (cyclomatic 31): growth-kpis.GrowthKPIs has cyclomatic complexity 31 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 10 belong to 3 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/growth-kpis.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"103ee6e4a33d05592cf38108632755d9e21e3ff0fc49287dce76de6843ca0fd6"}},{"ruleId":"D1","level":"warning","message":{"text":"use-post-bulk-actions.usePostBulkActions (cyclomatic 31): use-post-bulk-actions.usePostBulkActions has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 2 of the 31 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 295, 368, 192, \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":"apps/admin/src/posts/list/hooks/use-post-bulk-actions.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab886940937b15dae66bc74cea8b7288c6310c1c880e8519283477fb9fd8543"}},{"ruleId":"D1","level":"warning","message":{"text":"invite-user-modal.InviteUserModal (cyclomatic 31): invite-user-modal.InviteUserModal has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 15 of the 31 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 96, 60, 209, \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":"apps/admin/src/settings/general/invite-user-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f57ef7b3992fbf11a24684237b811da11312fac9b86c65f3b7f14cc2d9c178"}},{"ruleId":"D1","level":"warning","message":{"text":"tier-detail-preview.TierDetailPreview (cyclomatic 31): tier-detail-preview.TierDetailPreview has cyclomatic complexity 31 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers/tier-detail-preview.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1cc37a8fe0eb89ed8b5b1df4c358ed77d5749d4bd4eed3c9f3fb6449195ae7e"}},{"ruleId":"D1","level":"warning","message":{"text":"get-portal-preview-url.getPortalPreviewUrl (cyclomatic 31): get-portal-preview-url.getPortalPreviewUrl has cyclomatic complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, 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":"apps/admin/src/settings/utils/get-portal-preview-url.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c78f6b20db871c16acda20c409355a8e903a5ee034b486b9345f08d7078b4522"}},{"ruleId":"D1","level":"warning","message":{"text":"paid-account-actions.PaidAccountActions (cyclomatic 31): paid-account-actions.PaidAccountActions has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 8 of the 31 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 38, 109, 183, \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":"apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"44758d7ebaf1ceb7a7aaceab94845475f8eb9718737d32b5d434670f867001d4"}},{"ruleId":"D1","level":"warning","message":{"text":"chart.ChartTooltipContent (cyclomatic 31): chart.ChartTooltipContent has cyclomatic complexity 31 (threshold 15). 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 170, 128). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/chart.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4eb470c72aa7a53a0241851c56e844159e80c10f2b204113f4fdcf33d5e263e"}},{"ruleId":"D1","level":"warning","message":{"text":"EmailRenderer.renderBody (cyclomatic 31): EmailRenderer.renderBody has cyclomatic complexity 31 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 11 belong to 5 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24dfde5e8ae788b7f10c2889546ef6481bfe3d2fd4bb386d42f3ee2c0d895ed"}},{"ruleId":"D1","level":"warning","message":{"text":"tier-checkout-collection.TierCheckoutCollection (cyclomatic 30): tier-checkout-collection.TierCheckoutCollection has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 12 of the 30 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 381, 320, 326, \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":"apps/admin/src/settings/membership/tiers/tier-checkout-collection.tsx"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0a04299d81c02844944bbc7e907343432ed2f70e4c97abc63297e2d91f7e9be"}},{"ruleId":"D1","level":"warning","message":{"text":"publication-language.PublicationLanguage (cyclomatic 30): publication-language.PublicationLanguage has cyclomatic complexity 30 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 14 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":"apps/admin/src/settings/general/publication-language.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f5f1dffc2699ef78b4abc07f10d120dfe28762be4cc80a912f948c7e356ffdd"}},{"ruleId":"D1","level":"warning","message":{"text":"multi-select-combobox.MultiSelectCombobox (cyclomatic 30): multi-select-combobox.MultiSelectCombobox has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 14 of the 30 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 262, 290, 225, \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":"apps/shade/src/components/ui/multi-select-combobox.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aba001af5786db9d921a214135590bf8dd979f21288bf74091a7f3a27f5c638"}},{"ruleId":"D1","level":"warning","message":{"text":"UnsplashSearchModal.UnsplashSearchModal (cyclomatic 30): UnsplashSearchModal.UnsplashSearchModal has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 3 of the 30 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 83, 110, 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":"koenig/kg-unsplash-selector/src/UnsplashSearchModal.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e87893cb279ccaa3be8f38d397e5b5754e3217049a55856d1035598bf13dfca"}},{"ruleId":"D1","level":"warning","message":{"text":"use-activity-pub-queries.useDeleteMutationForUser (cyclomatic 29): use-activity-pub-queries.useDeleteMutationForUser has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 1 of the 29 points is its own statement and the rest belongs to 16 function literals inside it that branch (lines 2175, 2494, 2428, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"585bddbe4f5b2eeb8ac07551f6353ce6ed6abe974238540fc324ab3bc22ee8cd"}},{"ruleId":"D1","level":"warning","message":{"text":"use-post-newsletter-stats.usePostNewsletterStats (cyclomatic 29): use-post-newsletter-stats.usePostNewsletterStats has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 9 of the 29 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 40, 64, 159, \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":"apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e60e72fc19bad38db55bf78a5cba1022c5ef1b4e88223a220e2eff2bf37283d"}},{"ruleId":"D1","level":"warning","message":{"text":"App.fetchOfferQueryStrData (cyclomatic 29): App.fetchOfferQueryStrData has cyclomatic complexity 29 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f16efdb1a7d29b99d153eef21198e8b848d1068726a49228453113eafee093c"}},{"ruleId":"D1","level":"warning","message":{"text":"clean.post (cyclomatic 29): clean.post 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/utils/clean.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"43508f4293616e917966f8926b7a2cb9672d08e2518a9722959b7331747b02fa"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsImporter.beforeImport (cyclomatic 29): SettingsImporter.beforeImport has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 12 of the 29 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 226, 169, 147, \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":"ghost/core/core/server/data/importer/importers/data/settings-importer.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c441ccb77135bab9b95e1e4d1d338951b1083b68d6106b751a18a17de0ae95d8"}},{"ruleId":"D1","level":"warning","message":{"text":"handleSubscriptionEvent (cyclomatic 29): handleSubscriptionEvent 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":"ghost/core/core/server/services/stripe/services/webhook/checkout-session-event-service.js"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dbaa2209d72171822605ab3bb76e520984537a68d892adcb841823452f639df"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletters.Newsletters (cyclomatic 28): newsletters.Newsletters has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 12 of the 28 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 342, 368, 334, \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":"apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c90698812ac90ebc483eaf2381406094d08557b3b240101409d089e4b06b86c"}},{"ruleId":"D1","level":"warning","message":{"text":"post-list-row.PostListRowComponent (cyclomatic 28): post-list-row.PostListRowComponent has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/components/post-list-row.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3a4528736967f8952121f4cf185a63074394268fdd96c4147f479d14dccce9"}},{"ruleId":"D1","level":"warning","message":{"text":"members-actions.MembersActions (cyclomatic 28): members-actions.MembersActions has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 13 of the 28 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 136, 86, 111, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/members-actions.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8c3aad9869095e9701514f75172e9cf195fabb17c1cdc2dcf35825c4ae5352b"}},{"ruleId":"D1","level":"warning","message":{"text":"member-event.getIcon (cyclomatic 28): member-event.getIcon has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd099d717e618eec112e1154bc6a6d7483b6c8324a0f24fdb913a286f9a96c8"}},{"ruleId":"D1","level":"warning","message":{"text":"activity-email-preview.ActivityEmailPreview (cyclomatic 28): activity-email-preview.ActivityEmailPreview has cyclomatic complexity 28 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 7 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/activity-email-preview.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb22fcbed8606af2e46a8688584586af8927f841a2e42ad3511f433bcda5ba77"}},{"ruleId":"D1","level":"warning","message":{"text":"universal-import-modal.UniversalImportModal (cyclomatic 28): universal-import-modal.UniversalImportModal has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 13 of the 28 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 52, 108, 37, \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":"apps/admin/src/settings/advanced/migration-tools/universal-import-modal.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a28fc9e30121589cc30441fdaffe5a44cd415496bbc2d34f2c25acba93ff78a"}},{"ruleId":"D1","level":"warning","message":{"text":"welcome-email-modal.WelcomeEmailModal (cyclomatic 28): welcome-email-modal.WelcomeEmailModal has cyclomatic complexity 28 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2b38e461111ce1e170ed9e37bc383fcb6ad72765ac3fba9e8e9d57d54cd3f3"}},{"ruleId":"D1","level":"warning","message":{"text":"ParseMemberEventHelper.getIcon (cyclomatic 28): ParseMemberEventHelper.getIcon has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"93cb0844819631f1a4263a4fe614b6d5ab84e9fb65a10c078ff4a4abb824c326"}},{"ruleId":"D1","level":"warning","message":{"text":"date-picker.DatePicker (cyclomatic 28): date-picker.DatePicker has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 11 of the 28 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 346, 383, 392, \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":"apps/portal/src/components/common/date-picker.jsx"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"ead196c630ae705679ed81a3d48381bdf392787a5182de0bc614b1dcc173a7ff"}},{"ruleId":"D1","level":"warning","message":{"text":"filters.FilterInput (cyclomatic 28): filters.FilterInput has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 8 of the 28 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 602, 577, 637, \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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ab04a2a29813f08cb9f2c2c665e3b175c9ca4b9ac8859c680ab4aab5725a0e3"}},{"ruleId":"D1","level":"warning","message":{"text":"route-settings-parser.serializeRouteSettings (cyclomatic 28): route-settings-parser.serializeRouteSettings 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":"ghost/core/core/server/services/route-settings/route-settings-parser.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c62ec56d8bfa1ef4cc6f3fa789430d4e21e4708aa8dc7164d027b9b856e96e3"}},{"ruleId":"D1","level":"warning","message":{"text":"navigation.navigation (cyclomatic 28): navigation.navigation has cyclomatic complexity 28 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 11 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/navigation.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"803f65062cec778a64a47b4a0eac0e6a8c71cd4cc5253cf36c6d751d325576d7"}},{"ruleId":"D1","level":"warning","message":{"text":"member-activity-pagination.loadMemberActivityPage (cyclomatic 27): member-activity-pagination.loadMemberActivityPage has cyclomatic complexity 27 (threshold 15). Of this number, 23 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":"apps/admin-x-framework/src/api/member-activity-pagination.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bb3d78c9decd9c4fb09fbbd659bfdbeab6cb29ddfb8781652328e8ddacd4202"}},{"ruleId":"D1","level":"warning","message":{"text":"editor-screen.EditorLoader (cyclomatic 27): editor-screen.EditorLoader has cyclomatic complexity 27 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-screen.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"91435a2901c216b179f2dca93562373aa67d5a2a670fac94e56d799f3490f769"}},{"ruleId":"D1","level":"warning","message":{"text":"edit-offer-modal.Sidebar (cyclomatic 27): edit-offer-modal.Sidebar has cyclomatic complexity 27 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 4 belong to 4 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":"apps/admin/src/settings/growth/offers/edit-offer-modal.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae892b30d11d60be11de650783b1814a9cff6596ead10f6e406c9117d103bc64"}},{"ruleId":"D1","level":"warning","message":{"text":"edit-offer-modal.EditOfferModal (cyclomatic 27): edit-offer-modal.EditOfferModal has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 6 of the 27 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 345, 393, 308). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/edit-offer-modal.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da96933d9571e564610e438a5f2f848ff2e23aff8cd11cb7e08a40d794b886c"}},{"ruleId":"D1","level":"warning","message":{"text":"preview-frame.EmailPreviewFrame (cyclomatic 27): preview-frame.EmailPreviewFrame has cyclomatic complexity 27 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, 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":"apps/admin/src/automations/components/email-modal/preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ad35f0de349efaa9fb0cb7d69fa8d8a136c94674ff334541aa1bf973aba7a1c"}},{"ruleId":"D1","level":"warning","message":{"text":"use-post-success-modal.usePostSuccessModal (cyclomatic 27): use-post-success-modal.usePostSuccessModal has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 2 of the 27 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 68, 77, 166, \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":"apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a890f1935f827640e060cc0f779ceae8796b10d1c64c3bf65ed94f941aea7bda"}},{"ruleId":"D1","level":"warning","message":{"text":"default-recipients.DefaultRecipients (cyclomatic 27): default-recipients.DefaultRecipients has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 6 of the 27 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 148, 174, 194, \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":"apps/admin/src/settings/email/default-recipients.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cd66f243099ea637eeaf0d92fce356b4833c9e1c48964b7857e5f2a2bcaf42d"}},{"ruleId":"D1","level":"warning","message":{"text":"welcome-email-preview-frame.WelcomeEmailPreviewFrame (cyclomatic 27): welcome-email-preview-frame.WelcomeEmailPreviewFrame has cyclomatic complexity 27 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, 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":"apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c13ace112fa71993a63de4628162d3f1915f16ce3ed7a3825cd28d417e09eaf"}},{"ruleId":"D1","level":"warning","message":{"text":"App.getPageFromLinkPath (cyclomatic 27): App.getPageFromLinkPath 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":"apps/portal/src/app.jsx"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3fbba883bc8bdd906f9f44fe2cd41c286917873094062b289aa92991f025db5"}},{"ruleId":"D1","level":"warning","message":{"text":"members-api.MembersAPI (cyclomatic 27): members-api.MembersAPI 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, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/members-api.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5d753db77ef4eaa829639a370e14148c2fe19eb0311ab65961e85a53cefc72"}},{"ruleId":"D1","level":"warning","message":{"text":"body_class.body_class (cyclomatic 27): body_class.body_class 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":"ghost/core/core/frontend/helpers/body_class.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"153d29265da1a340a31a1ca64c10fb410645cc66410d0857d0ab3dea045da5a6"}},{"ruleId":"D1","level":"warning","message":{"text":"get.get (cyclomatic 27): get.get 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":"ghost/core/core/frontend/helpers/get.js"},"region":{"startLine":405}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9faae1e8e0132718f6081d7f331875718b5fb53a8a499971b188e0ac23d67a"}},{"ruleId":"D1","level":"warning","message":{"text":"handle-image-sizes.handleImageSizes (cyclomatic 27): handle-image-sizes.handleImageSizes has cyclomatic complexity 27 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 12 belong to 6 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/web/middleware/handle-image-sizes.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01f3630836ac55dffb1533aee41d2e019dca6ace6da54272a82c5e055d19335"}},{"ruleId":"D1","level":"warning","message":{"text":"handleDataAttributes (cyclomatic 27): handleDataAttributes has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 3 of the 27 points are its own statements and the rest belongs to 33 function items inside it that branch ((anonymous), (anonymous)::clickHandler, (anonymous)::clickHandler, \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":"apps/portal/src/data-attributes.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6818b8ac25b9a9802ecb7aa688ae6f452effcc52fc1505735de571bba515eaa"}},{"ruleId":"D1","level":"warning","message":{"text":"suggested-profiles.SuggestedProfiles (cyclomatic 26): suggested-profiles.SuggestedProfiles has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 8 of the 26 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 130, 25, 63, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/components/suggested-profiles.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b7ea84b51698507265c86f3bef41e39b31092ec3dc7c07bcf608e2d441654d"}},{"ruleId":"D1","level":"warning","message":{"text":"bluesky-sharing.BlueskySharing (cyclomatic 26): bluesky-sharing.BlueskySharing has cyclomatic complexity 26 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 9 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":"apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a27333ff291604d33ed7db6a93d12da35bd761e528fec13a055553ba5822ab2"}},{"ruleId":"D1","level":"warning","message":{"text":"use-growth-stats.calculateTotals (cyclomatic 26): use-growth-stats.calculateTotals 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":"apps/admin/src/analytics/hooks/use-growth-stats.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"98dfec3c4fe2de7163f641fd315274befc081b22a11c64115021923cef3e67eb"}},{"ruleId":"D1","level":"warning","message":{"text":"email-recipients-options.EmailRecipientsOptions (cyclomatic 26): email-recipients-options.EmailRecipientsOptions has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 10 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 109, 93, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/email-recipients-options.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b826d96f58923266d018a6631b425f407d7c30e5aa963418b2f7df208252cd"}},{"ruleId":"D1","level":"warning","message":{"text":"unsubscribe-modal.UnsubscribeModal (cyclomatic 26): unsubscribe-modal.UnsubscribeModal has cyclomatic complexity 26 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 13 belong to 9 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8369e4635bf113bd81ee1298f6cf26a89c0b34505f578698d05e3d895d3423be"}},{"ruleId":"D1","level":"warning","message":{"text":"member-value-semantics.subscriptionSemantics (cyclomatic 26): member-value-semantics.subscriptionSemantics 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":"apps/admin/src/members/member-value-semantics.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0db921add63d1ca1539132f5659877edcec261973133efa2ef9691d8423cf5d"}},{"ruleId":"D1","level":"warning","message":{"text":"theme-modal.ChangeThemeModal (cyclomatic 26): theme-modal.ChangeThemeModal has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 7 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 345, 392, 490, \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":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d98eea5bae12a7956da98cc041a1921418887c66ca46acba2357bb70d556136"}},{"ruleId":"D1","level":"warning","message":{"text":"mapping-step.MappingStep (cyclomatic 26): mapping-step.MappingStep has cyclomatic complexity 26 (threshold 15). Of this number, 20 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":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd726aa99dc19e931b58e4272b5b5000913f3117c0eba9305b145dea3135312e"}},{"ruleId":"D1","level":"warning","message":{"text":"preview-modal.PreviewModalContent (cyclomatic 26): preview-modal.PreviewModalContent has cyclomatic complexity 26 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/components/preview-modal.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6b394b23c064aeb5d159a6da73ad68be635807f0433c1c827bb772b1565136"}},{"ruleId":"D1","level":"warning","message":{"text":"form.FormEditor (cyclomatic 26): form.FormEditor has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 9 of the 26 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 110, 80, 44, \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":"apps/comments-ui/src/components/content/forms/form.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"640f5ad66778e60eff198543c93277be4b4000a4bebf8729be649675ba707dff"}},{"ruleId":"D1","level":"warning","message":{"text":"gift-success-page.GiftSuccessPage (cyclomatic 26): gift-success-page.GiftSuccessPage 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":"apps/portal/src/components/pages/gift-success-page.jsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a24238adf884069f6112833eeea451dacef4fa574dbda302719d5ce7de3bc4"}},{"ruleId":"D1","level":"warning","message":{"text":"commands.addTableColumn (cyclomatic 26): commands.addTableColumn 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":"ghost/core/core/server/data/schema/commands.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e5226cd8405b017b0f26904937eb95dc912bcc08d50dbe8449db03a9e348992"}},{"ruleId":"D1","level":"warning","message":{"text":"Offer.create (cyclomatic 26): Offer.create 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":"ghost/core/core/server/services/offers/domain/models/offer.js"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8278735a2747fa0c1cd4470f8b92ef9e089c75c6c54d923583fc872f16f0087"}},{"ruleId":"D1","level":"warning","message":{"text":"middleware.createSessionFromMagicLink (cyclomatic 26): middleware.createSessionFromMagicLink has cyclomatic complexity 26 (threshold 15). Of this number, 22 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":"ghost/core/core/server/services/members/middleware.js"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"c422196cc46a1fdb9e74483c4562ebe763787a2eac1dbc7a149c696c58cb6011"}},{"ruleId":"D1","level":"warning","message":{"text":"OEmbedService.fetchOembedDataFromUrl (cyclomatic 26): OEmbedService.fetchOembedDataFromUrl 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":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68555089c034966fb76409a92d13e353a23f897a1e13801c143157b698144d7"}},{"ruleId":"D1","level":"warning","message":{"text":"new-subscribers-cadence.NewSubscribersCadence (cyclomatic 25): new-subscribers-cadence.NewSubscribersCadence has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 9 of the 25 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 345, 113, 142, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eeeb87dd4f2868eb843d19db8b3832d07d4f5c527d192a97b411ca16d732b7c"}},{"ruleId":"D1","level":"warning","message":{"text":"embed-signup-sidebar.EmbedSignupSidebar (cyclomatic 25): embed-signup-sidebar.EmbedSignupSidebar 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 9 function literals inside it that branch (lines 73, 208, 97, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/embed-signup/embed-signup-sidebar.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"599de4fdf60821e166c786899adb40e029a32aabcd9e59557f93a7daa2a10fbb"}},{"ruleId":"D1","level":"warning","message":{"text":"platform-validator.createPlatformValidator (cyclomatic 25): platform-validator.createPlatformValidator 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 9 function literals inside it that branch (lines 234, 211, 284, \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":"apps/admin/src/settings/utils/social-urls/platform-validator.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"26d5dc3d4053ddbd4c57516bb2780a2b55d83bbcdc7a71ca8b31af4401c45026"}},{"ruleId":"D1","level":"warning","message":{"text":"email-design.getEmailDesign (cyclomatic 25): email-design.getEmailDesign 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":"ghost/core/core/server/services/email-rendering/email-design.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ad3632462c57b40ea9fe97da9e5ea2dfff70d4a819c511707f52385c602cb8"}},{"ruleId":"D1","level":"warning","message":{"text":"GiftDeliveryService.send (cyclomatic 25): GiftDeliveryService.send has cyclomatic complexity 25 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-delivery-service.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f55550fa62896f602708efd5a68dcb73fc0469c74612aa71e2e62f001639546"}},{"ruleId":"D1","level":"warning","message":{"text":"ghost_head.getAdminToolbarHelper (cyclomatic 25): ghost_head.getAdminToolbarHelper has cyclomatic complexity 25 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/ghost_head.js"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cf39fa04811639e6e936ff9d37c1a9a05c736c4068bf658af02c85c604e1eff"}},{"ruleId":"D1","level":"warning","message":{"text":"MembersStripeCustomersSubscriptionsImporter.generate (cyclomatic 25): MembersStripeCustomersSubscriptionsImporter.generate has cyclomatic complexity 25 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"a81568886f40efddc2e31b356200d9f0f51aaf3fa04fed45dcf36e3bdc5dfccf"}},{"ruleId":"D1","level":"warning","message":{"text":"fetch-api.useFetchApi (cyclomatic 24): fetch-api.useFetchApi 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 3 function literals inside it that branch (lines 167, 211, 245). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/api/fetch-api.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb2dd614396d3efe6280eebc2bd13f0d9787e86f3f2554e196e3beaea8f323a9"}},{"ruleId":"D1","level":"warning","message":{"text":"comment-likes-modal.CommentLikesModal (cyclomatic 24): comment-likes-modal.CommentLikesModal has cyclomatic complexity 24 (threshold 15). Of this number, 21 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":"apps/admin/src/comments/components/comment-likes-modal.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b3548022e8351161767660eb1cdf93684ee83edea6b4a11c5127f83cd178c6"}},{"ruleId":"D1","level":"warning","message":{"text":"use-member-filter-fields.useMemberFilterFields (cyclomatic 24): use-member-filter-fields.useMemberFilterFields 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 316, 508, 380, \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":"apps/admin/src/members/use-member-filter-fields.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"2417050943ee37cfe249612ba2902563d8dd7d062c310912811824c8a85c1bf3"}},{"ruleId":"D1","level":"warning","message":{"text":"use-pintura-editor.usePinturaEditor (cyclomatic 24): use-pintura-editor.usePinturaEditor has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 4 of the 24 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 66, 108, 147, \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":"apps/admin/src/settings/hooks/use-pintura-editor.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9b4906e6b0df3987d5a06e9325d982a4f81cd11aebe738cd19e65741c02514"}},{"ruleId":"D1","level":"warning","message":{"text":"member-emails.MemberEmails (cyclomatic 24): member-emails.MemberEmails has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 8 of the 24 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 272, 227, 300, \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":"apps/admin/src/settings/membership/member-emails.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ae2f959cb91e189024a094cc2ed70af6e7ffa0e1d9bd59da36d1d727fc6188"}},{"ruleId":"D1","level":"warning","message":{"text":"date.dateSemantics (cyclomatic 24): date.dateSemantics 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":"apps/admin/src/shared/filters/semantics/date.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d706837d4a3cd6f8dc6b4db2319e8e054104a6e1b61cedc1f9b8e2f4d26e09"}},{"ruleId":"D1","level":"warning","message":{"text":"use-scroll-restoration.useScrollRestoration (cyclomatic 24): use-scroll-restoration.useScrollRestoration 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 9 function literals inside it that branch (lines 242, 280, 197, \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":"apps/admin/src/shared/virtual-list/use-scroll-restoration.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"74278e35a041fa35795c85c84db9e51c99db0a6a558e4d1927e8e62bc3756228"}},{"ruleId":"D1","level":"warning","message":{"text":"data-attributes.formSubmitHandler (cyclomatic 24): data-attributes.formSubmitHandler has cyclomatic complexity 24 (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":"apps/portal/src/data-attributes.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d9eb607e99b58bfc65471d9fe24436f87b691532dd0c922d8721c6b6516c0a"}},{"ruleId":"D1","level":"warning","message":{"text":"validator.validateSchema (cyclomatic 24): validator.validateSchema has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 3 of the 24 points are its own statements and the rest belongs to one function literal inside it that branches (line 49). 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":"ghost/core/core/server/data/schema/validator.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e86bc9bbd505446dbedf6b7c23152e7c1ef38558104458d1defdc3bd44e5d684"}},{"ruleId":"D1","level":"warning","message":{"text":"permissible (cyclomatic 24): permissible has cyclomatic complexity 24 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 2 belong to 3 function items inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/post.js"},"region":{"startLine":1523}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a5668f94bfcf160825c74e7a95aecfec3b10a8596d60f3bb8445f4212d3fe6"}},{"ruleId":"D1","level":"warning","message":{"text":"createCheckoutSession (cyclomatic 24): createCheckoutSession 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cb391de765bc22ea290122429b0db155e23d48f5cd47f6702ea16b72b93ed36"}},{"ruleId":"D1","level":"warning","message":{"text":"top-posts.TopPosts (cyclomatic 23): top-posts.TopPosts 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 3 function literals inside it that branch (lines 112, 252, 120). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a2b2f7843b440602d62a4ec691002eaa7ca23f16de04eab5e463b78427ccfd"}},{"ruleId":"D1","level":"warning","message":{"text":"use-growth-stats.useGrowthStats (cyclomatic 23): use-growth-stats.useGrowthStats has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 2 of the 23 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 289, 250, 389, \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":"apps/admin/src/analytics/hooks/use-growth-stats.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"79bce919eeae73840b36b87d1c367ff6bdd414e02c06aa24168dfc5d0355caaf"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-overview.NewsletterOverview (cyclomatic 23): newsletter-overview.NewsletterOverview has cyclomatic complexity 23 (threshold 15). Of this number, 15 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":"apps/admin/src/posts/analytics/overview/components/newsletter-overview.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"f16e9d4619b04797cb95c7a63d2cd34c8a97bfc9d494306a2c7839ecc7ec6dd7"}},{"ruleId":"D1","level":"warning","message":{"text":"options-step.OptionsStep (cyclomatic 23): options-step.OptionsStep 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":"apps/admin/src/editor/publish/components/options-step.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"64d0e0316c9895ff875985861c19c99d2b25969a55a511e8429208a45032f49a"}},{"ruleId":"D1","level":"warning","message":{"text":"design-modal.DesignModal (cyclomatic 23): design-modal.DesignModal has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 6 of the 23 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 162, 174, 110, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/design-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f9815dc196e65552fd90fbe5311b1343d986d5cd7556d21aeb3396a20f6b67"}},{"ruleId":"D1","level":"warning","message":{"text":"use-pintura-editor.usePinturaEditor (cyclomatic 23): use-pintura-editor.usePinturaEditor 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 11 function literals inside it that branch (lines 64, 19, 42, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/hooks/use-pintura-editor.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"4387183055c18614e22d50cf6a043e25588ddbb2f5ad1f1b3b1286934002fd61"}},{"ruleId":"D1","level":"warning","message":{"text":"use-label-picker.useLabelPicker (cyclomatic 23): use-label-picker.useLabelPicker has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 111, 151, 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":"apps/admin/src/members/hooks/use-label-picker.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"55406da86919f27c79ec71275c49dfee400ebb5c39d1ef86b155b9d9eb507d34"}},{"ruleId":"D1","level":"warning","message":{"text":"share-modal.ShareModal (cyclomatic 23): share-modal.ShareModal has cyclomatic complexity 23 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/share/share-modal.jsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ee3579e1a50329ab91268b23616fb8f792a81de7bcff54e1bcf59ea78e0ed7d"}},{"ruleId":"D1","level":"warning","message":{"text":"pagemenu.PageMenu (cyclomatic 23): pagemenu.PageMenu has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 8 of the 23 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 45, 38, 100, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/pagemenu.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f87c3d5e51d3262e04580db7d207655f462c93259f449a8acc780bf936c2e72"}},{"ruleId":"D1","level":"warning","message":{"text":"database-automations-repository.createDatabaseAutomationsRepository (cyclomatic 23): database-automations-repository.createDatabaseAutomationsRepository has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 5 of the 23 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 333, 397, 227, \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":"ghost/core/core/server/services/automations/database-automations-repository.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a8d7f62a9b6c1eb72b55daee1f060d740f8786c58e4f6aadc6075a6f5896d3d"}},{"ruleId":"D1","level":"warning","message":{"text":"MemberWelcomeEmailRenderer.render (cyclomatic 23): MemberWelcomeEmailRenderer.render has cyclomatic complexity 23 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 7 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":"ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"b19c7ed8ba39eb1cad5a8a38667b5be79754240404b31a0f508d0319e209ded8"}},{"ruleId":"D1","level":"warning","message":{"text":"route-settings-parser.parseRouteSettings (cyclomatic 23): route-settings-parser.parseRouteSettings 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":"ghost/core/core/server/services/route-settings/route-settings-parser.ts"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"e04919db159b6b28b6b4b2fea5e0292aefd0e0ccd331077a4cc8d6f443b685d7"}},{"ruleId":"D1","level":"warning","message":{"text":"use-activity-pub-queries.useReplyChainForUser (cyclomatic 22): use-activity-pub-queries.useReplyChainForUser has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 5 of the 22 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 2590, 2618, 2648, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":2551}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cdb7cc327499822cf1e1e32c37e05ff5516c4829a2fb2bd8c633c646148cac9"}},{"ruleId":"D1","level":"warning","message":{"text":"moderation.Moderation (cyclomatic 22): moderation.Moderation 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 3 function literals inside it that branch (lines 181, 266, 77). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/moderation.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0405eaf9435aa6db2b5be2dc9c2c86581979c0ef9d06931b95621db883f557"}},{"ruleId":"D1","level":"warning","message":{"text":"gift-link-modal.GiftLinkModal (cyclomatic 22): gift-link-modal.GiftLinkModal 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 8 function literals inside it that branch (lines 74, 127, 143, \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":"apps/admin/src/posts/analytics/modals/gift-link-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9c294246c7fd7410d9ab6431b32f2705f0a9d2b0d4a3e876100a3e50aaee8ec"}},{"ruleId":"D1","level":"warning","message":{"text":"email-confirmation.createEmailConfirmation (cyclomatic 22): email-confirmation.createEmailConfirmation has cyclomatic complexity 22 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 7 belong to 5 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/email-confirmation.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"d57306fbfc494cd43901caa88573ca99484dd2640bbd5620e7aa02f6f332b849"}},{"ruleId":"D1","level":"warning","message":{"text":"comments-list.CommentsList (cyclomatic 22): comments-list.CommentsList has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 2 of the 22 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 127, 88, 77, \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":"apps/admin/src/comments/components/comments-list.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e098139a3db649c8913ee7390c29b8d8d71667eb1bcd1a40a7e3731ceeb2b4"}},{"ruleId":"D1","level":"warning","message":{"text":"add-recommendation-modal.AddRecommendationModal (cyclomatic 22): add-recommendation-modal.AddRecommendationModal has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 8 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 130, 74, 156, \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":"apps/admin/src/settings/growth/recommendations/add-recommendation-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"28585c4193e45ced99f5c3622228699a9f3a10b66e774e9936efff0fd96e55db"}},{"ruleId":"D1","level":"warning","message":{"text":"yaml-file-editor-modal.YamlFileEditorModal (cyclomatic 22): yaml-file-editor-modal.YamlFileEditorModal has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 8 of the 22 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 61, 95, 119). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/labs/yaml-file-editor-modal.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9b015a56c324c6da7a2ed5f71c0bce04de8ce1e6a0b5cbedd13e02ee8b45e24"}},{"ruleId":"D1","level":"warning","message":{"text":"color-picker-field.ColorPickerField (cyclomatic 22): color-picker-field.ColorPickerField 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 9 function literals inside it that branch (lines 85, 91, 146, \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":"apps/admin/src/settings/components/color-picker-field.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef1b4831973f30495772e21742c2c885be3f98f08134532742f910789f10a55"}},{"ruleId":"D1","level":"warning","message":{"text":"members.mockMembers (cyclomatic 22): members.mockMembers has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 81, 149, 278, \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":"apps/ember-admin/mirage/config/members.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac21c0b6c03ce46d67eefb3a276974483b435aba2bef1737dcace2363ba7b24c"}},{"ruleId":"D1","level":"warning","message":{"text":"ProductRepository.create (cyclomatic 22): ProductRepository.create 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":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7b93b96b2dc1eb4f31bccba7433eb37a969d2aa6f1ae53c0fe32766f77806d"}},{"ruleId":"D1","level":"warning","message":{"text":"NewslettersService.prepAttrsForEmailVerification (cyclomatic 22): NewslettersService.prepAttrsForEmailVerification 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":"ghost/core/core/server/services/newsletters/newsletters-service.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"3df97c85122e434aec88e08a4b29cb9b9e56310388958ea1e9d410da824eae24"}},{"ruleId":"D1","level":"warning","message":{"text":"EmailAnalyticsService.#fetchEventsForJob (cyclomatic 22): EmailAnalyticsService.#fetchEventsForJob has cyclomatic complexity 22 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-analytics/email-analytics-service.ts"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a38bf34efd0ce517744d063836de81e17470d9e4c280c2846f515afb933dcf"}},{"ruleId":"D1","level":"warning","message":{"text":"tinybird.create (cyclomatic 22): tinybird.create has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 25, 113, 68, \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":"ghost/core/core/server/services/stats/utils/tinybird.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"6044cfd3da394011ead25554c05de369a280e4e3965650ad0c378883b46c9ec5"}},{"ruleId":"D1","level":"warning","message":{"text":"MppAdapter.#run (cyclomatic 22): MppAdapter.#run 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":"ghost/core/core/server/services/machine-payments/adapters/mpp-adapter.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cc544dbb1438cab236f4b0bc8d02577d3edd603ede33526eaa8ca9c9e742cf"}},{"ruleId":"D1","level":"warning","message":{"text":"AutomationRunStepsImporter.import (cyclomatic 22): AutomationRunStepsImporter.import 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":"ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95a281f14388f3228b7c5c214baebe8098aad7a80f17d572a42dd197f6704bb"}},{"ruleId":"D1","level":"warning","message":{"text":"video.handleVideoPlayer (cyclomatic 22): video.handleVideoPlayer has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 6 of the 22 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 143, 131, 109, \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":"ghost/core/core/frontend/src/cards/js/video.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d0a0a3ce2a572c8c581c34f81fb993ab5a3842a029fd45f78421190ba7c2c0"}},{"ruleId":"D1","level":"warning","message":{"text":"applyOfferToSubscription (cyclomatic 22): applyOfferToSubscription 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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":2224}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9386b579185bf526fe4b6c722ee38643fb459198ed58d55f9affaf6332edf10"}},{"ruleId":"D1","level":"warning","message":{"text":"add (cyclomatic 22): add 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":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"9748e25083c057f6fdd109e6d78e317b182ab37494fa8ade10407abd41b21d88"}},{"ruleId":"D1","level":"warning","message":{"text":"handle-response.handleResponse (cyclomatic 21): handle-response.handleResponse 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":"apps/admin-x-framework/src/utils/api/handle-response.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d3a6e760afa15d22258a5b5bc3fa3ad4d4a9b60995ff2c67b1b4125ffc1dcfa"}},{"ruleId":"D1","level":"warning","message":{"text":"actions.getLinkTarget (cyclomatic 21): actions.getLinkTarget 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":"apps/admin-x-framework/src/api/actions.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"459d7aefae90acaa00723ee8458a078f8c126ee63f9a81618e5bfcf9ceb273b2"}},{"ruleId":"D1","level":"warning","message":{"text":"web.Web (cyclomatic 21): web.Web has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 7 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 64, 52, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/web/web.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"5724e7302ff70dbe4681fd5c450c1207facc67ebd608af6993f89a48e2c960bd"}},{"ruleId":"D1","level":"warning","message":{"text":"growth-sources.GrowthSources (cyclomatic 21): growth-sources.GrowthSources has cyclomatic complexity 21 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 10 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/growth-sources.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe508754003afa99152a63887f06010172761ce6a2190cb6df0bcd0117e082d"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-radial-chart.NewsletterRadialChart (cyclomatic 21): newsletter-radial-chart.NewsletterRadialChart has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 3 of the 21 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 47, 139, 35). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/newsletter/components/newsletter-radial-chart.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"65e405c4f33e09e277c0543868add84854b73a8390139f31439cc2bf4460eed3"}},{"ruleId":"D1","level":"warning","message":{"text":"theme-file-tree.ThemeFileTree (cyclomatic 21): theme-file-tree.ThemeFileTree has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 3 of the 21 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 113, 151, 178). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme/theme-file-tree.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb2c17cd57bf0b52b3382aa7c1c17b297a2cea28c3dfd22ffecd6392cef9152c"}},{"ruleId":"D1","level":"warning","message":{"text":"history-modal.HistoryFilter (cyclomatic 21): history-modal.HistoryFilter has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 7 of the 21 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 116, 133, 169, \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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"093649eaddd23223be5859c7fa5127f3e4ac88b84c6231ef5e8bd559a637f7a1"}},{"ruleId":"D1","level":"warning","message":{"text":"history-modal.HistoryModal (cyclomatic 21): history-modal.HistoryModal has cyclomatic complexity 21 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4c53e6ea247b5bc6382fc814588bd8ddf41c63e2dd3789ddd1cd0f7c9e19de"}},{"ruleId":"D1","level":"warning","message":{"text":"webhook-modal.WebhookModal (cyclomatic 21): webhook-modal.WebhookModal has cyclomatic complexity 21 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 7 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":"apps/admin/src/settings/advanced/integrations/webhook-modal.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"d720a459fc21f8db80d07f39a069dbc25eec2af8bbf8513eb9ed48f5bf561fb6"}},{"ruleId":"D1","level":"warning","message":{"text":"use-unsaved-changes-guard.useUnsavedChangesGuard (cyclomatic 21): use-unsaved-changes-guard.useUnsavedChangesGuard has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 6 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 90, 129, 168, \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":"apps/admin/src/hooks/use-unsaved-changes-guard.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f825b92ffb2d6f93378b809821d552d679c983f6d2a99556376c44b7b772af"}},{"ruleId":"D1","level":"warning","message":{"text":"email-sending-status-banner.EmailSendingStatusBanner (cyclomatic 21): email-sending-status-banner.EmailSendingStatusBanner has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/email-sending-status/email-sending-status-banner.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"61c9cc2210465d80a435344a9f2015119383503f39442d72956136c6e3942167"}},{"ruleId":"D1","level":"warning","message":{"text":"format-url.formatUrl (cyclomatic 21): format-url.formatUrl 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":"apps/admin/src/settings/utils/format-url.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efb77cc60d22b9563c5df68380735346548719473e48c2c79651f57c1b6d730"}},{"ruleId":"D1","level":"warning","message":{"text":"LexicalEditorController._hasDirtyAttributes (cyclomatic 21): LexicalEditorController._hasDirtyAttributes 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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":1444}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ed309c03b40a2563d741a2dbd6ff4d0fb371980c6189beb447fc076d224fc20"}},{"ruleId":"D1","level":"warning","message":{"text":"recommendations-page.RecommendationItem (cyclomatic 21): recommendations-page.RecommendationItem has cyclomatic complexity 21 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/recommendations-page.jsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c1945bfd516a6f066a0195065693d51383a208c3fe256d2dcf22fc6bdadb6d1"}},{"ruleId":"D1","level":"warning","message":{"text":"code-editor-view.CodeEditorView (cyclomatic 21): code-editor-view.CodeEditorView has cyclomatic complexity 21 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 10 belong to 6 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/code-editor-view.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"259ea31db94a595c2cad4eb0482a948be8571e60114a133d84a99cf1ad506ca1"}},{"ruleId":"D1","level":"warning","message":{"text":"post-data.buildPostData (cyclomatic 21): post-data.buildPostData 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":"ghost/core/core/server/services/content-import/import/post-data.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1710faf9c216c353118234e40b268c8124d168cb9456036492fd3d096b5f49c0"}},{"ruleId":"D1","level":"warning","message":{"text":"context.setResponseContext (cyclomatic 21): context.setResponseContext 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":"ghost/core/core/frontend/services/rendering/context.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"74f3846b1067f991a1b145367ba8f96d1a06e714a60a30eada16ecb6096b4094"}},{"ruleId":"D1","level":"warning","message":{"text":"generate-img-attrs.generateImgSrcAttrs (cyclomatic 21): generate-img-attrs.generateImgSrcAttrs 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/utils/generate-img-attrs.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d2add80e6cd9a2a71b23c9c935a5f76c6e621cc4652c5bda5d9ce348fb5f2b2"}},{"ruleId":"D1","level":"warning","message":{"text":"#run (cyclomatic 21): #run has cyclomatic complexity 21 (threshold 15). Of this number, 20 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":"ghost/core/core/server/data/seeders/data-generator.js"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"262c376cbb934fb602b43c489d24ca5ccbf730c81203ca1c3bbf3b57a4489d53"}},{"ruleId":"D1","level":"warning","message":{"text":"feed-item-stats.FeedItemStats (cyclomatic 20): feed-item-stats.FeedItemStats has cyclomatic complexity 20 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item-stats.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"339e82dd528d31a252e755ab025502991898b880585e2a9e5880a5b24d29894c"}},{"ruleId":"D1","level":"warning","message":{"text":"use-keyboard-shortcuts.useKeyboardShortcuts (cyclomatic 20): use-keyboard-shortcuts.useKeyboardShortcuts has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to one function literal inside it that branches (line 16). 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":"apps/activitypub/src/hooks/use-keyboard-shortcuts.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cdddcbce50b387d105f6863d240cc0861ae74569b05f0c0c6ec5669a081fa79"}},{"ruleId":"D1","level":"warning","message":{"text":"inbox-list.InboxList (cyclomatic 20): inbox-list.InboxList has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 59, 64, 105, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/inbox/components/inbox-list.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bb53ae0af78c66fca9eb60c6e3e355721c81aca46dceac85ed5a6dc8e4ce963"}},{"ruleId":"D1","level":"warning","message":{"text":"use-koenig-file-upload.useKoenigFileUpload (cyclomatic 20): use-koenig-file-upload.useKoenigFileUpload has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 2 of the 20 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 161, 124, 222, \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":"apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d64e1a743ac5b965f92be08a23ff4f6d12242e05cc53d7c536f2a449fdf5696"}},{"ruleId":"D1","level":"warning","message":{"text":"complete-step.CompleteStep (cyclomatic 20): complete-step.CompleteStep 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":"apps/admin/src/editor/publish/components/complete-step.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"84beebf4740338f3d7a1090b839f6d4730bf321e98011019b6d1e079b6b6c8ec"}},{"ruleId":"D1","level":"warning","message":{"text":"use-post-snippets.usePostSnippets (cyclomatic 20): use-post-snippets.usePostSnippets has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 103, 43, 130, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/use-post-snippets.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7556a4f62f89b68df4350adb2f30dfb6bb5856efc583909678290982c99bf7c"}},{"ruleId":"D1","level":"warning","message":{"text":"manage-view-popover.ManageViewPopoverContent (cyclomatic 20): manage-view-popover.ManageViewPopoverContent has cyclomatic complexity 20 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/manage-view-popover.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"035a85b20969ee115de17ed27816fd406bbd303b8286fdfe1bfe437f0d77d11e"}},{"ruleId":"D1","level":"warning","message":{"text":"members-header-search.MembersHeaderSearch (cyclomatic 20): members-header-search.MembersHeaderSearch has cyclomatic complexity 20 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/members-header-search.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b9193194dea5a4519772db49c8786efdfee84f26b16c9cf65af77ed3eea8fd3"}},{"ruleId":"D1","level":"warning","message":{"text":"member-detail-sidebar.MemberDetailSidebar (cyclomatic 20): member-detail-sidebar.MemberDetailSidebar 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":"apps/admin/src/members/detail/member-detail-sidebar.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5a08251664782e76cb2c4e6a1c870e5acb0e03a1587890a8edcb9a41553cdc2"}},{"ruleId":"D1","level":"warning","message":{"text":"user-detail-modal.UserDetailModal (cyclomatic 20): user-detail-modal.UserDetailModal has cyclomatic complexity 20 (threshold 15). Of this number, 14 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":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35a4e9a9620226692b1e3374d75283a533b0c0bd813ef5acbe16f0bb7c8b9ae"}},{"ruleId":"D1","level":"warning","message":{"text":"portal-modal.PortalModal (cyclomatic 20): portal-modal.PortalModal 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 8 function literals inside it that branch (lines 170, 121, 254, \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":"apps/admin/src/settings/membership/portal/portal-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7ae9dadc88ca7b53e2732aa3ce7d8cb3bf4390825b16ef0054d1dce5e7c08ca"}},{"ruleId":"D1","level":"warning","message":{"text":"sender-details.resolveEmailSenderDetails (cyclomatic 20): sender-details.resolveEmailSenderDetails 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":"apps/admin/src/automations/components/email-modal/sender-details.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd565d149005ef902647fdf54f0944aca0ba3cd00e05dd5b65725a2e121af071"}},{"ruleId":"D1","level":"warning","message":{"text":"use-gift-link-usage.useGiftLinkUsage (cyclomatic 20): use-gift-link-usage.useGiftLinkUsage has cyclomatic complexity 20 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 9 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/hooks/use-gift-link-usage.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"0812d873bd79b07d327da7003032a38a798db80485c100d151b3302677d3b54c"}},{"ruleId":"D1","level":"warning","message":{"text":"use-default-recipients-options.useDefaultRecipientsOptions (cyclomatic 20): use-default-recipients-options.useDefaultRecipientsOptions has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 104, 68, 152). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/use-default-recipients-options.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5ae23fea08ef0ce28d1873179047757e761d5f9bfb3d140d9f77d61403d2971"}},{"ruleId":"D1","level":"warning","message":{"text":"users.Users (cyclomatic 20): users.Users has cyclomatic complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/users.tsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8bd9f18f81d7d7fa77fee555fee3c680fc8b5f68b6a0be5c98d903098500c59"}},{"ruleId":"D1","level":"warning","message":{"text":"welcome-email-sender-details.resolveWelcomeEmailSenderDetails (cyclomatic 20): welcome-email-sender-details.resolveWelcomeEmailSenderDetails 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":"apps/admin/src/settings/utils/welcome-email-sender-details.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d94178358ae0fcf9f85a6d83e8ea61402211c19a979df8df7f24f8ce35194ec"}},{"ruleId":"D1","level":"warning","message":{"text":"actions.updateCommentDislikeState (cyclomatic 20): actions.updateCommentDislikeState has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 420, 419, 408). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/actions.ts"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a563c285acb97d6499c86d21a93c46efca2d7c674133f39de4fccb3b474d50"}},{"ruleId":"D1","level":"warning","message":{"text":"main-form.MainForm (cyclomatic 20): main-form.MainForm has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 3 of the 20 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 49, 15, 42, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/content/forms/main-form.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6f06b2a481bac4be320597267c10184ef621dc441f2d22daaa2569340af8d1"}},{"ruleId":"D1","level":"warning","message":{"text":"actions.updateProfile (cyclomatic 20): actions.updateProfile 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":"apps/portal/src/actions.js"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"9279da04ab16112fa24f3baf37500da34615906d171cb7ab165eed67237fcfc1"}},{"ruleId":"D1","level":"warning","message":{"text":"search-index.isCJK (cyclomatic 20): search-index.isCJK 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":"apps/sodo-search/src/search-index.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"65cb279391f39adba7e81267c1130188c1f8161d2aa0983a7d9a60bdd34ddc96"}},{"ruleId":"D1","level":"warning","message":{"text":"PostsService.bulkEdit (cyclomatic 20): PostsService.bulkEdit has cyclomatic complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/posts/posts-service.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b5ca144d90b48ceb9cc02388b27b54063468dcdd92079f6dba73ca8b901d429"}},{"ruleId":"D1","level":"warning","message":{"text":"EmailAddressService.getAddress (cyclomatic 20): EmailAddressService.getAddress 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":"ghost/core/core/server/services/email-address/email-address-service.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"a315950a8fdea02f11e5a96ac2f0c67e7e0e8ec1a1f343cf3587e788b522eddc"}},{"ruleId":"D1","level":"warning","message":{"text":"GiftService.startCheckout (cyclomatic 20): GiftService.startCheckout has cyclomatic complexity 20 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdfc498cc26017cea586f12b176fa6b7faf6e1b1d36684c2be61dde991831d9d"}},{"ruleId":"D1","level":"warning","message":{"text":"StripeCoupon.create (cyclomatic 20): StripeCoupon.create 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":"ghost/core/core/server/services/offers/domain/models/stripe-coupon.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d254cfe9d72bfabfa293d16d87cb8396cf0307f49a31b02d683933a739c2d49"}},{"ruleId":"D1","level":"warning","message":{"text":"api.createApiInstance (cyclomatic 20): api.createApiInstance has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/api.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59327b12f02dd8353457867db2c35cfb47c69899d899731ff29cb2666557783"}},{"ruleId":"D1","level":"warning","message":{"text":"PostMediaInliner.inlineLexicalChildren (cyclomatic 20): PostMediaInliner.inlineLexicalChildren 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":"ghost/core/core/server/services/content-import/import/media.ts"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c431f402003918524ef0c7a4754592abe5bb75ebb8ff636bb0ced98e1741b4a"}},{"ruleId":"D1","level":"warning","message":{"text":"markdown.renderEntryMarkdown (cyclomatic 20): markdown.renderEntryMarkdown 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":"ghost/core/core/frontend/services/llms/markdown.js"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"68e0820fc281d85a4f3406140d29c8f7e7bb691ad8100b3f8988a46ed968568f"}},{"ruleId":"D1","level":"warning","message":{"text":"has.has (cyclomatic 20): has.has has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 6 of the 20 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 145, 148, 151, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/has.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa51be2215c764b4f24f66bc228e820e84ae2c51f6855d8cbc8af52654c433fb"}},{"ruleId":"D1","level":"warning","message":{"text":"DockerAnalyticsManager.generateSession (cyclomatic 20): DockerAnalyticsManager.generateSession 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":"ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"da5f29d59946fc6e44b727eed8c8516b6e712de8e079c7df23eb809f6db732a4"}},{"ruleId":"D1","level":"warning","message":{"text":"clean-basic-html.cleanBasicHtml (cyclomatic 20): clean-basic-html.cleanBasicHtml has cyclomatic complexity 20 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 7 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-clean-basic-html/src/clean-basic-html.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e4dd8a9d8583772512550f8053cf161b1e0439704425b3dcb45cc49587e886"}},{"ruleId":"D1","level":"warning","message":{"text":"_getSubscriptionCheckoutData (cyclomatic 20): _getSubscriptionCheckoutData 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"747ac712fcaa430f3b873c8f50d2dd42a8593e9b4932837f54baa0ae830e35a8"}},{"ruleId":"D1","level":"warning","message":{"text":"_createSubscriptionCheckoutSession (cyclomatic 20): _createSubscriptionCheckoutSession 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"f15cc111fc746ed81dafa061595344a063439591650ffc72c366a93cc3355aa0"}},{"ruleId":"D1","level":"warning","message":{"text":"extendModel::permissible (cyclomatic 20): extendModel::permissible 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":"ghost/core/core/server/models/relations/authors.js"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2f78525331a13130ccbced816fea2f147f8cedef331eca8d59c5ed1aaf98d92"}},{"ruleId":"D1","level":"warning","message":{"text":"use-form.useForm (cyclomatic 19): use-form.useForm 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 4 function literals inside it that branch (lines 97, 74, 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":"apps/admin-x-framework/src/hooks/use-form.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"5560152bbbc798a3a6c4a3aaa6bb05ffd78ea2574c122f2cf0ecd890213cbd55"}},{"ruleId":"D1","level":"warning","message":{"text":"editor-header-actions.PublishActions (cyclomatic 19): editor-header-actions.PublishActions 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":"apps/admin/src/editor/editor-header-actions.tsx"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb352a5dae25b40e63d460aa788c223fe80b4d52754a27bc96ddf430f5c611e3"}},{"ruleId":"D1","level":"warning","message":{"text":"post-settings-sidebar.PostSettingsSidebar (cyclomatic 19): post-settings-sidebar.PostSettingsSidebar has cyclomatic complexity 19 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/settings/post-settings-sidebar.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"f568e6b96a1732461681f10e6e5a5184038cf5b9eaad34075a5108c1bfa3eef1"}},{"ruleId":"D1","level":"warning","message":{"text":"addressing.customFieldAddressing (cyclomatic 19): addressing.customFieldAddressing has cyclomatic complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/custom-fields/addressing.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"eea8df3b6ea575b0fda00f6e0d265e61847797e6cce28beaa949e9d449d2089c"}},{"ruleId":"D1","level":"warning","message":{"text":"activity-row.ActivityRow (cyclomatic 19): activity-row.ActivityRow has cyclomatic complexity 19 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/activity-row.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"08ea436157b9391b763e682d4af8f631beee8765e4c7fcfd5d1fab101673e0d0"}},{"ruleId":"D1","level":"warning","message":{"text":"portal-links.PortalLinks (cyclomatic 19): portal-links.PortalLinks has cyclomatic complexity 19 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/portal/portal-links.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"574809d9ce630043b17cb646ea722068b440462a896c79b68d0273095e5f1c72"}},{"ruleId":"D1","level":"warning","message":{"text":"history-modal.HistoryActionDescription (cyclomatic 19): history-modal.HistoryActionDescription 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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac951204f59c3e31fc31a491c4b22037055c671323fcda47b9326144e1558df"}},{"ruleId":"D1","level":"warning","message":{"text":"field-picker.FieldPicker (cyclomatic 19): field-picker.FieldPicker 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, 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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2e28012e1061fbb1cdfe0c2fd221c19e7a3dc454aa436a9063f336d1aec4396"}},{"ruleId":"D1","level":"warning","message":{"text":"post-list-row-email-status.PostListRowEmailStatus (cyclomatic 19): post-list-row-email-status.PostListRowEmailStatus has cyclomatic complexity 19 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/components/post-list-row-email-status.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"6279ff49b30f4e1681358c5855dfcdea1ea57ef456b4b9e103312a7cfac2752c"}},{"ruleId":"D1","level":"warning","message":{"text":"export-all-modal.ExportAllModal (cyclomatic 19): export-all-modal.ExportAllModal 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 6 function literals inside it that branch (lines 117, 99, 95, \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":"apps/admin/src/settings/advanced/migration-tools/export-all-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f58b80f8aa841d25f74f33250240319d2a57647f1ab887bd9127f91e9d1991a8"}},{"ruleId":"D1","level":"warning","message":{"text":"custom-field-picker.CreateFieldInline (cyclomatic 19): custom-field-picker.CreateFieldInline 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 2 function literals inside it that branch (lines 236, 284). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/member-custom-fields/custom-field-picker.tsx"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"c482c8e335ab09b484a04400c265f00642516cdf1e2b77f04b3a7aee8cdb8520"}},{"ruleId":"D1","level":"warning","message":{"text":"admin-api.setupAdminAPI (cyclomatic 19): admin-api.setupAdminAPI has cyclomatic complexity 19 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/utils/admin-api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea330ff28ee98ad8f105aaef8fa97d7fb0efb78c22fa7bb520b4568732aa5420"}},{"ruleId":"D1","level":"warning","message":{"text":"actions.updateCommentLikeState (cyclomatic 19): actions.updateCommentLikeState has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 312, 311). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/actions.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb09540c3cd8b48a5f88e1dc51fb26b17c12a306bb3e72222c5355685c76c407"}},{"ruleId":"D1","level":"warning","message":{"text":"KoenigLexicalEditor.ReactComponent (cyclomatic 19): KoenigLexicalEditor.ReactComponent has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 4 of the 19 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 431, 484, 415, \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":"apps/ember-admin/app/components/koenig-lexical-editor.js"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"382063de08b8d1d6d6d8cb2f84ef5e1f96c994cad51992594728a752015d3a5f"}},{"ruleId":"D1","level":"warning","message":{"text":"MembersCountCacheService.countString (cyclomatic 19): MembersCountCacheService.countString 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":"apps/ember-admin/app/services/members-count-cache.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec0e631aa70b374c41cbcd2ce04409616664acfef4ab28ce5b46212060a87f38"}},{"ruleId":"D1","level":"warning","message":{"text":"input-field.InputField (cyclomatic 19): input-field.InputField 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":"apps/portal/src/components/common/input-field.jsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fb7d55277102d02c581e42b5c4aaa1c125297ac8b3629a5284ff2bfbd44ede"}},{"ruleId":"D1","level":"warning","message":{"text":"plan-step.GiftPlanStep (cyclomatic 19): plan-step.GiftPlanStep has cyclomatic complexity 19 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 9 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift/plan-step.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"744854c0ba26f5846bebadcd189057f45760834ad59d4c84bcb1841cf9f1692f"}},{"ruleId":"D1","level":"warning","message":{"text":"use-share-data.gatherShareData (cyclomatic 19): use-share-data.gatherShareData 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, 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":"apps/portal/src/components/pages/share/use-share-data.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf576f5084ba7d42bbbb6a266905d38f265f6e3741bdd6e53843587424d852bd"}},{"ruleId":"D1","level":"warning","message":{"text":"ContentCSVImporter.processRows (cyclomatic 19): ContentCSVImporter.processRows 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":"ghost/core/core/server/services/content-import/import/importer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ca93f60b449dcb19c594d2549b03a7aaf05672da3df1a4b45d5a0bc84a0678"}},{"ruleId":"D1","level":"warning","message":{"text":"error-handler.themeErrorRenderer (cyclomatic 19): error-handler.themeErrorRenderer 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":"ghost/core/core/frontend/web/middleware/error-handler.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f4aa6b01257d8555d216d8a65a0e472f06e6dbe67d247295361d61f68758202"}},{"ruleId":"D1","level":"warning","message":{"text":"SlackPingService.ping (cyclomatic 19): SlackPingService.ping 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":"ghost/core/core/server/services/slack-ping/slack-ping-service.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"831e65cd90ba1e4ab2ac1b0a692b8e18781d87b487420bb23c5ec46947fc725b"}},{"ruleId":"D1","level":"warning","message":{"text":"onUpdated (cyclomatic 19): onUpdated 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":"ghost/core/core/server/models/post.js"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5ce9070ebe4586581662562e868cf1767f2a6863678b4dfc12cbd5325a49a55"}},{"ruleId":"D1","level":"warning","message":{"text":"getMemberOffers (cyclomatic 19): getMemberOffers 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":1212}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb2172e95953aa19a215f6c2cb2a09fcadb640551652f4889a035d486d5ea58"}},{"ruleId":"D1","level":"warning","message":{"text":"createBatches (cyclomatic 19): createBatches 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":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"afe818712a086d5537ba4687a6b33bbcb763d6d95ae957882463c34754de1c60"}},{"ruleId":"D1","level":"warning","message":{"text":"edit (cyclomatic 19): edit 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":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"36a31fa2117eed2cee94847820ec322e6ea6e3227f36497da70a3c748c068d24"}},{"ruleId":"D1","level":"warning","message":{"text":"ap-avatar.APAvatar (cyclomatic 18): ap-avatar.APAvatar has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/global/ap-avatar.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"8220a045a40ce598c519cb4aa63402ab8ed25f9329afdf6def7a697106e66d0a"}},{"ruleId":"D1","level":"warning","message":{"text":"recommendations.Recommendations (cyclomatic 18): recommendations.Recommendations has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 38, 68). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/sidebar/recommendations.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"917ee5fd628628f5210fa9499b8b366f92ebe83eae3e76470069f37d9039f81b"}},{"ruleId":"D1","level":"warning","message":{"text":"automations.spliceAction (cyclomatic 18): automations.spliceAction 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, 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":"apps/admin-x-framework/src/api/automations.ts"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d4bc4cbc8339ec23e1583397f40c8b51ff1e12205d5724e2790d53b13efbd0"}},{"ruleId":"D1","level":"warning","message":{"text":"overview.Overview (cyclomatic 18): overview.Overview 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 9 function literals inside it that branch (lines 143, 198, 169, \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":"apps/admin/src/analytics/views/stats/overview/overview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"8da6b41fbf3225fbc205ebc6d7229fcf2750ff263b129cbaf1dd3fcd10709d6a"}},{"ruleId":"D1","level":"warning","message":{"text":"growth-sources.GrowthSources (cyclomatic 18): growth-sources.GrowthSources 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":"apps/admin/src/posts/analytics/growth/components/growth-sources.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ef35907e79a6231aad0140d3b393cc29abdb9c23ec699778f4249e69fc9e5b0"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-filter-fields.newsletterAddressing (cyclomatic 18): newsletter-filter-fields.newsletterAddressing 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":"apps/admin/src/members/newsletter-filter-fields.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc108e4141409f6a72cc5eada403e7ec255e6d3e9d14bbbc704febfb148aa369"}},{"ruleId":"D1","level":"warning","message":{"text":"member-add-comp-modal.MemberAddCompModal (cyclomatic 18): member-add-comp-modal.MemberAddCompModal has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 8 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 84, 59, 75, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-add-comp-modal.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ce2bfdbd1d95ba545dab033229ec232cd328054755f39031aaaa0dd5719b01"}},{"ruleId":"D1","level":"warning","message":{"text":"theme-modal.ThemeToolbar (cyclomatic 18): theme-modal.ThemeToolbar 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 4 function literals inside it that branch (lines 160, 211, 87, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d41f5dd2a48e6168b87d3738bdcee67388d78b8cf904ae60d032631a49668702"}},{"ruleId":"D1","level":"warning","message":{"text":"navigation-item-editor.NavigationItemEditor (cyclomatic 18): navigation-item-editor.NavigationItemEditor has cyclomatic complexity 18 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/navigation/navigation-item-editor.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ca96abe74ee881f0e2c0d268ec5c1b4ff3d179508d7c31c5c4dd8e2d32fcd4"}},{"ruleId":"D1","level":"warning","message":{"text":"profile-tab.BasicInputs (cyclomatic 18): profile-tab.BasicInputs 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":"apps/admin/src/settings/general/users/profile-tab.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7bf4a81fb6f78fa0dd6560c2687a7ad9cbaffd487b1fbf142c4be4c438e39fe"}},{"ruleId":"D1","level":"warning","message":{"text":"custom-integration-modal.CustomIntegrationModalContent (cyclomatic 18): custom-integration-modal.CustomIntegrationModalContent has cyclomatic complexity 18 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 8 belong to 7 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":"apps/admin/src/settings/advanced/integrations/custom-integration-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"4457c1744e60be19603124acec6bc028a90143cbb149ee3304f7d42e1af11985"}},{"ruleId":"D1","level":"warning","message":{"text":"tag-image-field.TagImageField (cyclomatic 18): tag-image-field.TagImageField has cyclomatic complexity 18 (threshold 15). Of this number, 10 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":"apps/admin/src/tags/detail/tag-image-field.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"eae642573afed13d11ddef7f61c0334316a4aa86eb8e9157cf04c3bbbbb19efc"}},{"ruleId":"D1","level":"warning","message":{"text":"tag-detail-form.TagDetailForm (cyclomatic 18): tag-detail-form.TagDetailForm 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":"apps/admin/src/tags/detail/tag-detail-form.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c9fef1b151539886d1faeb9314022ab4188e9e27c9f2e81b47f315cc75d7dcd"}},{"ruleId":"D1","level":"warning","message":{"text":"PostsRoute.model (cyclomatic 18): PostsRoute.model 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":"apps/ember-admin/app/routes/posts.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"00908f63603d261ae4dc0550ca6434bb4b11b059b8b52c77373d24d6bb78e3fb"}},{"ruleId":"D1","level":"warning","message":{"text":"products-section.FreeProductCard (cyclomatic 18): products-section.FreeProductCard 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":"apps/portal/src/components/common/products-section.jsx"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"d02397f652f871b97c761eb9492b713e431b8c25aa43ba948bac863c8c7fe1ab"}},{"ruleId":"D1","level":"warning","message":{"text":"recommendations-page.RecommendationsPage (cyclomatic 18): recommendations-page.RecommendationsPage 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, 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":"apps/portal/src/components/pages/recommendations-page.jsx"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82c08b67288adf79aebf857975b9b1c04c73e68721eb5fe8b5f51d03461ac6c"}},{"ruleId":"D1","level":"warning","message":{"text":"filters.FilterDatePicker (cyclomatic 18): filters.FilterDatePicker 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 5 function literals inside it that branch (lines 824, 850, 795, \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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":766}}}],"partialFingerprints":{"codehealthFindingId/v1":"3695fb3142857835e4bf165b2ec20af272473d5ba727bf4cc12a2bf0a9cead6e"}},{"ruleId":"D1","level":"warning","message":{"text":"CacheManager._doGet (cyclomatic 18): CacheManager._doGet 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":"ghost/core/core/shared/settings-cache/cache-manager.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ff4bf5a01b712f687a1c58e1a6fe1dfa209d7cd7310501ce1434f7b5d2fdec6"}},{"ruleId":"D1","level":"warning","message":{"text":"filter.createMetafieldsFilterTransformer (cyclomatic 18): filter.createMetafieldsFilterTransformer 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":"ghost/core/core/server/services/members-metafields/filter.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da144a36eeeeab5d8e4f4e30f80f4cc929478796bd5bea05ca2c78c59f35fa5"}},{"ruleId":"D1","level":"warning","message":{"text":"PostsExporter.filterToString (cyclomatic 18): PostsExporter.filterToString 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":"ghost/core/core/server/services/posts/posts-exporter.js"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbe9d396a498ed6de751facd6e2fbc6c9f2c70d68aa33b074cd9e75763d18c4f"}},{"ruleId":"D1","level":"warning","message":{"text":"ReferrerTranslator.getReferrerDetails (cyclomatic 18): ReferrerTranslator.getReferrerDetails 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":"ghost/core/core/server/services/member-attribution/referrer-translator.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65f2e248021719b06a68da07ac58c4984aa87712bb4314c086ab024e2d3f8b9"}},{"ruleId":"D1","level":"warning","message":{"text":"OEmbedService.fetchOembedData (cyclomatic 18): OEmbedService.fetchOembedData 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":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"e54b0a6ecfec8a817f2a3e96bf5d74ae9e921425da4654984c1f45c728d49eec"}},{"ruleId":"D1","level":"warning","message":{"text":"og-image.getOgImage (cyclomatic 18): og-image.getOgImage 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":"ghost/core/core/frontend/meta/og-image.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"dccb0e62e6b302fb4806fa09457224903735b7196b9fa14595b7f7b921432540"}},{"ruleId":"D1","level":"warning","message":{"text":"twitter-image.getTwitterImage (cyclomatic 18): twitter-image.getTwitterImage 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":"ghost/core/core/frontend/meta/twitter-image.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8e5fbca5b8f40000ff76e914c52f22e27799ba8d15b161dc9933b75c5c3f613"}},{"ruleId":"D1","level":"warning","message":{"text":"pagination.pagination (cyclomatic 18): pagination.pagination 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":"ghost/core/core/frontend/helpers/pagination.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"4704a653422b1c9c1088421ed0ac8ead11f12288d05b902659fc7fd0e3d4c167"}},{"ruleId":"D1","level":"warning","message":{"text":"poll.processStep (cyclomatic 18): poll.processStep 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":"ghost/core/core/server/services/automations/poll.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"44724a75a65d02e9e404ef8781318f0f36e1979c434e14eedd384755cdc26a0e"}},{"ruleId":"D1","level":"warning","message":{"text":"lexical-to-mobiledoc.buildMarkers (cyclomatic 18): lexical-to-mobiledoc.buildMarkers 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 5 function literals inside it that branch (lines 262, 316, 270, \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":"koenig/kg-converters/src/lexical-to-mobiledoc.ts"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc86065c9c21a08db9564ba8bce8a02586526663a15cabdaedb7b49025151dbc"}},{"ruleId":"D1","level":"warning","message":{"text":"#fetchEventsFromDomain (cyclomatic 18): #fetchEventsFromDomain has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, 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":"ghost/core/core/server/services/lib/mailgun-client.js"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"05f4e770323d4e06060d53bca54455e37b3a57cf2c7d4941872da3c6c5ec9b6f"}},{"ruleId":"D1","level":"warning","message":{"text":"use-activity-pub-queries.useFollowMutationForUser (cyclomatic 17): use-activity-pub-queries.useFollowMutationForUser 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 8 function literals inside it that branch (lines 1288, 1417, 1251, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":1231}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e357eb8faeb5ba1ede6ccd3755ee9da84eb9fe76c3adcc0595c9de50f6a981d"}},{"ruleId":"D1","level":"warning","message":{"text":"account-migration.AccountMigration (cyclomatic 17): account-migration.AccountMigration has cyclomatic complexity 17 (threshold 15). 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: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/account-migration.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"9308f6b9129cefc461cd6871cf5f84e04563b30d472ffe34c854e2c41e8ec31c"}},{"ruleId":"D1","level":"warning","message":{"text":"components.Toolbar (cyclomatic 17): components.Toolbar has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 7 of the 17 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 170, 190, 210, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-toolbar/src/components.js"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"b594ed554f744b98b2dc681c28249817d424ceafd94803ce83c594a17b76e6e8"}},{"ruleId":"D1","level":"warning","message":{"text":"members.membersCountString (cyclomatic 17): members.membersCountString 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":"apps/admin-x-framework/src/api/members.ts"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e558dffe22dc8ad2017bf000b5d267d7bef7011a862c20fee1734ad61644a66"}},{"ruleId":"D1","level":"warning","message":{"text":"use-limiter.useLimiter (cyclomatic 17): use-limiter.useLimiter 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 51, 75, 43). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/hooks/use-limiter.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ca78bccfc6fbd9b8ae4c41e0a52eb41008506824b9e4139718930992a7360ae"}},{"ruleId":"D1","level":"warning","message":{"text":"nav-content.NavContent (cyclomatic 17): nav-content.NavContent 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":"apps/admin/src/layout/app-sidebar/nav-content.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b3f2e9b89988e5e0ceefdd241117079861e67bd2a1a813ae6f811516774564"}},{"ruleId":"D1","level":"warning","message":{"text":"use-canvas-viewport.useCanvasViewport (cyclomatic 17): use-canvas-viewport.useCanvasViewport has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 119, 97, 83, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/canvas/use-canvas-viewport.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"477e9fe6bf713b936cf54d7c03cc9d253193366a6a9832e6d2a01a18c28f9107"}},{"ruleId":"D1","level":"warning","message":{"text":"nodes.NodeShell (cyclomatic 17): nodes.NodeShell has cyclomatic complexity 17 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/canvas/nodes.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"af23d0c6ce9ab27c21fb471d9a0b8d67f46c6899db5e6105550f58f7a0fd2d3e"}},{"ruleId":"D1","level":"warning","message":{"text":"comments.CommentsPage (cyclomatic 17): comments.CommentsPage has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/comments.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0889e61e08b6e45c72994f7103a60d17043137d87fcab57cd2628e971365f6c"}},{"ruleId":"D1","level":"warning","message":{"text":"theme-setting.ThemeSetting (cyclomatic 17): theme-setting.ThemeSetting 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, 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":"apps/admin/src/settings/site/design-and-branding/theme-setting.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6c6d768ce115a191762bc64b4c684546c2a52c5d70b35f86a9d277a9ac7c1f6"}},{"ruleId":"D1","level":"warning","message":{"text":"newsletter-detail-modal.NewsletterDetailModalContent (cyclomatic 17): newsletter-detail-modal.NewsletterDetailModalContent 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 2 function literals inside it that branch (lines 1040, 1024). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9bfb6fd52cd8554852130011586f2c6c4dfa97bda4ee178d495d8871f27dc8"}},{"ruleId":"D1","level":"warning","message":{"text":"offers-index.OffersIndexModal (cyclomatic 17): offers-index.OffersIndexModal has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 363, 472, 350, \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":"apps/admin/src/settings/growth/offers/offers-index.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22bc21fb784a9af4cda0d4dc5c1f28f14320a8a23e094453d0053c6077cadba"}},{"ruleId":"D1","level":"warning","message":{"text":"label-picker.ComboboxPicker (cyclomatic 17): label-picker.ComboboxPicker has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 7 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 325, 289, 316, \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":"apps/admin/src/members/label-picker/label-picker.tsx"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"88af2ce5ec5ab88c65bf4808e635d3f8e4acc6c98df56da525a58c5c7efb600d"}},{"ruleId":"D1","level":"warning","message":{"text":"emails.EmailsGroup (cyclomatic 17): emails.EmailsGroup 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 3 function literals inside it that branch (lines 119, 108, 102). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/emails.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cd595d72e7c929f4913879b15f833443e6d06f5ee645fd5bdc89890a8f5d068"}},{"ruleId":"D1","level":"warning","message":{"text":"search.useSearchService (cyclomatic 17): search.useSearchService has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 80, 108, 37, \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":"apps/admin/src/settings/utils/search.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3be8cbcdae8fa3098eaa4ec921369cf6be0fd8094633db235e3e0e5cb3b1976"}},{"ruleId":"D1","level":"warning","message":{"text":"relative-date-filter.RelativeDateFilter (cyclomatic 17): relative-date-filter.RelativeDateFilter has cyclomatic complexity 17 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/filters/relative-date-filter.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"38513c74f47c2a10d112d4e0162829c4f151a64b9f6879a52f601be5bf33b312"}},{"ruleId":"D1","level":"warning","message":{"text":"content.Content (cyclomatic 17): content.Content has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, 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":"apps/comments-ui/src/components/content/content.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c45b88a4eeb181e64cccd3c85f4f56047ea4b6317c43869ff06b802d2fe8abd"}},{"ruleId":"D1","level":"warning","message":{"text":"GhKoenigEditorLexical.onTitleKeydown (cyclomatic 17): GhKoenigEditorLexical.onTitleKeydown 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":"apps/ember-admin/app/components/gh-koenig-editor-lexical.js"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"63e9dc73822bff8393da1e901731a4598a7700ea336193927a7d6feefe5d5060"}},{"ruleId":"D1","level":"warning","message":{"text":"ajaxService._makeRequest (cyclomatic 17): ajaxService._makeRequest 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":"apps/ember-admin/app/services/ajax.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cc6b49583a50f399242d8a01d236ef1ec3ef728235cd42d5592d6bbee9c012e"}},{"ruleId":"D1","level":"warning","message":{"text":"ajaxService.handleResponse (cyclomatic 17): ajaxService.handleResponse 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":"apps/ember-admin/app/services/ajax.js"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"187ce00bbcd0915134854dd9c6cc63ab5a9e383e54e0241362df5028aec266ed"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.validateNavigationItems (cyclomatic 17): settings.validateNavigationItems has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to one function literal inside it that branches (line 71). 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":"ghost/core/core/server/api/endpoints/utils/validators/input/settings.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc0c59bb463a176390c8dc3466890ae412a8ee80df85b49864e15abf4beeab37"}},{"ruleId":"D1","level":"warning","message":{"text":"Base.replaceIdentifiers (cyclomatic 17): Base.replaceIdentifiers has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 195, 187). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/base.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"14bb5d67eef41e35194223fa55256ee22927997b18f0274feb53e2edeae7cdca"}},{"ruleId":"D1","level":"warning","message":{"text":"PostsImporter.beforeImport (cyclomatic 17): PostsImporter.beforeImport has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 253, 290, 321). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/posts-importer.js"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2b9283d32f697b25f01df9a94570bbb956c76daf5611980bee27aa4f3de5d97"}},{"ruleId":"D1","level":"warning","message":{"text":"post_class.post_class (cyclomatic 17): post_class.post_class 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":"ghost/core/core/frontend/helpers/post_class.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b75a5bc19fee1bb84f84e1f41a13188961306fad4e7a9176b96fc7d0c56280c0"}},{"ruleId":"D1","level":"warning","message":{"text":"serve-public-file.createPublicFileMiddleware (cyclomatic 17): serve-public-file.createPublicFileMiddleware 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 73, 46, 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":"ghost/core/core/frontend/web/routers/serve-public-file.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b62cde9a1af5bf33419fe97b57d9eb3790b2448d235d88c330469662d566b5c3"}},{"ruleId":"D1","level":"warning","message":{"text":"upload.mediaValidation (cyclomatic 17): upload.mediaValidation has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to one function literal inside it that branches (line 409). 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":"ghost/core/core/server/web/api/middleware/upload.js"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"291618ce2665eeb8d075f648d461bdc15e41098dea3e4226bfe71022bddf4941"}},{"ruleId":"D1","level":"warning","message":{"text":"middleware.tokenPermissionCheck (cyclomatic 17): middleware.tokenPermissionCheck 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":"ghost/core/core/server/web/api/endpoints/admin/middleware.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c58148e9372969fb42c9929ffcbdad1c337474db67a9b432a8d7ec927fe5ec4"}},{"ruleId":"D1","level":"warning","message":{"text":"http.http (cyclomatic 17): http.http has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 23, 96). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/api-framework/lib/http.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"459ef7c30157dbc3d87608dc9bbeae3b625a9cd14206547447ad223c105404e0"}},{"ruleId":"D1","level":"warning","message":{"text":"check-internal-packages.checkInternalPackages (cyclomatic 17): check-internal-packages.checkInternalPackages has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-internal-packages.js"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"480559eb17999aa58ba427ccefc296d6f94356a59585e2d8267ab354a9e9ab06"}},{"ruleId":"D1","level":"warning","message":{"text":"getMemberStatusText (cyclomatic 17): getMemberStatusText 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":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":883}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c9f290f13fb73d86a01858d9175fc49c75a92702dd25234711071f87aecd5bf"}},{"ruleId":"D1","level":"warning","message":{"text":"onSaving (cyclomatic 17): onSaving has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"29bed82de70f67b181f711acaea5f22dacf0dce807158cff0265be92f724e9d7"}},{"ruleId":"D1","level":"warning","message":{"text":"attachSubscriptionsToMember (cyclomatic 17): attachSubscriptionsToMember has cyclomatic complexity 17 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 2 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":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8abfd331c2c5eae78d4d1a5b2b88a80eb0e3797fcb8aa010235d2474e622e08"}},{"ruleId":"D1","level":"warning","message":{"text":"fetchBookmarkData (cyclomatic 17): fetchBookmarkData 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 9 function items inside it that branch (pickFn, pickBiggest::(anonymous), pickFn::(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":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee35b9ed05fb83de30196f31a486f00b9abed288d538f4b92ccb0072f0145242"}},{"ruleId":"D1","level":"warning","message":{"text":"handleDonationEvent (cyclomatic 17): handleDonationEvent 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":"ghost/core/core/server/services/stripe/services/webhook/checkout-session-event-service.js"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"5add4947eca00486451c2c4c1e5d87b01c69da16ed84142a8fb39dd5044ea5ab"}},{"ruleId":"D1","level":"warning","message":{"text":"send (cyclomatic 17): send 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":"ghost/core/core/server/services/lib/mailgun-client.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2009384a7ac6169164a4eef65aa43a3c6f51bd385a44ebe1ff301636d70309f"}},{"ruleId":"D1","level":"warning","message":{"text":"mediaValidation::mediaUploadValidation (cyclomatic 17): mediaValidation::mediaUploadValidation 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":"ghost/core/core/server/web/api/middleware/upload.js"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"36207911dbdc41a965bcaf4311e9fefeaaf1b4d6a6bda290f29cc407e5dacf13"}},{"ruleId":"D1","level":"warning","message":{"text":"_getImageSizeFromUrl (cyclomatic 17): _getImageSizeFromUrl has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 207, 198). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/lib/image/image-size.js"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffcf783fc19eb23b5fa98b4ace3c5afbcf271483f8838ce4621b3ad02ce03c26"}},{"ruleId":"D1","level":"warning","message":{"text":"paid-subscription-change-chart.fillMissingDataPoints (cyclomatic 16): paid-subscription-change-chart.fillMissingDataPoints 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":"apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0fb575672767943f36e2f67602ccaf38301812b64a1474e47c373df3af4f8a7"}},{"ruleId":"D1","level":"warning","message":{"text":"admin-layout.AdminLayout (cyclomatic 16): admin-layout.AdminLayout 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":"apps/admin/src/layout/admin-layout.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"322539211b6f4e01b403039e3a669f52069e368e1b81539c7e3f49de8f3408d9"}},{"ruleId":"D1","level":"warning","message":{"text":"email-preview.EmailPreview (cyclomatic 16): email-preview.EmailPreview 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":"apps/admin/src/editor/preview/email-preview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"b16e89d14023b7934c378bd27a5e39b345436317b36fef4720f5390056eb5a1c"}},{"ruleId":"D1","level":"warning","message":{"text":"content-text.renderedTextOf (cyclomatic 16): content-text.renderedTextOf has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/content-text.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ace141147b8dcbf7f19a24b2ba0c89a3dd651b241d3fce451df01af6a0f1b9"}},{"ruleId":"D1","level":"warning","message":{"text":"mapping.detectFieldTypes (cyclomatic 16): mapping.detectFieldTypes 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":"apps/admin/src/members/components/bulk-action-modals/import-members/mapping.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb573d653993cbe2b1a365d08a8447ebdbded4a6cdc2c317e09bebba8bd5af8a"}},{"ruleId":"D1","level":"warning","message":{"text":"members-list.MembersList (cyclomatic 16): members-list.MembersList 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 7 function literals inside it that branch (lines 115, 131, 89, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/members-list.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4daa44c9b0e354ca160c87cf6795a42daa4b8aa550600e54cdcc9aab9ebaabf7"}},{"ruleId":"D1","level":"warning","message":{"text":"member-actions-menu.MemberActionsMenu (cyclomatic 16): member-actions-menu.MemberActionsMenu has cyclomatic complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, 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":"apps/admin/src/members/detail/member-actions-menu.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"75fc09d730d704d2926efcaacd90db6d3c7f7d4d4fda9e751efa8322a324b1d7"}},{"ruleId":"D1","level":"warning","message":{"text":"member-custom-fields-field.MemberCustomFieldEditModal (cyclomatic 16): member-custom-fields-field.MemberCustomFieldEditModal has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 253, 287, 298, \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":"apps/admin/src/members/detail/member-custom-fields-field.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a60d195b9e70effa8b3489a983d73aaba9aa7a483cbb945e9b277790cca5b2b"}},{"ruleId":"D1","level":"warning","message":{"text":"stripe-connect-modal.Connect (cyclomatic 16): stripe-connect-modal.Connect 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 2 function literals inside it that branch (lines 89, 122). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"b47737c3d019a517615c71ac9a84a22e62e998bf1b7126267bc81805e3c3e5f3"}},{"ruleId":"D1","level":"warning","message":{"text":"tag-detail-edit.buildTagSavePayload (cyclomatic 16): tag-detail-edit.buildTagSavePayload 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":"apps/admin/src/tags/detail/tag-detail-edit.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"10fcfa474ffaf4540459c71466013295b9512442089721ab96a244e83f668b32"}},{"ruleId":"D1","level":"warning","message":{"text":"use-global-search.useGlobalSearch (cyclomatic 16): use-global-search.useGlobalSearch 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, 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":"apps/admin/src/global-search/use-global-search.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c30f242eb84a8f49099a304fecb8dbe7a6f188bf56271aa47aaa1fa4061afba"}},{"ruleId":"D1","level":"warning","message":{"text":"use-theme.useTheme (cyclomatic 16): use-theme.useTheme has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 65, 108, 101, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/hooks/use-theme.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"fecc7e784ad3e38b879d2276e1a555792ffa8d154433256937291bc2fc133e89"}},{"ruleId":"D1","level":"warning","message":{"text":"label-picker.LabelListItems (cyclomatic 16): label-picker.LabelListItems has cyclomatic complexity 16 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/label-picker/label-picker.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a40840f6540b8c3c5b649bae5d35fa12a19b12db6efaeb06f38d410fd933512"}},{"ruleId":"D1","level":"warning","message":{"text":"label-filter-renderer.LabelFilterRenderer (cyclomatic 16): label-filter-renderer.LabelFilterRenderer 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 5 function literals inside it that branch (lines 53, 33, 114, \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":"apps/admin/src/members/label-picker/label-filter-renderer.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0e5f175a833d7f9f64d9e689c8f69f79f7d9dded48e3502188e5a4f5394ddb5"}},{"ruleId":"D1","level":"warning","message":{"text":"confirmation-modal.ConfirmationModalContent (cyclomatic 16): confirmation-modal.ConfirmationModalContent 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, 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":"apps/admin/src/settings/components/confirmation-modal.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1733f369d21ee04a43adb4203e4fef87f627c756f6f8b12ed50ad1aaaad42667"}},{"ruleId":"D1","level":"warning","message":{"text":"scroll-section-provider.ScrollSectionProvider (cyclomatic 16): scroll-section-provider.ScrollSectionProvider has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 140, 170, 182, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/hooks/scroll-section-provider.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"58802145fbb0e8fcc66e727a878e2882831160704604b00293eeb71e69116f2f"}},{"ruleId":"D1","level":"warning","message":{"text":"stats-filter.StatsFilter (cyclomatic 16): stats-filter.StatsFilter has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/analytics/stats-filter.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c618567807902f3f28799d77c41a1b44c3f8fad0c84627a0c9967fe2c6f5e28"}},{"ruleId":"D1","level":"warning","message":{"text":"comment.PublishedComment (cyclomatic 16): comment.PublishedComment has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/content/comment.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"435e90c343581dc4bc0943cbb37d9bbad81d7f55716fae14459f94188a406792"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectionList.shiftItem (cyclomatic 16): SelectionList.shiftItem 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":"apps/ember-admin/app/components/posts-list/selection-list.js"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac43728ca1606cf68d04eeb14925c112de8e51ce0cf61144f67fd40825cb7706"}},{"ruleId":"D1","level":"warning","message":{"text":"NotificationsService._showAPIError (cyclomatic 16): NotificationsService._showAPIError 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":"apps/ember-admin/app/services/notifications.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad836d57906fbbef47104498f9f6a12313ab5d5f164a4a17a5e763e8e34fe7eb"}},{"ruleId":"D1","level":"warning","message":{"text":"account-email-page.AccountEmailPage (cyclomatic 16): account-email-page.AccountEmailPage has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 43, 30, 120, \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":"apps/portal/src/components/pages/account-email-page.jsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"708ba835d746f85081c333ac6209f344af44408a971376523a1c693a6b91cc1f"}},{"ruleId":"D1","level":"warning","message":{"text":"filters.FiltersTrigger (cyclomatic 16): filters.FiltersTrigger 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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":2865}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfcea4841e92f92ee959a682f849a19cab1af8e704a359915f53f9f93828a4f7"}},{"ruleId":"D1","level":"warning","message":{"text":"MetafieldDefinitionsService.edit (cyclomatic 16): MetafieldDefinitionsService.edit 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":"ghost/core/core/server/services/members-metafields/definitions-service.ts"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3fe9f04c835845bc96f164e9183c31ad7a3917aabf4399ef08dc349ff7930a"}},{"ruleId":"D1","level":"warning","message":{"text":"GiftService.reassignRedeemer (cyclomatic 16): GiftService.reassignRedeemer 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 1077). 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":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":1071}}}],"partialFingerprints":{"codehealthFindingId/v1":"01afd5d6667880325a69f834ab6f1dbbf186b12a8c46c9682bea01f31cb93826"}},{"ruleId":"D1","level":"warning","message":{"text":"get-discount-window.getDiscountWindow (cyclomatic 16): get-discount-window.getDiscountWindow 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":"ghost/core/core/server/services/members/members-api/utils/get-discount-window.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"695a4fbf4736c512af945bb5a20c94716b0ebc8e2b8620fe49f753aa46b56a73"}},{"ruleId":"D1","level":"warning","message":{"text":"ProductsImporter.populatePriceData (cyclomatic 16): ProductsImporter.populatePriceData has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to one function literal inside it that branches (line 35). 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":"ghost/core/core/server/data/importer/importers/data/products-importer.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"53fc1806d7036bd103aab05738bfbc96186609b1c8c3b998bef95e41735fff7d"}},{"ruleId":"D1","level":"warning","message":{"text":"structured-data.getStructuredData (cyclomatic 16): structured-data.getStructuredData has cyclomatic complexity 16 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/structured-data.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb0b7f8ff806e25634e3ea413dc2d94af67af2a5d695090d1a72021d0e31203a"}},{"ruleId":"D1","level":"warning","message":{"text":"asset-url.getAssetUrl (cyclomatic 16): asset-url.getAssetUrl 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":"ghost/core/core/frontend/meta/asset-url.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f39a880e6e6e8ca1355c2dcc6760e1892c70c1d174aca6b6ea03dbd0f2e031"}},{"ruleId":"D1","level":"warning","message":{"text":"get.querySimplePath (cyclomatic 16): get.querySimplePath 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":"ghost/core/core/frontend/helpers/get.js"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"034a264b21e59653de3de4ddfe5d42c1d17d57b7b227491f17a227ad3986f6da"}},{"ruleId":"D1","level":"warning","message":{"text":"tags.tags (cyclomatic 16): tags.tags 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":"ghost/core/core/frontend/helpers/tags.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6183c0a86afeacb22ccff87f92d18793ad12c38bad64293136070c0396afce69"}},{"ruleId":"D1","level":"warning","message":{"text":"SiteMapManager.constructor (cyclomatic 16): SiteMapManager.constructor has cyclomatic complexity 16 (threshold 15). Of this number, 10 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":"ghost/core/core/frontend/services/sitemap/site-map-manager.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7e8615c260b6c744489135c35ffdae597e0cdef209ff700e0be1c8fa4d03a71"}},{"ruleId":"D1","level":"warning","message":{"text":"mobiledoc-to-lexical.populateLexicalNodeWithMarkers (cyclomatic 16): mobiledoc-to-lexical.populateLexicalNodeWithMarkers has cyclomatic complexity 16 (threshold 15). 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, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-converters/src/mobiledoc-to-lexical.ts"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2c2215a8a093b0c5c32682012ac732a8b5a682066204a2253a6303cb575778b"}},{"ruleId":"D1","level":"warning","message":{"text":"edit (cyclomatic 16): edit 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b38498f2368cd3a25769a226abdc45488d8dac934d1a483dc7dc89c4636faae"}},{"ruleId":"D1","level":"warning","message":{"text":"retryDb (cyclomatic 16): retryDb 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":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":1031}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2dfd7fdb3978faeac602de48918e819adde8e8d8e28e301ddc88198ecd0c89"}},{"ruleId":"D1","level":"warning","message":{"text":"setupGhostApi::checkoutGift (cyclomatic 16): setupGhostApi::checkoutGift 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":"apps/portal/src/utils/api.js"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"95de75a1ba6b3c96b95a0d883821dcfa0860b4e1fffd7944a753247da620c7d6"}},{"ruleId":"D1","level":"warning","message":{"text":"reportBillingAppLoadFailure (cyclomatic 16): reportBillingAppLoadFailure 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":"apps/ember-admin/app/services/billing.js"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d125a049324badff4adcb5e0060ea75c020aefad6ca57575ea5a31d799de68"}},{"ruleId":"D1","level":"warning","message":{"text":"nodeLibConfig (cyclomatic 16): nodeLibConfig 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":"configs/eslint/index.mjs"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc405f952987d495c13c6f6b99887e61fdf78f2076248517e46a9f17ca22b4a6"}},{"ruleId":"D1","level":"warning","message":{"text":"get (cyclomatic 16): get has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs 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":"ghost/core/core/server/adapters/lib/redis/AdapterCacheRedis.js"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5577bb038320521bf5583c47dd1ac74c967d552a2534a1f34009578e9dbab6"}},{"ruleId":"D1","level":"warning","message":{"text":"#runARRQueries (cyclomatic 16): #runARRQueries has cyclomatic complexity 16 (threshold 15). Of this number, 15 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":"ghost/core/core/server/services/milestones/milestones-service.js"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbba3becbe8bea97436735c5f6a5224a542e07067dde4b56583f4c36c65eb91"}},{"ruleId":"D2","level":"warning","message":{"text":"linkSubscription (cognitive 191): linkSubscription has cognitive complexity 191 (threshold 15). Drivers by points: if/else 55 (112 pts), boolean chains 30, ternaries 9 (15 pts), error handling 5 (14 pts), other 12, loops 4 (8 pts) (nesting depth added 76). Of this number, 179 points are the body\u0027s own statements and 12 belong to 11 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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":1223}}}],"partialFingerprints":{"codehealthFindingId/v1":"9364ad15a7281afb75f4dbdb60fbc4ea4ab62cbc095ad840c4890dc551670241"}},{"ruleId":"D2","level":"warning","message":{"text":"save-engine.createSaveEngine (cognitive 149): save-engine.createSaveEngine has cognitive complexity 149 (threshold 15). Drivers by points: if/else 75 (93 pts), boolean chains 28, ternaries 8 (12 pts), loops 8 (9 pts), error handling 5 (7 pts) (nesting depth added 25). Of this number, 135 points are the body\u0027s own statements and 14 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/save-engine.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"8509b9ecaa88ef1b02ea9d370bdd76618a4e1032ada632124fc15bf327ee6c33"}},{"ruleId":"D2","level":"warning","message":{"text":"onSaving (cognitive 135): onSaving has cognitive complexity 135 (threshold 15). Drivers by points: if/else 49 (71 pts), boolean chains 50, loops 3 (6 pts), error handling 2 (4 pts), ternaries 1 (3 pts), other 1 (nesting depth added 29). Of this number, 123 points are the body\u0027s own statements and 12 belong to 14 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/post.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"29eb00d9d0442e197037f66f461036b487e2514025178e9d21fbf57014d5755a"}},{"ruleId":"D2","level":"warning","message":{"text":"theme-code-editor-modal.ThemeCodeEditorModal (cognitive 127): theme-code-editor-modal.ThemeCodeEditorModal has cognitive complexity 127 (threshold 15). Drivers by points: if/else 55 (70 pts), ternaries 21 (28 pts), boolean chains 24, loops 3, error handling 2 (nesting depth added 22). Of this number, 16 points are the body\u0027s own statements and 111 belong to 19 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":"apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"3888268360de889ee35685e41f8346e1dde157dfc3435f16b866bf37211965ef"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersCSVImporter.writeRows (cognitive 93): MembersCSVImporter.writeRows has cognitive complexity 93 (threshold 15). Drivers by points: if/else 25 (61 pts), ternaries 6 (16 pts), error handling 4 (11 pts), boolean chains 4, loops 1 (nesting depth added 53). Of this number, 89 points are the body\u0027s own statements and 4 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":"ghost/core/core/server/services/members/import-export/import/importer.ts"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6ce5ec72fa177f80679a7ba91e65535e5c242e17657e002d449197cdad5585"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter-preview-content.NewsletterPreviewContent (cognitive 92): newsletter-preview-content.NewsletterPreviewContent has cognitive complexity 92 (threshold 15). Drivers by points: boolean chains 79, if/else 7, ternaries 6. 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":"apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"831e0e6e2b66c34b77660feb678b1abdfc129fe262f5042bd44d4b722a30e11e"}},{"ruleId":"D2","level":"warning","message":{"text":"new-note-modal.NewNoteModal (cognitive 87): new-note-modal.NewNoteModal has cognitive complexity 87 (threshold 15). Drivers by points: if/else 31 (44 pts), boolean chains 22, ternaries 14 (15 pts), match/switch 1 (3 pts), error handling 2, loops 1 (nesting depth added 16). Of this number, 23 points are the body\u0027s own statements and 64 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":"apps/activitypub/src/components/modals/new-note-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"afb953faf7f806bfc4c2b857f01678707595910f8203627b69ce635f4478a4bb"}},{"ruleId":"D2","level":"warning","message":{"text":"filters.FilterValueSelector (cognitive 87): filters.FilterValueSelector has cognitive complexity 87 (threshold 15). Drivers by points: boolean chains 37, if/else 19 (24 pts), ternaries 10 (22 pts), match/switch 2 (4 pts) (nesting depth added 19). Of this number, 74 points are the body\u0027s own statements and 13 belong to 9 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":2182}}}],"partialFingerprints":{"codehealthFindingId/v1":"607b27264c9f45ed1a96d81bcbecf28af55666d27ab9b52a5781f38f61af8f9d"}},{"ruleId":"D2","level":"warning","message":{"text":"tier-detail-modal.TierDetailModalContent (cognitive 85): tier-detail-modal.TierDetailModalContent has cognitive complexity 85 (threshold 15). Drivers by points: boolean chains 37, if/else 21 (25 pts), ternaries 16 (23 pts) (nesting depth added 11). Of this number, 41 points are the body\u0027s own statements and 44 belong to 19 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":"apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fe0327b3bed960673fc6d9c84be806fe21f0d53271d6bd980a7479edb6693be"}},{"ruleId":"D2","level":"warning","message":{"text":"domain.Domain (cognitive 84): domain.Domain has cognitive complexity 84 (threshold 15). Drivers by points: ternaries 20 (37 pts), boolean chains 34, if/else 9, error handling 4 (nesting depth added 17). Of this number, 66 points are the body\u0027s own statements and 18 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":"apps/activitypub/src/views/preferences/components/domain.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d7b725042ed004fabce61b171165eb44b2e12297cd4373490af64c570a79dc"}},{"ruleId":"D2","level":"warning","message":{"text":"editor-session.createEditorSession (cognitive 82): editor-session.createEditorSession has cognitive complexity 82 (threshold 15). Drivers by points: if/else 35 (41 pts), boolean chains 24, ternaries 9, loops 5, error handling 2 (3 pts) (nesting depth added 7). Of this number, 63 points are the body\u0027s own statements and 19 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/editor-session.ts"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbce809ff1937d08c8ccb893eb59e59771e2d0e57707e4943bd96af1c63987e2"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 79): update has cognitive complexity 79 (threshold 15). Drivers by points: if/else 29 (52 pts), boolean chains 13, loops 7 (11 pts), other 2, ternaries 1 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ac0e3e1048b75c1fa9b2ee628197dcc944ebddb64e0b2926e92742ea7494be6"}},{"ruleId":"D2","level":"warning","message":{"text":"feed-item.FeedItem (cognitive 77): feed-item.FeedItem has cognitive complexity 77 (threshold 15). Drivers by points: boolean chains 41, if/else 20 (23 pts), ternaries 10 (13 pts) (nesting depth added 6). Of this number, 43 points are the body\u0027s own statements and 34 belong to 15 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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7cb89f86809a762c01117e5e61c12ffebe4cd921d3d227a780c0d2234a3181f"}},{"ruleId":"D2","level":"warning","message":{"text":"reader.Reader (cognitive 77): reader.Reader has cognitive complexity 77 (threshold 15). Drivers by points: boolean chains 42, if/else 26 (30 pts), ternaries 3, error handling 1, loops 1 (nesting depth added 4). Of this number, 42 points are the body\u0027s own statements and 35 belong to 16 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":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"6915f98b971a3868452f977ff99a8fa8930340343525a01c6e07f3fc8c67c5e7"}},{"ruleId":"D2","level":"warning","message":{"text":"ghost_head (cognitive 75): ghost_head has cognitive complexity 75 (threshold 15). Drivers by points: if/else 32 (54 pts), boolean chains 12, ternaries 6, error handling 2, other 1 (nesting depth added 22). Of this number, 74 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":"ghost/core/core/frontend/helpers/ghost_head.js"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96d4cfbd292af8322008cb2e988cd36204178dd97658bf6ab373ee05ed07139"}},{"ruleId":"D2","level":"warning","message":{"text":"add-offer-modal.AddOfferModal (cognitive 72): add-offer-modal.AddOfferModal has cognitive complexity 72 (threshold 15). Drivers by points: boolean chains 37, if/else 23 (25 pts), ternaries 9, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 9 of the 72 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 540, 748, 817, \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":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a282344316dfcd1d9ad34dbc038b7348556ef31e1c1534c08aea6dc57fa007d"}},{"ruleId":"D2","level":"warning","message":{"text":"tag-detail.TagDetail (cognitive 71): tag-detail.TagDetail has cognitive complexity 71 (threshold 15). Drivers by points: if/else 34 (36 pts), boolean chains 28, ternaries 6, loops 1 (nesting depth added 2). Of this number, 29 points are the body\u0027s own statements and 42 belong to 13 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f0b8709a7b225d02926ce19aa941868bf51c20e98d3899241a5fc1c23bf8ef"}},{"ruleId":"D2","level":"warning","message":{"text":"gift-page.GiftPage (cognitive 71): gift-page.GiftPage has cognitive complexity 71 (threshold 15). Drivers by points: boolean chains 28, if/else 24 (27 pts), ternaries 15, loops 1 (nesting depth added 3). Of this number, 28 points are the body\u0027s own statements and 43 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":"apps/portal/src/components/pages/gift-page.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"de3254e5ffb6affe677d1ea1cb06c90aeaaf560b8f2d75eadeda89f9f28d7cb7"}},{"ruleId":"D2","level":"warning","message":{"text":"filters.ResolvedSelectOptionsPopover (cognitive 70): filters.ResolvedSelectOptionsPopover has cognitive complexity 70 (threshold 15). Drivers by points: if/else 29 (48 pts), boolean chains 10, ternaries 5 (10 pts), loops 1 (2 pts) (nesting depth added 25). Of this number, 16 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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e3731b84635fdb1aac51cdcee42177536cd803af8cc3ad4bea34685d417a7f"}},{"ruleId":"D2","level":"warning","message":{"text":"user-detail-modal.UserDetailModalContent (cognitive 69): user-detail-modal.UserDetailModalContent has cognitive complexity 69 (threshold 15). Drivers by points: boolean chains 26, ternaries 17 (18 pts), if/else 14 (17 pts), error handling 5 (6 pts), match/switch 2 (nesting depth added 5). Of this number, 31 points are the body\u0027s own statements and 38 belong to 13 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"66061ea5336c37ec925e455e7ba0815e7281c35ba52b82e67cd77050ae56cc87"}},{"ruleId":"D2","level":"warning","message":{"text":"ProductRepository.update (cognitive 69): ProductRepository.update has cognitive complexity 69 (threshold 15). Drivers by points: if/else 27 (47 pts), boolean chains 10, loops 2 (6 pts), ternaries 1 (4 pts), error handling 1 (2 pts) (nesting depth added 28). Of this number, 68 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":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"107b02cb1eb675dd0e82ebb7290fd35a22cdc913fe796234428f8e20321930b8"}},{"ruleId":"D2","level":"warning","message":{"text":"posts.default (cognitive 69): posts.default has cognitive complexity 69 (threshold 15). Drivers by points: if/else 29 (45 pts), boolean chains 21, ternaries 3 (nesting depth added 16). Of this number, 49 points are the body\u0027s own statements and 20 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"244c5cfb5627f346d4421fa36e0b9c891bddb3b1eb6bce9e0979b9b3af5d4b41"}},{"ruleId":"D2","level":"warning","message":{"text":"member-detail.MemberDetailPage (cognitive 67): member-detail.MemberDetailPage has cognitive complexity 67 (threshold 15). Drivers by points: boolean chains 30, if/else 21 (23 pts), ternaries 11 (14 pts) (nesting depth added 5). Of this number, 38 points are the body\u0027s own statements and 29 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-detail.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e21ee817314f3d06ce1c9d86493ceb1b562ddfaa63513094f96b918b73fb235"}},{"ruleId":"D2","level":"warning","message":{"text":"global-settings.GlobalSettings (cognitive 67): global-settings.GlobalSettings has cognitive complexity 67 (threshold 15). Drivers by points: boolean chains 33, if/else 27 (28 pts), ternaries 5, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 15 of the 67 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 149, 109, 400, \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":"apps/admin/src/settings/site/design-and-branding/global-settings.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"aff201dc727c640edc5cb032c07851bef907f092157e569376e9dc0d1622886d"}},{"ruleId":"D2","level":"warning","message":{"text":"App.fetchLinkData (cognitive 67): App.fetchLinkData has cognitive complexity 67 (threshold 15). Drivers by points: if/else 17 (26 pts), ternaries 11 (24 pts), boolean chains 17 (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":"apps/portal/src/app.jsx"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8e7d0713a04599e15b982fb2262c8731a3069cc2a29ddc038b1a2c0ddadb746"}},{"ruleId":"D2","level":"warning","message":{"text":"notifications.Notifications (cognitive 66): notifications.Notifications has cognitive complexity 66 (threshold 15). Drivers by points: boolean chains 44, if/else 10 (15 pts), ternaries 2 (6 pts), match/switch 1 (nesting depth added 9). Of this number, 42 points are the body\u0027s own statements and 24 belong to 7 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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c35db310e9fb30276af3168128108eefa8899350c22a4f3300695d92fab378"}},{"ruleId":"D2","level":"warning","message":{"text":"post-preview-modal.PostPreviewModal (cognitive 65): post-preview-modal.PostPreviewModal has cognitive complexity 65 (threshold 15). Drivers by points: boolean chains 36, ternaries 11 (15 pts), if/else 12 (13 pts), error handling 1 (nesting depth added 5). Of this number, 44 points are the body\u0027s own statements and 21 belong to 11 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":"apps/admin/src/editor/preview/post-preview-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"074dd17c503b793230b68c6e8a6cd1d3d09e18e58bff7f4949b3d1a643197c9a"}},{"ruleId":"D2","level":"warning","message":{"text":"slug-machine.createSlugMachine (cognitive 65): slug-machine.createSlugMachine has cognitive complexity 65 (threshold 15). Drivers by points: if/else 33 (44 pts), boolean chains 9, error handling 3 (6 pts), ternaries 4 (5 pts), loops 1 (nesting depth added 15). Most of this is not in the body itself: 8 of the 65 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 358, 263, 297, \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":"apps/admin/src/editor/engine/slug-machine.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0bbaa4f097b740fece3365a0c9ca6b72522694fc42d4810d30033a6ff99f5e7"}},{"ruleId":"D2","level":"warning","message":{"text":"service.createLlmsService (cognitive 65): service.createLlmsService has cognitive complexity 65 (threshold 15). Drivers by points: if/else 16 (26 pts), boolean chains 19, ternaries 11 (14 pts), loops 4 (6 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":"ghost/core/core/frontend/services/llms/service.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f14cf946547fa8995fc8bb1b4fe79f52448da6fce280bdcebbc2b190d46c9e"}},{"ruleId":"D2","level":"warning","message":{"text":"edit-retention-offer-modal.EditRetentionOfferModal (cognitive 64): edit-retention-offer-modal.EditRetentionOfferModal has cognitive complexity 64 (threshold 15). Drivers by points: boolean chains 30, if/else 21 (26 pts), ternaries 7, error handling 1 (nesting depth added 5). Most of this is not in the body itself: 8 of the 64 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 586, 675, 563, \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":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"d008c86f9ce68a7b07ebbb6b3039335b82e1c46467c8f3b0f328c52c47919219"}},{"ruleId":"D2","level":"warning","message":{"text":"filters.Filters (cognitive 64): filters.Filters has cognitive complexity 64 (threshold 15). Drivers by points: boolean chains 34, if/else 24 (28 pts), ternaries 2 (nesting depth added 4). Of this number, 18 points are the body\u0027s own statements and 46 belong to 18 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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":2947}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e27a8c29ea8652f17ef80bb041146d28f04baca73dbaa4aa091d490329229ef"}},{"ruleId":"D2","level":"warning","message":{"text":"member-activity.ActivityPage (cognitive 62): member-activity.ActivityPage has cognitive complexity 62 (threshold 15). Drivers by points: ternaries 11 (30 pts), boolean chains 22, if/else 5 (10 pts) (nesting depth added 24). Of this number, 43 points are the body\u0027s own statements and 19 belong to 6 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":"apps/admin/src/members/activity/member-activity.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9626ece70ad23470d1ab9e3df10a4916f511a9d7997858c866257e13de39069"}},{"ruleId":"D2","level":"warning","message":{"text":"mapping-step.MappingStep (cognitive 60): mapping-step.MappingStep has cognitive complexity 60 (threshold 15). Drivers by points: boolean chains 28, ternaries 12 (17 pts), if/else 13 (14 pts), error handling 1 (nesting depth added 6). Of this number, 19 points are the body\u0027s own statements and 41 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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dee62d6aa5ead7148f224e1511eb119c613ca7a6c4a9281b8b112bdaee5851"}},{"ruleId":"D2","level":"warning","message":{"text":"LexicalEditorController.saveTask (cognitive 60): LexicalEditorController.saveTask has cognitive complexity 60 (threshold 15). Drivers by points: if/else 25 (42 pts), boolean chains 12, ternaries 2 (5 pts), error handling 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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c26e28eb18a7fc3e19ef8487473b374cb84032c214df0828b4af383dd6dd53"}},{"ruleId":"D2","level":"warning","message":{"text":"profile.ProfileCard (cognitive 59): profile.ProfileCard has cognitive complexity 59 (threshold 15). Drivers by points: ternaries 25 (36 pts), boolean chains 17, if/else 3, match/switch 2, error handling 1 (nesting depth added 11). Of this number, 51 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3a27e31e58060d412becce394f2e0d5e96c225eb85e781830c743d45b869eb7"}},{"ruleId":"D2","level":"warning","message":{"text":"use-publish-flow.usePublishFlow (cognitive 59): use-publish-flow.usePublishFlow has cognitive complexity 59 (threshold 15). Drivers by points: if/else 31 (39 pts), boolean chains 8, error handling 6 (7 pts), ternaries 3 (5 pts) (nesting depth added 11). Most of this is not in the body itself: 0 of the 59 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 385, 483, 228, \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":"apps/admin/src/editor/publish/use-publish-flow.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a72be5de23498df40f3da804a3cd42095ea0fc4a986b7f905110dcd27df2dd8"}},{"ruleId":"D2","level":"warning","message":{"text":"member-event.getAction (cognitive 59): member-event.getAction has cognitive complexity 59 (threshold 15). Drivers by points: if/else 29 (37 pts), ternaries 7 (16 pts), boolean chains 6 (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":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e515735b3f46b4d4fdd080d3895855c0c4ad2cdb89a1ef89a336161855a22e0"}},{"ruleId":"D2","level":"warning","message":{"text":"editor.AutomationEditorContent (cognitive 59): editor.AutomationEditorContent has cognitive complexity 59 (threshold 15). Drivers by points: ternaries 11 (18 pts), if/else 13 (15 pts), boolean chains 14, match/switch 9 (12 pts) (nesting depth added 12). Of this number, 20 points are the body\u0027s own statements and 39 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":"apps/admin/src/automations/editor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"31bdcf5336045bcdf716434e945a69e784cf663af2fbf70df327dc1609da64d6"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter-detail-modal.Sidebar (cognitive 58): newsletter-detail-modal.Sidebar has cognitive complexity 58 (threshold 15). Drivers by points: boolean chains 38, if/else 8 (10 pts), ternaries 6, error handling 2 (4 pts) (nesting depth added 4). Of this number, 27 points are the body\u0027s own statements and 31 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":"apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb1e8794737443fea390337f940a0b874b32bf1c96fdf16897f322867c6ae81"}},{"ruleId":"D2","level":"warning","message":{"text":"PostsExporter.filterToString (cognitive 58): PostsExporter.filterToString has cognitive complexity 58 (threshold 15). Drivers by points: if/else 19 (54 pts), loops 2 (4 pts) (nesting depth added 37). 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":"ghost/core/core/server/services/posts/posts-exporter.js"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0c62a5549e8e38ef9c83482c47ce79050c667be867652c52fa7937ef22b9a7"}},{"ruleId":"D2","level":"warning","message":{"text":"lexical-to-mobiledoc.buildMarkers (cognitive 58): lexical-to-mobiledoc.buildMarkers has cognitive complexity 58 (threshold 15). Drivers by points: if/else 20 (56 pts), boolean chains 2 (nesting depth added 36). Most of this is not in the body itself: 2 of the 58 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 262, 316, 270, \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":"koenig/kg-converters/src/lexical-to-mobiledoc.ts"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"de499d75590bbef1fe8b60fc429e75a65b9ddbe7a23d52b29600182d73ce02cc"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter.Newsletter (cognitive 57): newsletter.Newsletter has cognitive complexity 57 (threshold 15). Drivers by points: boolean chains 36, if/else 12 (15 pts), ternaries 4 (6 pts) (nesting depth added 5). Of this number, 38 points are the body\u0027s own statements and 19 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":"apps/admin/src/posts/analytics/newsletter/newsletter.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ddc69ffa8fee02b9a660046368ac9328a248481338fae52e0737025b5eefd3"}},{"ruleId":"D2","level":"warning","message":{"text":"permissible (cognitive 57): permissible has cognitive complexity 57 (threshold 15). Drivers by points: if/else 24 (40 pts), boolean chains 17 (nesting depth added 16). Of this number, 35 points are the body\u0027s own statements and 22 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"860e94d09d2a8a8d11488d1d81f177a91026d57e7df4e67f5a637a600907a96a"}},{"ruleId":"D2","level":"warning","message":{"text":"change-tracker.createChangeTracker (cognitive 56): change-tracker.createChangeTracker has cognitive complexity 56 (threshold 15). Drivers by points: if/else 29 (31 pts), boolean chains 16, error handling 3 (4 pts), ternaries 2 (4 pts), loops 1 (nesting depth added 5). Of this number, 55 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/change-tracker.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"661a3832325eb15acda222b291eab453e169963652f3aec31075393d60a5b690"}},{"ruleId":"D2","level":"warning","message":{"text":"ParseMemberEventHelper.getAction (cognitive 56): ParseMemberEventHelper.getAction has cognitive complexity 56 (threshold 15). Drivers by points: if/else 34 (46 pts), boolean chains 5, ternaries 2 (5 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":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2f64e50bb0e76ddcd04efe8ecd484866d6c3dc9433efa7d5bf01ef089764e6"}},{"ruleId":"D2","level":"warning","message":{"text":"authors.extendModel (cognitive 55): authors.extendModel has cognitive complexity 55 (threshold 15). Drivers by points: if/else 29 (32 pts), boolean chains 19, loops 2, error handling 1, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 55 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 340, 141, 40, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/relations/authors.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2bd215f692feb7412409ca642cdf84d6705b86fba4672e5294d5b2da209d03"}},{"ruleId":"D2","level":"warning","message":{"text":"source-utils.processSources (cognitive 54): source-utils.processSources has cognitive complexity 54 (threshold 15). Drivers by points: boolean chains 25, if/else 13 (20 pts), ternaries 6 (9 pts) (nesting depth added 10). Most of this is not in the body itself: 15 of the 54 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 307, 390). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/source-utils.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"c10ac80e37e528ca15f4b9f864dbad9f93503ba30280bc55520b3dd9fecf906c"}},{"ruleId":"D2","level":"warning","message":{"text":"create (cognitive 54): create has cognitive complexity 54 (threshold 15). Drivers by points: if/else 23 (31 pts), boolean chains 12, loops 4 (6 pts), error handling 1 (3 pts), other 1, ternaries 1 (nesting depth added 12). Of this number, 52 points are the body\u0027s own statements and 2 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"00620341e2ae9afe37ebbce0e941ce95086145869ba2219622f80df7532df233"}},{"ruleId":"D2","level":"warning","message":{"text":"reader.ArticleBody (cognitive 52): reader.ArticleBody has cognitive complexity 52 (threshold 15). Drivers by points: if/else 19 (20 pts), ternaries 15 (19 pts), boolean chains 13 (nesting depth added 5). Of this number, 24 points are the body\u0027s own statements and 28 belong to 12 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6976cc6d83b6b6e08434852d5654ff6de87a87f980b52016bceb626c81adc4"}},{"ruleId":"D2","level":"warning","message":{"text":"growth.Growth (cognitive 52): growth.Growth has cognitive complexity 52 (threshold 15). Drivers by points: ternaries 9 (26 pts), boolean chains 19, if/else 7 (nesting depth added 17). Of this number, 25 points are the body\u0027s own statements and 27 belong to 5 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/growth.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"b162a1942804b6f59b14118f896e1f0dd24a84bb0c256eaabafbab9c93c76aaf"}},{"ruleId":"D2","level":"warning","message":{"text":"check-internal-packages.validateCompliantPackage (cognitive 52): check-internal-packages.validateCompliantPackage has cognitive complexity 52 (threshold 15). Drivers by points: if/else 16 (34 pts), loops 8 (12 pts), boolean chains 6 (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":"scripts/check-internal-packages.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"c90170bcc360507f55c97376b520e6bc6f5020b004c01b1553d7bac4a8e3b37b"}},{"ruleId":"D2","level":"warning","message":{"text":"paid-subscription-change-chart.PaidMembersChangeChart (cognitive 51): paid-subscription-change-chart.PaidMembersChangeChart has cognitive complexity 51 (threshold 15). Drivers by points: boolean chains 24, if/else 11 (18 pts), ternaries 4 (8 pts), match/switch 1 (nesting depth added 11). Most of this is not in the body itself: 5 of the 51 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 217, 465, 256, \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":"apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a036f13c964a6e003ac267a6d117e1c7706dc7c6126cf4a52826083fdb2838"}},{"ruleId":"D2","level":"warning","message":{"text":"use-post-bulk-actions.usePostBulkActions (cognitive 51): use-post-bulk-actions.usePostBulkActions has cognitive complexity 51 (threshold 15). Drivers by points: if/else 17 (23 pts), ternaries 10 (20 pts), boolean chains 5, error handling 2, loops 1 (nesting depth added 16). Most of this is not in the body itself: 1 of the 51 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 295, 368, 192, \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":"apps/admin/src/posts/list/hooks/use-post-bulk-actions.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8405ab006aa01832c2339928889cb3a2b66af58d344a461ad98e2d364818912"}},{"ruleId":"D2","level":"warning","message":{"text":"locale-validation.validateLocale (cognitive 51): locale-validation.validateLocale has cognitive complexity 51 (threshold 15). Drivers by points: if/else 20 (32 pts), loops 6 (10 pts), boolean chains 9 (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":"apps/admin/src/settings/utils/locale-validation.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"717eb13b68ad221ad7cf773ac488d5b9a1b44ee508a373ae9200e50723665505"}},{"ruleId":"D2","level":"warning","message":{"text":"App.fetchQueryStrData (cognitive 51): App.fetchQueryStrData has cognitive complexity 51 (threshold 15). Drivers by points: if/else 28 (33 pts), boolean chains 17, loops 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b09f4bb72c681a09d7f647d576d1b89218f6595b381d20378432fc7bab794b"}},{"ruleId":"D2","level":"warning","message":{"text":"getTemplateData (cognitive 51): getTemplateData has cognitive complexity 51 (threshold 15). Drivers by points: ternaries 16 (29 pts), boolean chains 11, if/else 5 (8 pts), loops 1 (2 pts), other 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eaf99dfcf32fb0e2e5e4c191be674dac5d93bcb53c8aa89d9aa698d8d3042de"}},{"ruleId":"D2","level":"warning","message":{"text":"feed-item.renderFeedAttachment (cognitive 50): feed-item.renderFeedAttachment has cognitive complexity 50 (threshold 15). Drivers by points: if/else 14 (22 pts), ternaries 8 (18 pts), boolean chains 9, match/switch 1 (nesting depth added 18). Of this number, 38 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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e4104586507d513177f53aa3ccd60eddb87664f4d067c848be90dfc1e7247ae"}},{"ruleId":"D2","level":"warning","message":{"text":"publish-options.createPublishOptions (cognitive 50): publish-options.createPublishOptions has cognitive complexity 50 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 20, ternaries 5, error handling 2 (nesting depth added 5). Of this number, 25 points are the body\u0027s own statements and 25 belong to 8 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-options.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b68c28fb2c9156de9e4bdf07ed07f557a86a78e3bef900f1d91a51b6647df69"}},{"ruleId":"D2","level":"warning","message":{"text":"import-members-modal.ImportMembersModal (cognitive 50): import-members-modal.ImportMembersModal has cognitive complexity 50 (threshold 15). Drivers by points: boolean chains 21, if/else 16 (20 pts), ternaries 3 (6 pts), error handling 1, loops 1, match/switch 1 (nesting depth added 7). Most of this is not in the body itself: 12 of the 50 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 309, 158, 120, \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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c96824ec74384b5f5e20dd70b0d73c09854d6bddf036925ae46ca79244272ae"}},{"ruleId":"D2","level":"warning","message":{"text":"route-settings-parser.serializeRouteSettings (cognitive 50): route-settings-parser.serializeRouteSettings has cognitive complexity 50 (threshold 15). Drivers by points: if/else 17 (45 pts), boolean chains 3, loops 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":"ghost/core/core/server/services/route-settings/route-settings-parser.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d0fc56030760b2f84345fdbe8898edcce6d78a9c87c03959e666180fe48ea2"}},{"ruleId":"D2","level":"warning","message":{"text":"profile-page.ProfilePage (cognitive 49): profile-page.ProfilePage has cognitive complexity 49 (threshold 15). Drivers by points: boolean chains 24, if/else 13, ternaries 11, error handling 1. Of this number, 34 points are the body\u0027s own statements and 15 belong to 9 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":"apps/activitypub/src/views/profile/components/profile-page.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"736e62fe7927ba594dbf4b3079cdfcd913cea13e0a4488782d8e528e8397eb6b"}},{"ruleId":"D2","level":"warning","message":{"text":"description.getDescription (cognitive 49): description.getDescription has cognitive complexity 49 (threshold 15). Drivers by points: if/else 19 (25 pts), boolean chains 23, 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":"ghost/core/core/frontend/meta/description.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"682f0edf5c0247085d1a5bca620126dca27f680e447b5e95a0e088a4ff949796"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter-preview.NewsletterPreview (cognitive 48): newsletter-preview.NewsletterPreview has cognitive complexity 48 (threshold 15). Drivers by points: boolean chains 26, if/else 16, ternaries 6. Of this number, 25 points are the body\u0027s own statements and 23 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":"apps/admin/src/settings/email/newsletters/newsletter-preview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"70970ffdcedba4e65024eb584681c1885950b27b56258a55e95703cc0a917407"}},{"ruleId":"D2","level":"warning","message":{"text":"chip-picker.ChipPicker (cognitive 48): chip-picker.ChipPicker has cognitive complexity 48 (threshold 15). Drivers by points: if/else 17 (21 pts), boolean chains 14, ternaries 10 (13 pts) (nesting depth added 7). Most of this is not in the body itself: 15 of the 48 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 238, 221, 169, \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":"apps/admin/src/shared/pickers/chip-picker.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c58ceb40669e2ea70686ae37b7eebd27d949ca9e942eefbfe5c3c8861620020"}},{"ruleId":"D2","level":"warning","message":{"text":"settings-modal.SettingsModal (cognitive 47): settings-modal.SettingsModal has cognitive complexity 47 (threshold 15). Drivers by points: boolean chains 31, if/else 12, ternaries 4. Of this number, 33 points are the body\u0027s own statements and 14 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":"apps/shade/src/components/patterns/settings-modal.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"d17b8936969627b464499d1d86a5b933f8c00ab513724b97a3fdd28da3febdd6"}},{"ruleId":"D2","level":"warning","message":{"text":"getTopPostsViews (cognitive 47): getTopPostsViews has cognitive complexity 47 (threshold 15). Drivers by points: ternaries 15 (24 pts), boolean chains 11, if/else 7 (11 pts), error handling 1 (nesting depth added 13). Most of this is not in the body itself: 15 of the 47 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 1341, 1450, 1318, \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":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":1256}}}],"partialFingerprints":{"codehealthFindingId/v1":"24e2f1753ecd97e55818f0ddedc66bfd91148a219d149682911d207cb466cf30"}},{"ruleId":"D2","level":"warning","message":{"text":"edit-profile.EditProfile (cognitive 46): edit-profile.EditProfile has cognitive complexity 46 (threshold 15). Drivers by points: boolean chains 20, if/else 9 (14 pts), match/switch 2 (6 pts), ternaries 4, error handling 2 (nesting depth added 9). Of this number, 19 points are the body\u0027s own statements and 27 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":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"80a52d20c681ce4b52b2d275f452b2853f1fbcc41e5072856b59492581cc94e3"}},{"ruleId":"D2","level":"warning","message":{"text":"api.setupGhostApi (cognitive 46): api.setupGhostApi has cognitive complexity 46 (threshold 15). Drivers by points: if/else 36 (37 pts), boolean chains 6, loops 1 (2 pts), ternaries 1 (nesting depth added 2). Of this number, 19 points are the body\u0027s own statements and 27 belong to 15 function literals inside it that branch. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/utils/api.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd2106a451e227acccad6cd663db3da8377e97d7a7723d65e8689901cd2e2dae"}},{"ruleId":"D2","level":"warning","message":{"text":"renderBody (cognitive 46): renderBody has cognitive complexity 46 (threshold 15). Drivers by points: if/else 20 (32 pts), boolean chains 7, ternaries 4 (6 pts), loops 1 (nesting depth added 14). Of this number, 22 points are the body\u0027s own statements and 24 belong to 12 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":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"f550c87302dec45c17d8bad5261bb8998f0e44e33ab8e21c7cd1b022cbc5f5a6"}},{"ruleId":"D2","level":"warning","message":{"text":"createSessionService (cognitive 46): createSessionService has cognitive complexity 46 (threshold 15). Drivers by points: if/else 21 (22 pts), boolean chains 17, error handling 4, ternaries 3 (nesting depth added 1). Most of this is not in the body itself: 0 of the 46 points are its own statements and the rest belongs to 26 function items inside it that branch (assignUserToSession, getGeolocationFromIP, getUserForSession, \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":"ghost/core/core/server/services/auth/session/session-service.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e32d8a903f2d95f6a3c289b5a7751dadb088f92a888f38371b05ab038ee106"}},{"ruleId":"D2","level":"warning","message":{"text":"member-activity-pagination.loadMemberActivityPage (cognitive 45): member-activity-pagination.loadMemberActivityPage has cognitive complexity 45 (threshold 15). Drivers by points: if/else 12 (26 pts), boolean chains 9, ternaries 4 (9 pts), loops 1 (nesting depth added 19). Of this number, 42 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":"apps/admin-x-framework/src/api/member-activity-pagination.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"91786659039e03f41989fbb394ca6dc0bdc9797ebe0f5847fad98e91462144aa"}},{"ruleId":"D2","level":"warning","message":{"text":"update-flow-modal.KeyedUpdateFlowModal (cognitive 45): update-flow-modal.KeyedUpdateFlowModal has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 18 (24 pts), boolean chains 13, if/else 6 (7 pts), error handling 1 (nesting depth added 7). Of this number, 36 points are the body\u0027s own statements and 9 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":"apps/admin/src/editor/publish/update-flow-modal.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1945c16456b2d6ab1d6d7d15c7f96bfa289d41ce61065a0250f68b42bcae85"}},{"ruleId":"D2","level":"warning","message":{"text":"import-members-modal.ImportMembersModal (cognitive 45): import-members-modal.ImportMembersModal has cognitive complexity 45 (threshold 15). Drivers by points: if/else 15 (19 pts), boolean chains 17, ternaries 4 (6 pts), error handling 1, loops 1, match/switch 1 (nesting depth added 6). Most of this is not in the body itself: 10 of the 45 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 217, 195, 66, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb0d104ddda86723096fd1cce86e0a73579fa13531d4b0d614e8e170770ac3e"}},{"ruleId":"D2","level":"warning","message":{"text":"comments.commentMapper (cognitive 45): comments.commentMapper has cognitive complexity 45 (threshold 15). Drivers by points: if/else 20 (24 pts), boolean chains 15, ternaries 4 (6 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7b2b4caa6cab2ce18f7aee5d77a8f9e6d12fefd34dce8ba821da3709fdfed3"}},{"ruleId":"D2","level":"warning","message":{"text":"#mapPosts (cognitive 45): #mapPosts has cognitive complexity 45 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 9, ternaries 9, other 7, loops 2 (5 pts) (nesting depth added 8). Of this number, 21 points are the body\u0027s own statements and 24 belong to 4 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/posts/posts-exporter.js"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d350d2ef8d6a560a088a4d13545988a602b72ac763dc9ebcea5ef9108a4bc4"}},{"ruleId":"D2","level":"warning","message":{"text":"search.Search (cognitive 44): search.Search has cognitive complexity 44 (threshold 15). Drivers by points: if/else 19 (23 pts), boolean chains 20, ternaries 1 (nesting depth added 4). Most of this is not in the body itself: 14 of the 44 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 183, 117, 152, \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":"apps/activitypub/src/components/modals/search.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"808b0633efc6a86c2285dd76594546c5fa772553c1cf9f109542e20afbd370ea"}},{"ruleId":"D2","level":"warning","message":{"text":"universal-import-modal.UniversalImportModal (cognitive 44): universal-import-modal.UniversalImportModal has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 12 (20 pts), if/else 8 (14 pts), boolean chains 6, error handling 3 (4 pts) (nesting depth added 15). Of this number, 19 points are the body\u0027s own statements and 25 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":"apps/admin/src/settings/advanced/migration-tools/universal-import-modal.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"9534769e8ed62507dd421a3ead27d1c7c37513e430a0f28dc0df0d224aa1ff9b"}},{"ruleId":"D2","level":"warning","message":{"text":"notification.NotificationText (cognitive 44): notification.NotificationText has cognitive complexity 44 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 16, ternaries 4 (9 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":"apps/portal/src/components/notification.jsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d28110c5055498070b2f86d3a99128a8569064acd869de3cda0333e3305d9f9"}},{"ruleId":"D2","level":"warning","message":{"text":"signup-options.SignupOptions (cognitive 43): signup-options.SignupOptions has cognitive complexity 43 (threshold 15). Drivers by points: if/else 13 (20 pts), boolean chains 18, ternaries 2 (5 pts) (nesting depth added 10). Most of this is not in the body itself: 14 of the 43 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 82, 120, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/portal/signup-options.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"1987f89c3caea4a2f3a9045a0d9eedf6a1219e19f26b0faf309c88ee5a5147bc"}},{"ruleId":"D2","level":"warning","message":{"text":"route-settings-parser.parseRouteSettings (cognitive 43): route-settings-parser.parseRouteSettings has cognitive complexity 43 (threshold 15). Drivers by points: if/else 14 (34 pts), loops 3 (6 pts), boolean chains 3 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/route-settings/route-settings-parser.ts"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"188c5535bc66884504af7b6514f1972dade92f35e46967d35d4d92baf699b17b"}},{"ruleId":"D2","level":"warning","message":{"text":"handleSubscriptionEvent (cognitive 43): handleSubscriptionEvent has cognitive complexity 43 (threshold 15). Drivers by points: if/else 10 (19 pts), other 12, error handling 2 (6 pts), boolean chains 4, loops 1 (2 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stripe/services/webhook/checkout-session-event-service.js"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"58076433e7e0acb6b199c62bd7a4d1ebea522206a1faa956788cc63cef7592fc"}},{"ruleId":"D2","level":"warning","message":{"text":"reactAppConfig (cognitive 43): reactAppConfig has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 14 (18 pts), if/else 10, boolean chains 9, other 6 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"configs/eslint-react/index.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5562daec20512cf708577a3ba52b5b4869b1c5b7347157f571eed02d839a57f"}},{"ruleId":"D2","level":"warning","message":{"text":"custom-field-modal.CustomFieldModal (cognitive 42): custom-field-modal.CustomFieldModal has cognitive complexity 42 (threshold 15). Drivers by points: ternaries 11 (15 pts), boolean chains 14, if/else 9, error handling 4 (nesting depth added 4). Of this number, 26 points are the body\u0027s own statements and 16 belong to 9 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":"apps/admin/src/settings/membership/custom-fields/custom-field-modal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fb3c37a8f6529607f20d8231a2d4f4208ea35c9ea8f1411842f61d2ca7ef771"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletters-kpis.NewsletterKPIs (cognitive 41): newsletters-kpis.NewsletterKPIs has cognitive complexity 41 (threshold 15). Drivers by points: boolean chains 24, if/else 15, ternaries 2. Of this number, 24 points are the body\u0027s own statements and 17 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":"apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc7df926894a2eb5cdfa027b035abd96257c352a72297d8f0790269f4224fac"}},{"ruleId":"D2","level":"warning","message":{"text":"post-editor.PostEditor (cognitive 41): post-editor.PostEditor has cognitive complexity 41 (threshold 15). Drivers by points: boolean chains 22, if/else 14 (17 pts), ternaries 2 (nesting depth added 3). Most of this is not in the body itself: 6 of the 41 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 170, 199, 158, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/post-editor.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"8155cf734151dd1b7ef725b8264db1e50ff96cfccf5f8ce5e3b75d7e834274c5"}},{"ruleId":"D2","level":"warning","message":{"text":"automation-canvas.AutomationCanvas (cognitive 41): automation-canvas.AutomationCanvas has cognitive complexity 41 (threshold 15). Drivers by points: if/else 23, boolean chains 15, ternaries 3. Most of this is not in the body itself: 11 of the 41 points are its own statements and the rest belongs to 18 function literals inside it that branch (lines 421, 470, 625, \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":"apps/admin/src/automations/components/canvas/automation-canvas.tsx"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"766bda134db1faf97d334f5f5ae19f71d64973dba328cd273919bff7ed86d330"}},{"ruleId":"D2","level":"warning","message":{"text":"comment-likes-modal.CommentLikesModal (cognitive 41): comment-likes-modal.CommentLikesModal has cognitive complexity 41 (threshold 15). Drivers by points: ternaries 16 (34 pts), boolean chains 7 (nesting depth added 18). Of this number, 30 points are the body\u0027s own statements and 11 belong to 3 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/components/comment-likes-modal.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5413d2c34c8b32f5552591e17c047459d4d0a4ee16e98154dbe1097dfd1c671f"}},{"ruleId":"D2","level":"warning","message":{"text":"email-content-modal.EmailContentModal (cognitive 41): email-content-modal.EmailContentModal has cognitive complexity 41 (threshold 15). Drivers by points: boolean chains 23, if/else 16 (17 pts), loops 1 (nesting depth added 1). Of this number, 17 points are the body\u0027s own statements and 24 belong to 12 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/email-modal/email-content-modal.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7ac476ab6ba79b1af51e876165a955bba7eab79a052df9d4389f12d5007d92c"}},{"ruleId":"D2","level":"warning","message":{"text":"sidebar.Sidebar (cognitive 40): sidebar.Sidebar has cognitive complexity 40 (threshold 15). Drivers by points: boolean chains 17, ternaries 12 (13 pts), if/else 9 (10 pts) (nesting depth added 2). Most of this is not in the body itself: 13 of the 40 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 172, 145, 133, \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":"apps/admin/src/settings/layout/sidebar.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a3848e718ae05fa3f6c4f7d20007f4f4818738be181961a249de2138eccc6a0"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersStripeCustomersSubscriptionsImporter.generate (cognitive 40): MembersStripeCustomersSubscriptionsImporter.generate has cognitive complexity 40 (threshold 15). Drivers by points: if/else 21 (32 pts), ternaries 4 (5 pts), boolean chains 3 (nesting depth added 12). Of this number, 39 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cc9ae2f6a7af9d14986a7951aa96c88ec6047adcf97eb5afdf5f8874845432f"}},{"ruleId":"D2","level":"warning","message":{"text":"moderation.Moderation (cognitive 39): moderation.Moderation has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 16 (34 pts), boolean chains 4, if/else 1 (nesting depth added 18). Most of this is not in the body itself: 8 of the 39 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 181, 266, 77). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/moderation.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a93d905f75efada6e562b3c34fd4798a7198ce73a2e57e01afffd694945a1044"}},{"ruleId":"D2","level":"warning","message":{"text":"change-password-form.ChangePasswordForm (cognitive 39): change-password-form.ChangePasswordForm has cognitive complexity 39 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 13, ternaries 3 (4 pts), loops 2, error handling 1 (nesting depth added 4). Most of this is not in the body itself: 13 of the 39 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 73, 167, 153, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/users/change-password-form.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9357d0d66d4004eee4c8ae78c0a48a2b3519a8aeb4e434a9f79f68b7c6cd1de"}},{"ruleId":"D2","level":"warning","message":{"text":"app.App (cognitive 39): app.App has cognitive complexity 39 (threshold 15). Drivers by points: if/else 15 (19 pts), boolean chains 12, error handling 4, ternaries 3, loops 1 (nesting depth added 4). Most of this is not in the body itself: 1 of the 39 points is its own statement and the rest belongs to 12 function literals inside it that branch (lines 312, 155, 249, \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":"apps/comments-ui/src/app.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a90210c547856ca71e3b1053ae7cd5c2faa830ed04a33ed1496e70086f5fe90a"}},{"ruleId":"D2","level":"warning","message":{"text":"latest-post.LatestPost (cognitive 38): latest-post.LatestPost has cognitive complexity 38 (threshold 15). Drivers by points: boolean chains 24, ternaries 6 (11 pts), if/else 2 (3 pts) (nesting depth added 6). Of this number, 34 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, 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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eacdbaf9c661d3af8b34aed1a55c4c38b6de70c4c4f49cb94187f6737a05621"}},{"ruleId":"D2","level":"warning","message":{"text":"paid-subscription-change-chart.fillMissingDataPoints (cognitive 38): paid-subscription-change-chart.fillMissingDataPoints has cognitive complexity 38 (threshold 15). Drivers by points: if/else 12 (24 pts), loops 3 (6 pts), ternaries 2 (6 pts), boolean chains 2 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"41870f444bd4e5447a0f8f6f62c9d8f05f01b2f9c7cf4b74d076c055ad758c81"}},{"ruleId":"D2","level":"warning","message":{"text":"posts-list-screen.PostsListScreen (cognitive 38): posts-list-screen.PostsListScreen has cognitive complexity 38 (threshold 15). Drivers by points: boolean chains 19, ternaries 9 (18 pts), if/else 1 (nesting depth added 9). 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, 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":"apps/admin/src/posts/list/posts-list-screen.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b2ba79b0852f7986b8cd780e85d15f9e4d4f60abc81b11e9d94b23dbef29801"}},{"ruleId":"D2","level":"warning","message":{"text":"invite-user-modal.InviteUserModal (cognitive 38): invite-user-modal.InviteUserModal has cognitive complexity 38 (threshold 15). Drivers by points: if/else 19 (24 pts), boolean chains 9, ternaries 3 (4 pts), error handling 1 (nesting depth added 6). Most of this is not in the body itself: 14 of the 38 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 96, 60, 67, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/invite-user-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53afd1a98a1c42bd9e9386eefa67592ac7473d98cd679246f69c46d772b31d4"}},{"ruleId":"D2","level":"warning","message":{"text":"SelectionList.shiftItem (cognitive 38): SelectionList.shiftItem has cognitive complexity 38 (threshold 15). Drivers by points: if/else 10 (23 pts), ternaries 2 (9 pts), loops 3 (4 pts), boolean chains 2 (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":"apps/ember-admin/app/components/posts-list/selection-list.js"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5600b089db2e3179d1dfd3bc500288df4320eecd3141a9092c5766d0ef4f67"}},{"ruleId":"D2","level":"warning","message":{"text":".lintstagedrc.expandPattern (cognitive 37): .lintstagedrc.expandPattern has cognitive complexity 37 (threshold 15). Drivers by points: if/else 5 (17 pts), ternaries 3 (13 pts), loops 3 (7 pts) (nesting depth added 26). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".lintstagedrc.cjs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"4293438b022215d2ddb97760bf48f1dbe4d3f30c3c67c980ff06eb7015c372a4"}},{"ruleId":"D2","level":"warning","message":{"text":"profile.Profile (cognitive 37): profile.Profile has cognitive complexity 37 (threshold 15). Drivers by points: boolean chains 16, if/else 11 (13 pts), ternaries 4, error handling 2, match/switch 2 (nesting depth added 2). Most of this is not in the body itself: 12 of the 37 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 255, 315, 289, \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":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ba24b85728be75a9e3554d59e785ff20ad722b15ae6c3bf43aa47be85459af"}},{"ruleId":"D2","level":"warning","message":{"text":"locations-card.LocationsCard (cognitive 37): locations-card.LocationsCard has cognitive complexity 37 (threshold 15). Drivers by points: boolean chains 18, ternaries 7 (14 pts), if/else 5 (nesting depth added 7). Most of this is not in the body itself: 6 of the 37 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 298, 110, 152, \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":"apps/admin/src/analytics/views/stats/locations/components/locations-card.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dbe4159c06fa2dd4f05483cee93c2121cd4ff5c70f62676f39871774550eaa4"}},{"ruleId":"D2","level":"warning","message":{"text":"complete-step.CompleteStep (cognitive 37): complete-step.CompleteStep has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 17 (35 pts), boolean chains 2 (nesting depth added 18). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/complete-step.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f58e8822582aee76647c21cfaf6d39c4713e67c1270042caa7a41287cba6ecd"}},{"ruleId":"D2","level":"warning","message":{"text":"design-and-theme-modal.DesignAndThemeModal (cognitive 37): design-and-theme-modal.DesignAndThemeModal has cognitive complexity 37 (threshold 15). Drivers by points: if/else 28 (33 pts), boolean chains 4 (nesting depth added 5). Of this number, 18 points are the body\u0027s own statements and 19 belong to 7 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"apps/admin/src/settings/site/design-and-theme-modal.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"00a2c342d69a45711825af1f3fb5008940bd1516761225b7bf509562e270d6b4"}},{"ruleId":"D2","level":"warning","message":{"text":"unsubscribe-page.UnsubscribePage (cognitive 37): unsubscribe-page.UnsubscribePage has cognitive complexity 37 (threshold 15). Drivers by points: if/else 22, boolean chains 9, ternaries 3 (5 pts), error handling 1 (nesting depth added 2). Most of this is not in the body itself: 7 of the 37 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 200, 316, 105, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/unsubscribe-page.jsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"084aba79b2c5f5601c13bb0a50e907aa9b930585f92c1d58a50dd4a9437281e0"}},{"ruleId":"D2","level":"warning","message":{"text":"unblock-dialog.UnblockDialog (cognitive 36): unblock-dialog.UnblockDialog has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (16 pts), boolean chains 11, ternaries 9 (nesting depth added 1). Most of this is not in the body itself: 4 of the 36 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 43, 69, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/profile/components/unblock-dialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"db1c8adbc44ab39c5e3860ec19371c34602e02a0f1515cbbdd77de25f548e373"}},{"ruleId":"D2","level":"warning","message":{"text":"post-analytics-header.PostAnalyticsHeader (cognitive 36): post-analytics-header.PostAnalyticsHeader has cognitive complexity 36 (threshold 15). Drivers by points: boolean chains 25, if/else 9 (10 pts), error handling 1 (nesting depth added 1). Of this number, 23 points are the body\u0027s own statements and 13 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/components/post-analytics-header.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f33eac5481bd354ca8326736b1b46728c17686e84721df755dbf1178bad7d03"}},{"ruleId":"D2","level":"warning","message":{"text":"tiers.Tiers (cognitive 36): tiers.Tiers has cognitive complexity 36 (threshold 15). Drivers by points: boolean chains 21, if/else 6 (8 pts), ternaries 4 (5 pts), error handling 1 (2 pts) (nesting depth added 4). Of this number, 25 points are the body\u0027s own statements and 11 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":"apps/admin/src/settings/membership/tiers.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"63548215d5219bc55068cd748493bdcc5640133917ee53efa908e3fa574c0bd4"}},{"ruleId":"D2","level":"warning","message":{"text":"PostMediaInliner.inlineLexicalChildren (cognitive 36): PostMediaInliner.inlineLexicalChildren has cognitive complexity 36 (threshold 15). Drivers by points: if/else 7 (19 pts), loops 5 (10 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/import/media.ts"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"647e8127613fa4e49abc437dd3850276fc30bafcf6cde0acfb9b0d272b2f2c55"}},{"ruleId":"D2","level":"warning","message":{"text":"ContentCSVImporter.processRows (cognitive 36): ContentCSVImporter.processRows has cognitive complexity 36 (threshold 15). Drivers by points: if/else 8 (20 pts), error handling 5 (9 pts), ternaries 2 (4 pts), 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":"ghost/core/core/server/services/content-import/import/importer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d0f911053459b37c9d5b184ce18ee3ec709f85502c9a3d3440d20b8c53ce10"}},{"ruleId":"D2","level":"warning","message":{"text":"foreach.foreach (cognitive 36): foreach.foreach has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (20 pts), boolean chains 16 (nesting depth added 3). 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: 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":"ghost/core/core/frontend/helpers/foreach.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc8aa44c621c1fe6ee4e4d6e768d076d14506ddb4d9daa869515984168059c2c"}},{"ruleId":"D2","level":"warning","message":{"text":"generate-img-attrs.generateImgSrcAttrs (cognitive 36): generate-img-attrs.generateImgSrcAttrs has cognitive complexity 36 (threshold 15). Drivers by points: if/else 13 (30 pts), boolean chains 6 (nesting depth added 17). 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, 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":"koenig/kg-default-cards/src/utils/generate-img-attrs.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e56470f12a081fac2da4afbbced88827ba3c266b64788fb4169f5078aba27f1"}},{"ruleId":"D2","level":"warning","message":{"text":"UnsplashSearchModal.UnsplashSearchModal (cognitive 36): UnsplashSearchModal.UnsplashSearchModal has cognitive complexity 36 (threshold 15). Drivers by points: if/else 21 (28 pts), boolean chains 8 (nesting depth added 7). Most of this is not in the body itself: 2 of the 36 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 83, 110, 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":"koenig/kg-unsplash-selector/src/UnsplashSearchModal.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ccf6fa1e26137f930795a20ca66517ce3e868388a0abab1ce8bc5f55b86e4fc"}},{"ruleId":"D2","level":"warning","message":{"text":"onUpdated (cognitive 36): onUpdated has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (32 pts), boolean chains 4 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/post.js"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"570f2822b12d0b538b44ea950222e510dc2a75419564389027dff065cba9a76b"}},{"ruleId":"D2","level":"warning","message":{"text":"use-growth-stats.calculateTotals (cognitive 35): use-growth-stats.calculateTotals has cognitive complexity 35 (threshold 15). Drivers by points: if/else 14 (24 pts), ternaries 4 (9 pts), boolean chains 2 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/hooks/use-growth-stats.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"785d161756550606b30e2d7aa1581e0171769018de2771954765c856bdefd79f"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.updateProfile (cognitive 35): actions.updateProfile has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 12 (25 pts), if/else 6 (8 pts), boolean chains 2 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/actions.js"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"c45f77fa5cfba11601152b1182342a37c983dfc93748df9c1b56845fff652a1d"}},{"ruleId":"D2","level":"warning","message":{"text":"title.getTitle (cognitive 35): title.getTitle has cognitive complexity 35 (threshold 15). Drivers by points: boolean chains 19, if/else 13 (14 pts), ternaries 2 (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":"ghost/core/core/frontend/meta/title.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aa8d405e93e64cf21057b156e50c1aa3d6044e81e172c25bf66a594157fb1c8"}},{"ruleId":"D2","level":"warning","message":{"text":"AutomationRunStepsImporter.import (cognitive 35): AutomationRunStepsImporter.import has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 6 (16 pts), if/else 6 (10 pts), loops 5 (7 pts), boolean chains 2 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc0847efde03bdbe942f3c1cc8a0aac17bb512a749a71d5ab8b2e741530edb0b"}},{"ruleId":"D2","level":"warning","message":{"text":"members.MembersPage (cognitive 34): members.MembersPage has cognitive complexity 34 (threshold 15). Drivers by points: boolean chains 22, ternaries 4 (10 pts), if/else 2 (nesting depth added 6). Of this number, 31 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":"apps/admin/src/members/members.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"72528f6b173480f36ca5fb0249219e61a8c1c9af19c381b7c0fc071571381a79"}},{"ruleId":"D2","level":"warning","message":{"text":"top-level-group.TopLevelGroup (cognitive 34): top-level-group.TopLevelGroup has cognitive complexity 34 (threshold 15). Drivers by points: boolean chains 21, ternaries 6 (10 pts), if/else 3 (nesting depth added 4). Of this number, 24 points are the body\u0027s own statements and 10 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":"apps/admin/src/settings/components/top-level-group.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cedeedb5b93fdc524fae26efb9cbdea81c69376de25be9aa11880c8cb450e14"}},{"ruleId":"D2","level":"warning","message":{"text":"OEmbedService.fetchOembedDataFromUrl (cognitive 34): OEmbedService.fetchOembedDataFromUrl has cognitive complexity 34 (threshold 15). Drivers by points: if/else 16 (25 pts), boolean chains 5, ternaries 2, error handling 1, 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":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d0b72ad691d413f55663ae160b3df1d0c41da253aa60e751a5a1352d830f82"}},{"ruleId":"D2","level":"warning","message":{"text":"createCheckoutSession (cognitive 34): createCheckoutSession has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15 (24 pts), boolean chains 5, error handling 1 (3 pts), other 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc3f1fcb9df538b0dd0685c8cf1dedbf24bc08ebd339c21ed05bc436e2cc640"}},{"ruleId":"D2","level":"warning","message":{"text":"createBatches (cognitive 34): createBatches has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (22 pts), loops 3 (4 pts), ternaries 2 (4 pts), boolean chains 3, 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":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eea0baf04ab33f182818a675779ff5384fdca66a8b832de681cb2f4cc3a1301"}},{"ruleId":"D2","level":"warning","message":{"text":"use-activity-pub-queries.useDeleteMutationForUser (cognitive 33): use-activity-pub-queries.useDeleteMutationForUser has cognitive complexity 33 (threshold 15). Drivers by points: if/else 22 (26 pts), ternaries 3 (5 pts), boolean chains 2 (nesting depth added 6). Most of this is not in the body itself: 0 of the 33 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 2175, 2494, 2428, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"82209e0af56a459ded02180999a4491ced3e20d8ef2d5c8afbe7625e4b709105"}},{"ruleId":"D2","level":"warning","message":{"text":"profile-preview-hover-card.ProfilePreviewHoverCard (cognitive 33): profile-preview-hover-card.ProfilePreviewHoverCard has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 18, ternaries 7 (8 pts), if/else 7 (nesting depth added 1). Of this number, 26 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/global/profile-preview-hover-card.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"22cfaaeb443ebb587cdcd19157706fe75635bcfe3b714a4cbd399289b46c6d90"}},{"ruleId":"D2","level":"warning","message":{"text":"fetch-api.useFetchApi (cognitive 33): fetch-api.useFetchApi has cognitive complexity 33 (threshold 15). Drivers by points: if/else 7 (20 pts), boolean chains 6, ternaries 4, error handling 1 (2 pts), loops 1 (nesting depth added 14). Most of this is not in the body itself: 0 of the 33 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 167, 211, 245). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/api/fetch-api.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"96827a0f5acfcf45d1c1ef1ee269fe7b17867b6cf62b57d874d20d89da1d58bd"}},{"ruleId":"D2","level":"warning","message":{"text":"use-label-picker.useLabelPicker (cognitive 33): use-label-picker.useLabelPicker has cognitive complexity 33 (threshold 15). Drivers by points: if/else 15 (21 pts), error handling 3 (5 pts), boolean chains 4, ternaries 1 (3 pts) (nesting depth added 10). Most of this is not in the body itself: 0 of the 33 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 111, 171, 151, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/hooks/use-label-picker.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f88920d1fcd379ecc53c36d80176f211dbdc2023ed1129f89080d2350c7c223"}},{"ruleId":"D2","level":"warning","message":{"text":"use-post-success-modal.usePostSuccessModal (cognitive 33): use-post-success-modal.usePostSuccessModal has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 9, ternaries 6 (9 pts), error handling 1 (nesting depth added 5). Most of this is not in the body itself: 1 of the 33 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 77, 68, 166, \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":"apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e195121f6db3944c4a7555f84a1b4e8f4a11dced0698d50301ad72f7616113e4"}},{"ruleId":"D2","level":"warning","message":{"text":"welcome-email-customize-modal.WelcomeEmailCustomizeModal (cognitive 33): welcome-email-customize-modal.WelcomeEmailCustomizeModal has cognitive complexity 33 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 13, ternaries 5, loops 1 (nesting depth added 3). Most of this is not in the body itself: 11 of the 33 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 413, 347, 373, \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":"apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.tsx"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"71d0a8a988b441c2f457b3293e1d2d4160fa8dadb95984b89f8f3fe8126d35be"}},{"ruleId":"D2","level":"warning","message":{"text":"form.FormEditor (cognitive 33): form.FormEditor has cognitive complexity 33 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 11, ternaries 2 (3 pts), error handling 1 (nesting depth added 6). Most of this is not in the body itself: 8 of the 33 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 110, 80, 44, \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":"apps/comments-ui/src/components/content/forms/form.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"80fd12bf22f2ada393532384ed96c76e09bbfdcb83c307535762e23173eee6d0"}},{"ruleId":"D2","level":"warning","message":{"text":"middleware.createSessionFromMagicLink (cognitive 33): middleware.createSessionFromMagicLink has cognitive complexity 33 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 10, error handling 2 (3 pts), ternaries 1 (3 pts) (nesting depth added 9). Of this number, 28 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/middleware.js"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"a802e31f3bd8739ff0c589c3e241092ed79fcda7b85c9075ff67e22ed0db4fbc"}},{"ruleId":"D2","level":"warning","message":{"text":"handleDataAttributes (cognitive 33): handleDataAttributes has cognitive complexity 33 (threshold 15). Drivers by points: if/else 26 (30 pts), error handling 2, boolean chains 1 (nesting depth added 4). Most of this is not in the body itself: 2 of the 33 points are its own statements and the rest belongs to 33 function items inside it that branch ((anonymous)::clickHandler::(anonymous), (anonymous)::clickHandler::(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":"apps/portal/src/data-attributes.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"15ae9aa1890e88c97b9ac273885fd66045254d69f40020c859b21020eeedc850"}},{"ruleId":"D2","level":"warning","message":{"text":"web.Web (cognitive 32): web.Web has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 15, if/else 10, ternaries 5 (7 pts) (nesting depth added 2). Most of this is not in the body itself: 10 of the 32 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 105, 157, 68, \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":"apps/admin/src/posts/analytics/web/web.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d492731b5e1ee768e3db16fc6a87b1d96d6ae8e1f5dc211dfbb2e9b69974f17"}},{"ruleId":"D2","level":"warning","message":{"text":"theme-modal.ChangeThemeModal (cognitive 32): theme-modal.ChangeThemeModal has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 7, error handling 2 (5 pts) (nesting depth added 12). Most of this is not in the body itself: 6 of the 32 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 345, 392, 490, \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":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"c61202197e77228ac7acda3d95a180fde63998b9fb1738f1120f1c97d8bfdef8"}},{"ruleId":"D2","level":"warning","message":{"text":"tier-checkout-collection.TierCheckoutCollection (cognitive 32): tier-checkout-collection.TierCheckoutCollection has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 11, ternaries 4 (6 pts), error handling 1 (nesting depth added 5). Most of this is not in the body itself: 9 of the 32 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 381, 320, 326, \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":"apps/admin/src/settings/membership/tiers/tier-checkout-collection.tsx"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"c93453fbc4a3275faff766cecf3e2c5b7d6f2fb581dcdcfeedb19fd4c0c361bd"}},{"ruleId":"D2","level":"warning","message":{"text":"paid-account-actions.PaidAccountActions (cognitive 32): paid-account-actions.PaidAccountActions has cognitive complexity 32 (threshold 15). Drivers by points: if/else 17 (19 pts), boolean chains 12, ternaries 1 (nesting depth added 2). Most of this is not in the body itself: 7 of the 32 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 38, 109, 183, \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":"apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3509387c845e8b0f7a2458828f319fb9fd1efcc10f734c29b91b8ce71e48c0"}},{"ruleId":"D2","level":"warning","message":{"text":"data-attributes.formSubmitHandler (cognitive 32): data-attributes.formSubmitHandler has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 9, error handling 3 (7 pts), loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/data-attributes.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"88b958fa7067c8992f0f38a07d49d71747189e008a6c9cd57a872f651a213786"}},{"ruleId":"D2","level":"warning","message":{"text":"multi-select-combobox.MultiSelectCombobox (cognitive 32): multi-select-combobox.MultiSelectCombobox has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 12, ternaries 7 (9 pts), if/else 6 (8 pts), loops 2 (3 pts) (nesting depth added 5). Most of this is not in the body itself: 12 of the 32 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 262, 231, 290, \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":"apps/shade/src/components/ui/multi-select-combobox.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2fb46339b08551ad80511ad65060a756a963d1e3d25f99e3e9a5306b97ebd4f"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsImporter.beforeImport (cognitive 32): SettingsImporter.beforeImport has cognitive complexity 32 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 8, ternaries 1 (4 pts), error handling 1 (3 pts), loops 2 (3 pts) (nesting depth added 11). Most of this is not in the body itself: 14 of the 32 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 226, 147, 119, \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":"ghost/core/core/server/data/importer/importers/data/settings-importer.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7e2b8b05fdd35df52a621b22c19020cad7c598c0797ed2bdd5bb4691bd7d59b"}},{"ruleId":"D2","level":"warning","message":{"text":"attachSubscriptionsToMember (cognitive 32): attachSubscriptionsToMember has cognitive complexity 32 (threshold 15). Drivers by points: if/else 9 (18 pts), ternaries 2 (6 pts), boolean chains 5, loops 2 (3 pts) (nesting depth added 14). Of this number, 30 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":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b85e44bb44fdad7e1ef228ad11f69557f720044905f3431f0bc412f9614a697"}},{"ruleId":"D2","level":"warning","message":{"text":"note.Note (cognitive 31): note.Note has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 15, if/else 11, ternaries 3 (4 pts), error handling 1 (nesting depth added 1). Most of this is not in the body itself: 11 of the 31 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 287, 65, 55, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/note.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ad6323c8bfba301af1c64701b43d7688f832c8d1fbe5bb99b01459cbb74004c"}},{"ruleId":"D2","level":"warning","message":{"text":"bluesky-sharing.BlueskySharing (cognitive 31): bluesky-sharing.BlueskySharing has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 11, if/else 8 (9 pts), ternaries 5 (9 pts), error handling 1 (2 pts) (nesting depth added 6). Of this number, 19 points are the body\u0027s own statements and 12 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":"apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7409007568f77e774dca555c91617e19b1402108295ff5ed7b982a1b306aba4"}},{"ruleId":"D2","level":"warning","message":{"text":"overview.Overview (cognitive 31): overview.Overview has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 26, if/else 5. Of this number, 24 points are the body\u0027s own statements and 7 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":"apps/admin/src/posts/analytics/overview/overview.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4faced2041af3501228e4ca8bab1dbeb55d732cef7d4f98f4bd4e9d94062873"}},{"ruleId":"D2","level":"warning","message":{"text":"edit-offer-modal.EditOfferModal (cognitive 31): edit-offer-modal.EditOfferModal has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 16, if/else 6 (11 pts), error handling 1 (2 pts), ternaries 2 (nesting depth added 6). Most of this is not in the body itself: 5 of the 31 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 345, 393, 308). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/edit-offer-modal.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddef5026f979c0350bdfd336a43be4e804bdec36e1581072ae58afd38785760f"}},{"ruleId":"D2","level":"warning","message":{"text":"publication-language.PublicationLanguage (cognitive 31): publication-language.PublicationLanguage has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 14, ternaries 5 (9 pts), if/else 7 (8 pts) (nesting depth added 5). Of this number, 19 points are the body\u0027s own statements and 12 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":"apps/admin/src/settings/general/publication-language.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"caf2d574065e67fc75212b7c0b119e9da77942b52bc46d01b867d51d8669fdd7"}},{"ruleId":"D2","level":"warning","message":{"text":"access.Access (cognitive 31): access.Access has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 23, ternaries 5, if/else 2, error handling 1. Of this number, 27 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/access.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"0048358912359e76bc3b759d7144715724d7f963de3fbd3c4506c7ed49bf233e"}},{"ruleId":"D2","level":"warning","message":{"text":"ParseMemberEventHelper.getIcon (cognitive 31): ParseMemberEventHelper.getIcon has cognitive complexity 31 (threshold 15). Drivers by points: if/else 25 (28 pts), boolean chains 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, 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":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab52e58f94ef34b7e5e3e244fa84102594d9c8496398a246f8d19690aa99c65"}},{"ruleId":"D2","level":"warning","message":{"text":"gift-redemption-page.GiftRedemptionPage (cognitive 31): gift-redemption-page.GiftRedemptionPage has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 19, if/else 9 (10 pts), ternaries 2 (nesting depth added 1). Of this number, 20 points are the body\u0027s own statements and 11 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":"apps/portal/src/components/pages/gift-redemption-page.jsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d385b095ccf0b4084db9e37897d7a76c4cfb343225fde963476362239b4ced4"}},{"ruleId":"D2","level":"warning","message":{"text":"members-api.MembersAPI (cognitive 31): members-api.MembersAPI has cognitive complexity 31 (threshold 15). Drivers by points: if/else 18 (21 pts), boolean chains 5, error handling 2 (3 pts), ternaries 2 (nesting depth added 4). Of this number, 29 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, 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":"ghost/core/core/server/services/members/members-api/members-api.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ccf3a5e20394470e2d069ccd910d0b9cf337d5f06b735bc40c17a744aa4608b"}},{"ruleId":"D2","level":"warning","message":{"text":"get.get (cognitive 31): get.get has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 10, error handling 2 (4 pts), ternaries 2 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/get.js"},"region":{"startLine":405}}}],"partialFingerprints":{"codehealthFindingId/v1":"362ca45212efdc918cbcba999efc5caaa392884ee2a74b2691c7a9d020025f6a"}},{"ruleId":"D2","level":"warning","message":{"text":"DockerAnalyticsManager.generateSession (cognitive 31): DockerAnalyticsManager.generateSession has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (19 pts), ternaries 3 (6 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":"ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa3f1b7a5b76eb75e1e773d2ec266ff04c48558f6f16247156d014b17c53c907"}},{"ruleId":"D2","level":"warning","message":{"text":"bulkEdit (cognitive 31): bulkEdit has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (24 pts), boolean chains 5, loops 1 (2 pts) (nesting depth added 12). Of this number, 29 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":"ghost/core/core/server/services/posts/posts-service.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"c41cd1f14bc119bcbf376f912e119b8a28de434e1e1900dffa628e341cc0adfb"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.getLinkTarget (cognitive 30): actions.getLinkTarget has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (23 pts), boolean chains 5, match/switch 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":"apps/admin-x-framework/src/api/actions.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b037c1d0c146f1837b64775f4575bfaf4ff4749800cd650a36da1f69e0d02ac"}},{"ruleId":"D2","level":"warning","message":{"text":"use-growth-stats.useGrowthStats (cognitive 30): use-growth-stats.useGrowthStats has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (19 pts), boolean chains 5, ternaries 3 (4 pts), loops 1 (2 pts) (nesting depth added 9). Most of this is not in the body itself: 1 of the 30 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 289, 250, 389, \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":"apps/admin/src/analytics/hooks/use-growth-stats.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"696905c50be8f7ec0489e6d149ed465cc94ff63b956794c57acb6a4628692c8c"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter-overview.NewsletterOverview (cognitive 30): newsletter-overview.NewsletterOverview has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 9 (18 pts), boolean chains 12 (nesting depth added 9). Of this number, 18 points are the body\u0027s own statements and 12 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":"apps/admin/src/posts/analytics/overview/components/newsletter-overview.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"afda33e5c7160b3a5f7baef41ed4fccf8d7ec5ccb721b3b70233fd058f5c8ca6"}},{"ruleId":"D2","level":"warning","message":{"text":"member-value-semantics.subscriptionSemantics (cognitive 30): member-value-semantics.subscriptionSemantics has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 5 (9 pts), boolean chains 7 (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":"apps/admin/src/members/member-value-semantics.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b6fee9baf8e9f02abe2bd3ed1097b4ee8320fe8c9a12a7f8b786324ed2aee4"}},{"ruleId":"D2","level":"warning","message":{"text":"get-portal-preview-url.getPortalPreviewUrl (cognitive 30): get-portal-preview-url.getPortalPreviewUrl has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 15, ternaries 9, if/else 6. Of this number, 29 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, 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":"apps/admin/src/settings/utils/get-portal-preview-url.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"869ef04e6f97964277cae4132ecb656f246095c2314cb7410cac21d49342687f"}},{"ruleId":"D2","level":"warning","message":{"text":"validator.validateSchema (cognitive 30): validator.validateSchema has cognitive complexity 30 (threshold 15). Drivers by points: if/else 13 (23 pts), boolean chains 7 (nesting depth added 10). Most of this is not in the body itself: 2 of the 30 points are its own statements and the rest belongs to one function literal inside it that branches (line 49). 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":"ghost/core/core/server/data/schema/validator.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15acca8c0557ef0ddc5a7b0c20e7e57623d4dca4595e04d9b76b1cff84db8d7"}},{"ruleId":"D2","level":"warning","message":{"text":"clean.post (cognitive 30): clean.post has cognitive complexity 30 (threshold 15). Drivers by points: if/else 14 (23 pts), boolean chains 7 (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":"ghost/core/core/server/api/endpoints/utils/serializers/output/utils/clean.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"78aef6eac39f124bf5f0e2084aebe9ddc33662be41ded51cfc2a1413f89ac3e3"}},{"ruleId":"D2","level":"warning","message":{"text":"NewslettersService.prepAttrsForEmailVerification (cognitive 30): NewslettersService.prepAttrsForEmailVerification has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (21 pts), boolean chains 8, 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":"ghost/core/core/server/services/newsletters/newsletters-service.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"89927ff1476bc5c3a4fe9717f960a905ee116311e88acbd23ae2fd4cfae48f28"}},{"ruleId":"D2","level":"warning","message":{"text":"extra-attrs.forPost (cognitive 30): extra-attrs.forPost has cognitive complexity 30 (threshold 15). Drivers by points: if/else 17 (28 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d56b8fa2ace9d1a7ff92f1e5acfda03b9f8422c8a3a8dec31a04d34d941410"}},{"ruleId":"D2","level":"warning","message":{"text":"clean-basic-html.cleanBasicHtml (cognitive 30): clean-basic-html.cleanBasicHtml has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (22 pts), boolean chains 8 (nesting depth added 10). Of this number, 16 points are the body\u0027s own statements and 14 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":"koenig/kg-clean-basic-html/src/clean-basic-html.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c45cb8283d110108cba800be0a8d5af3d463d39a9da7b2e771574544d0134f"}},{"ruleId":"D2","level":"warning","message":{"text":"#runARRQueries (cognitive 30): #runARRQueries has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (19 pts), boolean chains 7, loops 1 (4 pts) (nesting depth added 15). Of this number, 29 points are the body\u0027s own statements and 1 belongs to 3 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/milestones/milestones-service.js"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2de007ecb9b62e78fc9357239e5b2a08e796717a6ab2ce9a71b017591e38b29"}},{"ruleId":"D2","level":"warning","message":{"text":"email-sending-status-provider.EmailSendingStatusProvider (cognitive 29): email-sending-status-provider.EmailSendingStatusProvider has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 17, if/else 6, ternaries 3 (5 pts), error handling 1 (nesting depth added 2). Of this number, 18 points are the body\u0027s own statements and 11 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":"apps/admin/src/posts/analytics/email-sending-status/email-sending-status-provider.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7bfed6889fdec607dd2b9121a7f04798b7838b0913821c8b86dd1041712e24"}},{"ruleId":"D2","level":"warning","message":{"text":"activity-email-preview.ActivityEmailPreview (cognitive 29): activity-email-preview.ActivityEmailPreview has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 8 (14 pts), boolean chains 12, if/else 3 (nesting depth added 6). Of this number, 23 points are the body\u0027s own statements and 6 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":"apps/admin/src/members/activity/activity-email-preview.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"9686903aa2c0a40d1b704395169a714f438279c2da66a2c6b2fb3c2ad044e005"}},{"ruleId":"D2","level":"warning","message":{"text":"App.fetchOfferQueryStrData (cognitive 29): App.fetchOfferQueryStrData has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 13, 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":"apps/portal/src/app.jsx"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"32a0ab947c3dac2da6956dadbf8a136961d2fbc574effff85750d1036d99f9db"}},{"ruleId":"D2","level":"warning","message":{"text":"commands.addTableColumn (cognitive 29): commands.addTableColumn has cognitive complexity 29 (threshold 15). Drivers by points: if/else 18 (19 pts), boolean chains 10 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/schema/commands.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ffc47e098658a8fbb76690f8f988be534849662c467c710ba22ad6d3d1c92a"}},{"ruleId":"D2","level":"warning","message":{"text":"GiftDeliveryService.send (cognitive 29): GiftDeliveryService.send has cognitive complexity 29 (threshold 15). Drivers by points: error handling 7 (12 pts), if/else 10, boolean chains 5, ternaries 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-delivery-service.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a47a5fbb598700b60f1b0fb7e3d42b3fd6421de3225c570e9b735881d780454"}},{"ruleId":"D2","level":"warning","message":{"text":"route-settings-parser.parseDataEntry (cognitive 29): route-settings-parser.parseDataEntry has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (24 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 16). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/route-settings/route-settings-parser.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"50714832d179a96b3217827e7dd9c0aa22715a7fafbc2a6bd290afaaf6c63409"}},{"ruleId":"D2","level":"warning","message":{"text":"TableImporter.batchInsert (cognitive 29): TableImporter.batchInsert has cognitive complexity 29 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 3 (9 pts), ternaries 1 (3 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/importers/table-importer.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a990517ec07153c78982c17b4079ef660bc844ffbcaf9961813e75fd80bf124"}},{"ruleId":"D2","level":"warning","message":{"text":"use-post-selection.usePostSelection (cognitive 28): use-post-selection.usePostSelection has cognitive complexity 28 (threshold 15). Drivers by points: if/else 18, boolean chains 9, ternaries 1. Most of this is not in the body itself: 1 of the 28 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 86, 181, 212, \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":"apps/admin/src/posts/list/hooks/use-post-selection.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6e152deefc3ea809aa041c2a53fc25bf5c2aca8896bd51ed84015582b26cd4"}},{"ruleId":"D2","level":"warning","message":{"text":"use-editor-session.useEditorSession (cognitive 28): use-editor-session.useEditorSession has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 11 (12 pts), if/else 10, boolean chains 5, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 3 of the 28 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 323, 311, 378, \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":"apps/admin/src/editor/session/use-editor-session.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"b18882a32dbc2ab2957d883fa54af16145ef1404890f9c2c1035df4652417593"}},{"ruleId":"D2","level":"warning","message":{"text":"manage-view-popover.ManageViewPopoverContent (cognitive 28): manage-view-popover.ManageViewPopoverContent has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 8 (16 pts), if/else 6 (7 pts), boolean chains 3, error handling 2 (nesting depth added 9). Of this number, 15 points are the body\u0027s own statements and 13 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":"apps/admin/src/members/components/manage-view-popover.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ac51a436d0f426c8155b85651313b771a7dbae69f0c35a945ab3544f645a6ee"}},{"ruleId":"D2","level":"warning","message":{"text":"history-modal.HistoryActionDescription (cognitive 28): history-modal.HistoryActionDescription has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 7 (16 pts), if/else 6 (7 pts), boolean chains 5 (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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"083ff14ce9d0cd2e4c4b77608c3c705254d885bc219a4ebb12cf30991a893cf4"}},{"ruleId":"D2","level":"warning","message":{"text":"edit-offer-modal.Sidebar (cognitive 28): edit-offer-modal.Sidebar has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 13, ternaries 8, error handling 2 (4 pts), if/else 3 (nesting depth added 2). Of this number, 21 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/edit-offer-modal.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee779a847eb93b3411adeea347b9b3a0ae108989628a380f39c0fba9bf1db8bb"}},{"ruleId":"D2","level":"warning","message":{"text":"mapping-step.MappingStep (cognitive 28): mapping-step.MappingStep has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 15, ternaries 7 (13 pts) (nesting depth added 6). Of this number, 20 points are the body\u0027s own statements and 8 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":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c6178dd6838b70a06e02b25a996e9d3a30768d36d970acf671c50527bcce14"}},{"ruleId":"D2","level":"warning","message":{"text":"member-emails.MemberEmails (cognitive 28): member-emails.MemberEmails has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 9, error handling 3 (4 pts), ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 7 of the 28 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 300, 272, 227, \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":"apps/admin/src/settings/membership/member-emails.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"62f87ea225cd8314f0920680809ef18d8e87fd14de781b43d0660830f51edd21"}},{"ruleId":"D2","level":"warning","message":{"text":"date.dateSemantics (cognitive 28): date.dateSemantics has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 9, ternaries 4 (8 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/filters/semantics/date.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"4308e0d8e4a30e3c9faa180da82fdc7d957bf929c09973b26c2d199fa1069b60"}},{"ruleId":"D2","level":"warning","message":{"text":"filters.FilterInput (cognitive 28): filters.FilterInput has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 14, if/else 9 (10 pts), ternaries 2 (3 pts), match/switch 1 (nesting depth added 2). Most of this is not in the body itself: 6 of the 28 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 602, 577, 637, \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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"191c68b5f772d8eb54a2bcc24ad3f5ccc158afaac4e11cb1aa329b5b9278deab"}},{"ruleId":"D2","level":"warning","message":{"text":"Offer.create (cognitive 28): Offer.create has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 8, ternaries 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"ghost/core/core/server/services/offers/domain/models/offer.js"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13f8e3a215684798857a37ec62bb71e0a42cb4ba00bc230a6c72bcbd016914e"}},{"ruleId":"D2","level":"warning","message":{"text":"database-automations-repository.createDatabaseAutomationsRepository (cognitive 28): database-automations-repository.createDatabaseAutomationsRepository has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (21 pts), loops 3, boolean chains 2, ternaries 2 (nesting depth added 6). Most of this is not in the body itself: 4 of the 28 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 333, 397, 227, \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":"ghost/core/core/server/services/automations/database-automations-repository.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"54077a4859760fb693d3c9e37e80c9ae1bf7b46774b618bf923ccce55dc941bc"}},{"ruleId":"D2","level":"warning","message":{"text":"Base.replaceIdentifiers (cognitive 28): Base.replaceIdentifiers has cognitive complexity 28 (threshold 15). Drivers by points: if/else 17 (26 pts), boolean chains 2 (nesting depth added 9). Most of this is not in the body itself: 0 of the 28 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 195, 187). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/base.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b0f0a7537cb292108696fd25df32ad6ac72052d23d4e8f858710c832a79ba7"}},{"ruleId":"D2","level":"warning","message":{"text":"post-data.buildPostData (cognitive 28): post-data.buildPostData has cognitive complexity 28 (threshold 15). Drivers by points: if/else 14 (18 pts), error handling 3 (7 pts), loops 2, boolean chains 1 (nesting depth added 8). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/import/post-data.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"861a4e4abdc877c82eb3283cdec15c5a46b08fdec6fed6b8dfe4704746474878"}},{"ruleId":"D2","level":"warning","message":{"text":"tinybird.create (cognitive 28): tinybird.create has cognitive complexity 28 (threshold 15). Drivers by points: if/else 14 (16 pts), error handling 3 (6 pts), boolean chains 3, ternaries 3 (nesting depth added 5). Most of this is not in the body itself: 0 of the 28 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 113, 25, 68, \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":"ghost/core/core/server/services/stats/utils/tinybird.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"de55e621d4d4d9236a7df55af2bcf0acc2e099fe9b8ed817ebe113c328a7c071"}},{"ruleId":"D2","level":"warning","message":{"text":"mobiledoc-to-lexical.populateLexicalNodeWithMarkers (cognitive 28): mobiledoc-to-lexical.populateLexicalNodeWithMarkers has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (19 pts), boolean chains 4, loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 13). Of this number, 18 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":"koenig/kg-converters/src/mobiledoc-to-lexical.ts"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"515fe379cfab0ea4724f0a14adc3aaf58e43214220a966a01b8962d31bc4d1a7"}},{"ruleId":"D2","level":"warning","message":{"text":"#run (cognitive 28): #run has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (16 pts), loops 4 (5 pts), error handling 1 (2 pts), other 2, ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). Of this number, 26 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":"ghost/core/core/server/data/seeders/data-generator.js"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"333f43526b12c209af881fadfda46a5fa284bf4aaf370b153c94c4543d06fb8d"}},{"ruleId":"D2","level":"warning","message":{"text":"post-list-row.PostListRowComponent (cognitive 27): post-list-row.PostListRowComponent has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 18 (20 pts), boolean chains 7 (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":"apps/admin/src/posts/list/components/post-list-row.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"facff1118577670a643f0dccaa0099f80a459301c56a733ab7f259596516b252"}},{"ruleId":"D2","level":"warning","message":{"text":"options-step.OptionsStep (cognitive 27): options-step.OptionsStep has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 14 (19 pts), boolean chains 8 (nesting depth added 5). Of this number, 26 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/options-step.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"632f815f9f28bc94c21e81ee619d7cf7bb5ae0d910e4c07bf7e3d728492eca0b"}},{"ruleId":"D2","level":"warning","message":{"text":"email-confirmation.createEmailConfirmation (cognitive 27): email-confirmation.createEmailConfirmation has cognitive complexity 27 (threshold 15). Drivers by points: if/else 16 (23 pts), boolean chains 3, loops 1 (nesting depth added 7). Of this number, 20 points are the body\u0027s own statements and 7 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":"apps/admin/src/editor/publish/email-confirmation.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"67dcc1c1adeed6b5a8caa1c0cbf692c5858c50d9e444cc4da5a223e5939d5c4b"}},{"ruleId":"D2","level":"warning","message":{"text":"editor-header-actions.PublishActions (cognitive 27): editor-header-actions.PublishActions has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 10 (20 pts), boolean chains 5, if/else 2 (nesting depth added 10). Of this number, 26 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-header-actions.tsx"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"d03f39072bc09bb9d1475432eb2a169fe1a8cf9edb6d4eeca2ac9603b3ab2e34"}},{"ruleId":"D2","level":"warning","message":{"text":"stripe-connect-modal.Connect (cognitive 27): stripe-connect-modal.Connect has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 6, error handling 2 (5 pts), loops 1 (2 pts), ternaries 2 (nesting depth added 9). Most of this is not in the body itself: 6 of the 27 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 89, 122). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"80652dd34ad12e570cd22e854bc73277b2aad7e66463cda4b23b762a5e7e8cf7"}},{"ruleId":"D2","level":"warning","message":{"text":"add-offer-modal.Sidebar (cognitive 27): add-offer-modal.Sidebar has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 21, ternaries 5, if/else 1. Of this number, 26 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, 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":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc31431e7678af1b8189a3660a27e6ccb2bb3962c6fb0e2d50bead487ed9d2d"}},{"ruleId":"D2","level":"warning","message":{"text":"welcome-email-modal.WelcomeEmailModal (cognitive 27): welcome-email-modal.WelcomeEmailModal has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 20, if/else 6, ternaries 1. Of this number, 18 points are the body\u0027s own statements and 9 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a0ebe51ae8d139e3bacf2be010e83683db87162701237730ed259ae650460b"}},{"ruleId":"D2","level":"warning","message":{"text":"App.getPageFromLinkPath (cognitive 27): App.getPageFromLinkPath has cognitive complexity 27 (threshold 15). Drivers by points: if/else 25 (26 pts), boolean chains 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"458b9df79e1851a1227b6cdf923f2b6a7bd979d92f5837f10f61854b79381ca8"}},{"ruleId":"D2","level":"warning","message":{"text":"chart.ChartTooltipContent (cognitive 27): chart.ChartTooltipContent has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 14, ternaries 6 (9 pts), if/else 4 (nesting depth added 3). Most of this is not in the body itself: 4 of the 27 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 170, 128). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/chart.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a221bee81c270d53b88e952ebd284af5bf89e8f153a28d31a7d4916418397f"}},{"ruleId":"D2","level":"warning","message":{"text":"markdown.renderEntryMarkdown (cognitive 27): markdown.renderEntryMarkdown has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 10 (13 pts), if/else 6 (9 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/llms/markdown.js"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4afa104f0f70961d5a10a5a2c87c370f2f2ee46a2d827ebc461333eba9bfb48"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter-filter-fields.newsletterAddressing (cognitive 26): newsletter-filter-fields.newsletterAddressing has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (13 pts), boolean chains 5, ternaries 3 (5 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":"apps/admin/src/members/newsletter-filter-fields.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e51e798082039815a4771bdca61dc55a82e972069060a6eae4dafc30ad47062"}},{"ruleId":"D2","level":"warning","message":{"text":"preview-frame.EmailPreviewFrame (cognitive 26): preview-frame.EmailPreviewFrame has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 14, if/else 8 (9 pts), ternaries 2 (3 pts) (nesting depth added 2). Of this number, 24 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/email-modal/preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"feaa3be16358f7ac115d3b3621f999d40cf331b8ce2656d04401d225cc63cb69"}},{"ruleId":"D2","level":"warning","message":{"text":"use-post-newsletter-stats.usePostNewsletterStats (cognitive 26): use-post-newsletter-stats.usePostNewsletterStats has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 16, if/else 6, ternaries 4. Most of this is not in the body itself: 6 of the 26 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 40, 64, 159, \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":"apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6a91690d8c01cede73e3469495723fa120291fb71beb40c860a93bb863de1a"}},{"ruleId":"D2","level":"warning","message":{"text":"preview-modal.PreviewModalContent (cognitive 26): preview-modal.PreviewModalContent has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 12, ternaries 1 (nesting depth added 4). Of this number, 19 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/components/preview-modal.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d48901cdbe65a697e8db22356ba8536166a52ed5e14578bfe63087eff21f0fd"}},{"ruleId":"D2","level":"warning","message":{"text":"welcome-email-preview-frame.WelcomeEmailPreviewFrame (cognitive 26): welcome-email-preview-frame.WelcomeEmailPreviewFrame has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 14, if/else 8 (9 pts), ternaries 2 (3 pts) (nesting depth added 2). Of this number, 24 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9cb044476ddf7045452111af3a92e5fa5fdb68a6cb1d0f9ce3ab96b14547bec"}},{"ruleId":"D2","level":"warning","message":{"text":"use-scroll-restoration.useScrollRestoration (cognitive 26): use-scroll-restoration.useScrollRestoration has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (18 pts), boolean chains 6, loops 1 (2 pts) (nesting depth added 5). Most of this is not in the body itself: 0 of the 26 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 242, 280, 177, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/virtual-list/use-scroll-restoration.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"02addc0b5037e903157149a71e19b8ccecbde8cfa8f0fb1375fc1dc52e37e042"}},{"ruleId":"D2","level":"warning","message":{"text":"gift-success-page.GiftSuccessPage (cognitive 26): gift-success-page.GiftSuccessPage has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 10 (14 pts), boolean chains 10, if/else 2 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-success-page.jsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a31c6f4768ab5de5ffbbfc7ff23234a0b5a0d9fde5b99af9fe0c04d701d1836"}},{"ruleId":"D2","level":"warning","message":{"text":"PopupContent.render (cognitive 26): PopupContent.render has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 12, if/else 10 (12 pts), match/switch 1, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/popup-modal.jsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"606718ecc1acf1f9bc1bed9727f16e2780df624afdf8698c692844f98a88a635"}},{"ruleId":"D2","level":"warning","message":{"text":"EmailAddressService.getAddress (cognitive 26): EmailAddressService.getAddress has cognitive complexity 26 (threshold 15). Drivers by points: if/else 15 (21 pts), boolean chains 5 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-address/email-address-service.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"57606005c012b1308d7f225eab05235f2f1d155bfcae3be9dc3a2f35d4362dc6"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkReplacer.replace (cognitive 26): LinkReplacer.replace has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (17 pts), error handling 2 (5 pts), boolean chains 3, loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/lib/link-replacer.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb6494748b59e8d7f857d5feadf264493867a8069faf530b1b0b30a86e205288"}},{"ruleId":"D2","level":"warning","message":{"text":"ProductRepository.create (cognitive 26): ProductRepository.create has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (19 pts), boolean chains 4, 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":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbcbce2408f5d1b701accab7c55555bb407e359a476251df8c502fbc773204f8"}},{"ruleId":"D2","level":"warning","message":{"text":"OEmbedService.fetchOembedData (cognitive 26): OEmbedService.fetchOembedData has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 8, 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":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"133723a5d4c8292dc6caa2c1d07266ef85acb56510b22811a56ccfce72b18c9a"}},{"ruleId":"D2","level":"warning","message":{"text":"body_class.body_class (cognitive 26): body_class.body_class has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 10, ternaries 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/body_class.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"627cc728aca63ccb89e93da82cf3705c2de27f84e5b432849d7a77dbe77cbefa"}},{"ruleId":"D2","level":"warning","message":{"text":"Frame.configure (cognitive 26): Frame.configure has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (25 pts), boolean chains 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/api-framework/lib/Frame.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"17da88aad0df4918a21d6b10dd877f45a2b0ad519f34ff528e92bfca6df41bfe"}},{"ruleId":"D2","level":"warning","message":{"text":"release.waitForChecks (cognitive 26): release.waitForChecks has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (22 pts), boolean chains 3, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/release.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5484428dee7edfd59cac249a1318aad9a7552d5deaf3204b3507945ee853e17"}},{"ruleId":"D2","level":"warning","message":{"text":"add (cognitive 26): add has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 8, error handling 2, ternaries 1 (2 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d82a4790cf34af1f51293d71fcbe8ec0b697da9c42f18b196a51fc6188e11ea"}},{"ruleId":"D2","level":"warning","message":{"text":"querySimplePath (cognitive 26): querySimplePath has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (11 pts), ternaries 4 (10 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 12). Of this number, 19 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/get.js"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aedd3043b13d41daff99e727ba868ac76c90e8cd9e359ef0084b5a062fedd8c"}},{"ruleId":"D2","level":"warning","message":{"text":"use-activity-pub-queries.useReplyChainForUser (cognitive 25): use-activity-pub-queries.useReplyChainForUser has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (12 pts), ternaries 4 (7 pts), error handling 4, boolean chains 2 (nesting depth added 4). Most of this is not in the body itself: 5 of the 25 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 2590, 2618, 2648, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":2551}}}],"partialFingerprints":{"codehealthFindingId/v1":"e685abb1d2ba87756b7599e7164290cc8d2d215b3995c89df4095596d5b0158a"}},{"ruleId":"D2","level":"warning","message":{"text":"suggested-profiles.SuggestedProfiles (cognitive 25): suggested-profiles.SuggestedProfiles has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 16, ternaries 5, if/else 4. Most of this is not in the body itself: 7 of the 25 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 130, 25, 63, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/components/suggested-profiles.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24cabb62c603c0bc1193c6c648d13342fbb6eb63ab43c28e2a007bb42481d8a"}},{"ruleId":"D2","level":"warning","message":{"text":"handle-response.handleResponse (cognitive 25): handle-response.handleResponse has cognitive complexity 25 (threshold 15). Drivers by points: if/else 21 (24 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, 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":"apps/admin-x-framework/src/utils/api/handle-response.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b53d202bf1487a92f1007b6be71cd62ffbae41229a3f6557ecae106a3280b4b"}},{"ruleId":"D2","level":"warning","message":{"text":"growth-sources.GrowthSources (cognitive 25): growth-sources.GrowthSources has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 7, ternaries 5 (7 pts), loops 1 (2 pts) (nesting depth added 6). Most of this is not in the body itself: 11 of the 25 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 141, 168, 161). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/growth-sources.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbed3344812f3db5bd286fd80951322877517d1732db8d37bcc844faaa2d8f2c"}},{"ruleId":"D2","level":"warning","message":{"text":"email-preview.EmailPreview (cognitive 25): email-preview.EmailPreview has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 8 (20 pts), boolean chains 5 (nesting depth added 12). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/preview/email-preview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec88262b933bc044b90432edd97aa8994f417e15fa2bae88f71f8d6c9b19082b"}},{"ruleId":"D2","level":"warning","message":{"text":"addressing.customFieldAddressing (cognitive 25): addressing.customFieldAddressing has cognitive complexity 25 (threshold 15). Drivers by points: if/else 13 (21 pts), boolean chains 3, loops 1 (nesting depth added 8). 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":"apps/admin/src/members/custom-fields/addressing.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e6164a8e2fc43c64bda60476eada21c034e243f0f436a76297480eb30b67294"}},{"ruleId":"D2","level":"warning","message":{"text":"design-modal.DesignModal (cognitive 25): design-modal.DesignModal has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9, ternaries 8 (9 pts), boolean chains 7 (nesting depth added 1). Most of this is not in the body itself: 5 of the 25 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 174, 162, 186, \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":"apps/admin/src/settings/site/design-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb269b09129781c41af2b77698474de650971bc9302be4091d4ddd834562116b"}},{"ruleId":"D2","level":"warning","message":{"text":"use-pintura-editor.usePinturaEditor (cognitive 25): use-pintura-editor.usePinturaEditor has cognitive complexity 25 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 6, error handling 2 (nesting depth added 2). Most of this is not in the body itself: 2 of the 25 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 108, 66, 147, \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":"apps/admin/src/settings/hooks/use-pintura-editor.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"131e8d4e674004b9ba490c43ab12f226a55eb2117ab0dfdccb6d64d5cd022d30"}},{"ruleId":"D2","level":"warning","message":{"text":"platform-validator.createPlatformValidator (cognitive 25): platform-validator.createPlatformValidator has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11, ternaries 6 (7 pts), boolean chains 6, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 234, 284, 211, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/social-urls/platform-validator.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"525b8780461164933aa695701ec3532b60e0ee8cced342913c4fcdd4df943ad3"}},{"ruleId":"D2","level":"warning","message":{"text":"GhKoenigEditorLexical.onTitleKeydown (cognitive 25): GhKoenigEditorLexical.onTitleKeydown has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 8 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-koenig-editor-lexical.js"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a665a8bd5edf4e3775b5e19d2bdc48a41e7db7e453b65dac4ec3e1079acad5"}},{"ruleId":"D2","level":"warning","message":{"text":"filter.createMetafieldsFilterTransformer (cognitive 25): filter.createMetafieldsFilterTransformer has cognitive complexity 25 (threshold 15). Drivers by points: if/else 16 (22 pts), loops 2, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members-metafields/filter.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"8045d772b5b021bbc8f52a780f65d6f4a83b106cb8eb8d91a95031c198107ab2"}},{"ruleId":"D2","level":"warning","message":{"text":"BookshelfPostRelationsResolver.resolveAuthors (cognitive 25): BookshelfPostRelationsResolver.resolveAuthors has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (22 pts), boolean chains 2, loops 1 (nesting depth added 12). 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":"ghost/core/core/server/services/content-import/import/relations.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"054c3ef13705856fb633ef2a136a5c2c80191d88f2a4591de4097ca95eddbdc0"}},{"ruleId":"D2","level":"warning","message":{"text":"handle-image-sizes.handleImageSizes (cognitive 25): handle-image-sizes.handleImageSizes has cognitive complexity 25 (threshold 15). Drivers by points: if/else 18 (19 pts), boolean chains 4, ternaries 1 (2 pts) (nesting depth added 2). Of this number, 15 points are the body\u0027s own statements and 10 belong to 6 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/web/middleware/handle-image-sizes.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c5be5546e01c08d1d535b98ce817e655f3de140d89fa4186e62e97abae7c428"}},{"ruleId":"D2","level":"warning","message":{"text":"check-internal-packages.checkInternalPackages (cognitive 25): check-internal-packages.checkInternalPackages has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (15 pts), error handling 3 (4 pts), boolean chains 3, loops 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-internal-packages.js"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"97ea77ab87b58f2d1d324617d625efc1a23997c2860e2d66f4a1331fb260bb3a"}},{"ruleId":"D2","level":"warning","message":{"text":"_createSubscriptionCheckoutSession (cognitive 25): _createSubscriptionCheckoutSession has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, error handling 2 (5 pts), other 3, ternaries 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"d169017793bcd08a183b0e3787a7ee4cb2dc30302adee0edca996c2ff0f0126a"}},{"ruleId":"D2","level":"warning","message":{"text":"retryDb (cognitive 25): retryDb has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (11 pts), ternaries 3 (7 pts), boolean chains 4, other 2, error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":1031}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3025043e79f94003f0c7278c020e5706d46166852f86ece81231ffe00d6c8f3"}},{"ruleId":"D2","level":"warning","message":{"text":"get (cognitive 25): get has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (13 pts), error handling 5 (10 pts), boolean chains 1, ternaries 1 (nesting depth added 9). Of this number, 23 points are the body\u0027s own statements and 2 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":"ghost/core/core/server/adapters/lib/redis/AdapterCacheRedis.js"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"509790e25db13a4c045481769f32e82ed145169c9d29e01404caf18441da9500"}},{"ruleId":"D2","level":"warning","message":{"text":"web.Web (cognitive 24): web.Web has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 8, ternaries 3 (4 pts) (nesting depth added 4). Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 64, 52, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/web/web.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80b41ffed57dd363bc52e54b7917c2c49d23e59946c10275c5dffe9b44f24ca"}},{"ruleId":"D2","level":"warning","message":{"text":"new-subscribers-cadence.NewSubscribersCadence (cognitive 24): new-subscribers-cadence.NewSubscribersCadence has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 12, if/else 9 (10 pts), ternaries 2 (nesting depth added 1). Most of this is not in the body itself: 8 of the 24 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 345, 113, 142, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f62b69fcd939dfe46e0e720d3e167465b11edff6c731422ca0e65eca89ffc79"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletters.Newsletters (cognitive 24): newsletters.Newsletters has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 16, if/else 6, loops 1 (2 pts) (nesting depth added 1). Most of this is not in the body itself: 8 of the 24 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 368, 334, 342, \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":"apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab56c17e5050439749a72133bb6ead6a9363f804621113480aa1838b2f5ad512"}},{"ruleId":"D2","level":"warning","message":{"text":"feedback.Feedback (cognitive 24): feedback.Feedback has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 7 (19 pts), boolean chains 5 (nesting depth added 12). Of this number, 23 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/newsletter/components/feedback.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4a82b2e5067b17ceeb61fd7dac5013821e70dacbdbdfd5a9be8f190b7dfd13"}},{"ruleId":"D2","level":"warning","message":{"text":"editor-screen.EditorLoader (cognitive 24): editor-screen.EditorLoader has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 7, ternaries 4 (5 pts) (nesting depth added 3). Of this number, 21 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-screen.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"511c3c71d7a0c4b8daa0e6533e6dccb229ca32088a6b360ed5c41f889f283529"}},{"ruleId":"D2","level":"warning","message":{"text":"members-actions.MembersActions (cognitive 24): members-actions.MembersActions has cognitive complexity 24 (threshold 15). Drivers by points: error handling 6 (7 pts), boolean chains 5, if/else 5, ternaries 4 (5 pts), loops 2 (nesting depth added 2). Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 136, 86, 111, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/members-actions.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"27efa103d42d8e2e6b87cb10302132d939e5ca5ad2307df840caf534cfd489eb"}},{"ruleId":"D2","level":"warning","message":{"text":"member-event.getIcon (cognitive 24): member-event.getIcon has cognitive complexity 24 (threshold 15). Drivers by points: if/else 18 (19 pts), boolean chains 5 (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":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb93f00f13b8b1053c519114241661545fe20f7640ce1d2aeff4a71ff00fa3f6"}},{"ruleId":"D2","level":"warning","message":{"text":"comments-list.CommentsList (cognitive 24): comments-list.CommentsList has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 13, if/else 7 (8 pts), ternaries 3 (nesting depth added 1). 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 127, 88, 77, \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":"apps/admin/src/comments/components/comments-list.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"59df00a0f29b4dc2657433bfd630ab753f1cf2639811efd9772de0abee131aeb"}},{"ruleId":"D2","level":"warning","message":{"text":"tier-detail-preview.TierDetailPreview (cognitive 24): tier-detail-preview.TierDetailPreview has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 17, ternaries 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":"apps/admin/src/settings/membership/tiers/tier-detail-preview.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba831f54d87569f21d3b144c36a45f0ab0b9283fdc375e48768fe4600095673"}},{"ruleId":"D2","level":"warning","message":{"text":"embed-signup-sidebar.EmbedSignupSidebar (cognitive 24): embed-signup-sidebar.EmbedSignupSidebar has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 10, ternaries 2, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 7 of the 24 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 73, 97, 146, \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":"apps/admin/src/settings/growth/embed-signup/embed-signup-sidebar.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef808c6711ced9d9037e8523d6ad47ebcaa4b421ff2a1fd2ca4d8aafb7cf2716"}},{"ruleId":"D2","level":"warning","message":{"text":"edit-retention-offer-modal.RetentionOfferSidebar (cognitive 24): edit-retention-offer-modal.RetentionOfferSidebar has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 19, ternaries 5. 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":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"7be48377cc46066e65298cd0a5df212a100ce4b8f7317ff89509b66e583ea120"}},{"ruleId":"D2","level":"warning","message":{"text":"yaml-file-editor-modal.YamlFileEditorModal (cognitive 24): yaml-file-editor-modal.YamlFileEditorModal has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 9, if/else 7 (9 pts), ternaries 2 (4 pts), error handling 2 (nesting depth added 4). Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 61, 95, 119). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/labs/yaml-file-editor-modal.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a7bc47b8416a85e406c6036ee8a917304bd1646e336fa33b0fc7b19ccc6adef"}},{"ruleId":"D2","level":"warning","message":{"text":"default-recipients.DefaultRecipients (cognitive 24): default-recipients.DefaultRecipients has cognitive complexity 24 (threshold 15). Drivers by points: if/else 17, boolean chains 4, ternaries 2 (3 pts) (nesting depth added 1). Most of this is not in the body itself: 2 of the 24 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 148, 174, 194, \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":"apps/admin/src/settings/email/default-recipients.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ccdd1d219627c72a72cd796eda8a29c8eaaaa2a65b5df5c2ae173481c2377c2"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.updateCommentLikeState (cognitive 24): actions.updateCommentLikeState has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 6, ternaries 2 (4 pts) (nesting depth added 8). Most of this is not in the body itself: 0 of the 24 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 312, 311). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/actions.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"895d881fae0eab970a88275c5b16bab3c39336106856a069bbc0cb5dcd04b325"}},{"ruleId":"D2","level":"warning","message":{"text":"SigninController.authenticateTask (cognitive 24): SigninController.authenticateTask has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (19 pts), boolean chains 4, error handling 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/controllers/signin.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d74ca46d346cd449957c779d98631a606a1b7d9a6c80cb9d80c001a6e9313b5"}},{"ruleId":"D2","level":"warning","message":{"text":"ajaxService._makeRequest (cognitive 24): ajaxService._makeRequest has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 6, error handling 1 (2 pts), loops 1 (nesting depth added 7). 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":"apps/ember-admin/app/services/ajax.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3a1f973c5a49563837dbeddbbcfe4f1650c588a9cd1cce21a57f4f2384031b"}},{"ruleId":"D2","level":"warning","message":{"text":"get-discount-window.getDiscountWindow (cognitive 24): get-discount-window.getDiscountWindow has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (22 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":"ghost/core/core/server/services/members/members-api/utils/get-discount-window.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d8dea2a64a636ce4c572db1e590263d1b75c993d3c2ab47e02ed67680e62e41"}},{"ruleId":"D2","level":"warning","message":{"text":"BookshelfPostRelationsResolver.resolveTags (cognitive 24): BookshelfPostRelationsResolver.resolveTags has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (17 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 14). Of this number, 19 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":"ghost/core/core/server/services/content-import/import/relations.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"f157a5208d4c793247ababb6618b58c24f635a721055f3f040cf7222d05c7743"}},{"ruleId":"D2","level":"warning","message":{"text":"EmailAnalyticsService.#fetchEventsForJob (cognitive 24): EmailAnalyticsService.#fetchEventsForJob has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (17 pts), boolean chains 4, error handling 3 (nesting depth added 3). Of this number, 19 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-analytics/email-analytics-service.ts"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63545f8397409f2852fb363bcc431fe9590f848ce9860d85d6885972b42f0a7"}},{"ruleId":"D2","level":"warning","message":{"text":"context.setResponseContext (cognitive 24): context.setResponseContext has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 7, ternaries 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":"ghost/core/core/frontend/services/rendering/context.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"e10ab8d94aa2928b1bab899f860bb7493b7b01a604309f137b69f5f52ef6ec94"}},{"ruleId":"D2","level":"warning","message":{"text":"unsubscribe.unsubscribeController (cognitive 24): unsubscribe.unsubscribeController has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (17 pts), ternaries 1 (4 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/routing/controllers/unsubscribe.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce479cbf73cc939929d18cdb356684c9d0889bba5a7766bf16f2b0603905364"}},{"ruleId":"D2","level":"warning","message":{"text":"SlackPingService.ping (cognitive 24): SlackPingService.ping has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (14 pts), ternaries 2 (5 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/slack-ping/slack-ping-service.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5abfa4528df7bfcc8a373493ef18a3c7016f0d30ec61f9cc5b04b57b78f1dad"}},{"ruleId":"D2","level":"warning","message":{"text":"defaultRelations (cognitive 24): defaultRelations has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (20 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 14). 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":"ghost/core/core/server/models/comment.js"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"72e1b25a550d699149f61e0060573ab3ada1868066b93dd46c5e82c3e527e298"}},{"ruleId":"D2","level":"warning","message":{"text":"history-modal.HistoryFilter (cognitive 23): history-modal.HistoryFilter has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (13 pts), ternaries 4 (5 pts), boolean chains 4, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 6 of the 23 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 116, 133, 169, \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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"082693bc5a4555ee76a1cb7b87443ee2273d1988091747822ea43edd40174c1a"}},{"ruleId":"D2","level":"warning","message":{"text":"format-url.formatUrl (cognitive 23): format-url.formatUrl has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14 (17 pts), boolean chains 5, error handling 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/format-url.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9598539122c75e24e788d65078ad1d14a106239f790af5b721ea3dd63aaea06b"}},{"ruleId":"D2","level":"warning","message":{"text":"filter-addressing.composeCodec (cognitive 23): filter-addressing.composeCodec has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (19 pts), ternaries 2 (3 pts), boolean chains 1 (nesting depth added 9). Most of this is not in the body itself: 10 of the 23 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 204, 188). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/filters/filter-addressing.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18c3c293bc224fb46cfb9396df7e22186b3a220f482f5f416d3ac4a5094fdb5"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.updateCommentDislikeState (cognitive 23): actions.updateCommentDislikeState has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 7 (nesting depth added 6). Most of this is not in the body itself: 0 of the 23 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 420, 419, 408). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/actions.ts"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"991a2d728acb1876eba9c95f359e3f96e2297cf846a341c85a9c37593c19d850"}},{"ruleId":"D2","level":"warning","message":{"text":"PublishFlowCompleteWithEmailError.retryEmailTask (cognitive 23): PublishFlowCompleteWithEmailError.retryEmailTask has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 3, loops 1 (2 pts), error handling 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/editor/modals/publish-flow/complete-with-email-error.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6fda6424b9cfe921f0fea8b467e47f1ca5c37797cca11bcd2fe9a1ba56a1ed"}},{"ruleId":"D2","level":"warning","message":{"text":"members.mockMembers (cognitive 23): members.mockMembers has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 8, error handling 2 (4 pts) (nesting depth added 4). Most of this is not in the body itself: 0 of the 23 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 81, 278, 149, \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":"apps/ember-admin/mirage/config/members.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"455b0c31725af9433d6fbe630a50369f530100f2939cc19a8174d7bd45fe8da4"}},{"ruleId":"D2","level":"warning","message":{"text":"pagemenu.PageMenu (cognitive 23): pagemenu.PageMenu has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 9, if/else 7 (8 pts), ternaries 2 (4 pts), loops 2 (nesting depth added 3). Most of this is not in the body itself: 6 of the 23 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 45, 38, 100, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/pagemenu.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"c85e677316549fe5bbc18a200429f0f88ea8f56c2098748f3adaa92c501ad768"}},{"ruleId":"D2","level":"warning","message":{"text":"email-design.getEmailDesign (cognitive 23): email-design.getEmailDesign has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11, ternaries 6, match/switch 4, boolean chains 2. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-rendering/email-design.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbff455cd9e2f7ccac72a9338a189fa7740e68f88151c3b27e00bf78fde76168"}},{"ruleId":"D2","level":"warning","message":{"text":"EmailRenderer.buildReplacementDefinitions (cognitive 23): EmailRenderer.buildReplacementDefinitions has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 2 (5 pts), loops 3, boolean chains 2 (nesting depth added 9). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":962}}}],"partialFingerprints":{"codehealthFindingId/v1":"413f6e6ed5d195acc83e3815e8e928ca079a380b81670a4a59cc0843c2351e2f"}},{"ruleId":"D2","level":"warning","message":{"text":"MppAdapter.#run (cognitive 23): MppAdapter.#run has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 8, ternaries 5, 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":"ghost/core/core/server/services/machine-payments/adapters/mpp-adapter.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"514598c6abfe4cf2781f18861a8aec4e84132582a4392009b828c4407c2a8dc8"}},{"ruleId":"D2","level":"warning","message":{"text":"video.handleVideoPlayer (cognitive 23): video.handleVideoPlayer has cognitive complexity 23 (threshold 15). Drivers by points: if/else 15 (20 pts), boolean chains 2, ternaries 1 (nesting depth added 5). Most of this is not in the body itself: 8 of the 23 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 143, 56, 109, \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":"ghost/core/core/frontend/src/cards/js/video.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66c43ec7bbf573af04ab0b9835cd2749ba8bb698ac413d8497abcb888e90e88"}},{"ruleId":"D2","level":"warning","message":{"text":"comment-counts.renderCounts (cognitive 23): comment-counts.renderCounts has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (22 pts), loops 1 (nesting depth added 12). 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 29). 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":"ghost/core/core/frontend/src/comment-counts/comment-counts.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86c3dd5dbe85da6f4dc639b4698752141c390046e04087c21c82efecd5b0a3c"}},{"ruleId":"D2","level":"warning","message":{"text":"prune.prune (cognitive 23): prune.prune has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (20 pts), boolean chains 1, loops 1, ternaries 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/scripts/prune.mts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff16cdf76f8a11788dd44ec4c69c928abfc1f9a8dddac112c96dbaed3cb60276"}},{"ruleId":"D2","level":"warning","message":{"text":"getMemberStatusText (cognitive 23): getMemberStatusText has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 3, other 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":883}}}],"partialFingerprints":{"codehealthFindingId/v1":"27c70f38aed17ba68ea2a4044e675574b7cf55cc343b441ca7f983bc7a32dd26"}},{"ruleId":"D2","level":"warning","message":{"text":"limitImageWidth (cognitive 23): limitImageWidth has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (16 pts), ternaries 1 (3 pts), boolean chains 2, error handling 1 (2 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":1552}}}],"partialFingerprints":{"codehealthFindingId/v1":"d265287c6fd0f55903e1b01096f34d5c58394e6c51918d614a7a45b3985b542e"}},{"ruleId":"D2","level":"warning","message":{"text":"onSaving (cognitive 23): onSaving has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 6 (nesting depth added 7). Of this number, 19 points are the body\u0027s own statements and 4 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"30212b61dd6ae97a69d96fa0bc9257764ac3c9e58d7a31a6eb6872dd6d45d5f9"}},{"ruleId":"D2","level":"warning","message":{"text":"_setAttributionMetadata (cognitive 23): _setAttributionMetadata has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (23 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"8310d5b84005462b4d8729f9c5632724f6aba9ff8f1ae3f7ccafebe1fd7ce895"}},{"ruleId":"D2","level":"warning","message":{"text":"edit (cognitive 23): edit has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 6, error handling 1, ternaries 1 (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":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf40b9c5883f1f4e6f2951f43a56ce9ba2ac186e201470fc36e916ebefb32aa8"}},{"ruleId":"D2","level":"warning","message":{"text":"getAdminToolbarHelper (cognitive 23): getAdminToolbarHelper has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 10, ternaries 9 (10 pts), if/else 3 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/ghost_head.js"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"d72d8c6e603381dc19b1a30cedf43728b47529d3ec33dfb2dc842402385fcf0e"}},{"ruleId":"D2","level":"warning","message":{"text":"use-keyboard-shortcuts.useKeyboardShortcuts (cognitive 22): use-keyboard-shortcuts.useKeyboardShortcuts has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 5, match/switch 1 (nesting depth added 7). Most of this is not in the body itself: 0 of the 22 points are its own statements and the rest belongs to one function literal inside it that branches (line 16). 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":"apps/activitypub/src/hooks/use-keyboard-shortcuts.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"affd36bfee20dd63c2f3f49a2325ec5c5c26cf717c02e7c468d64a93a818fae2"}},{"ruleId":"D2","level":"warning","message":{"text":"email-recipients-options.EmailRecipientsOptions (cognitive 22): email-recipients-options.EmailRecipientsOptions has cognitive complexity 22 (threshold 15). Drivers by points: boolean chains 11, ternaries 7 (8 pts), if/else 3 (nesting depth added 1). Most of this is not in the body itself: 7 of the 22 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 109, 93, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/email-recipients-options.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"02c4ccab0609183be56aef2e868fb01716014a88f80041d18f042e7c97dad29d"}},{"ruleId":"D2","level":"warning","message":{"text":"add-recommendation-modal.AddRecommendationModal (cognitive 22): add-recommendation-modal.AddRecommendationModal has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11, boolean chains 6, ternaries 3 (4 pts), error handling 1 (nesting depth added 1). Most of this is not in the body itself: 7 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 130, 74, 156, \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":"apps/admin/src/settings/growth/recommendations/add-recommendation-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4836b8c216905a6d731565503905d80b7c4bae77ce2f902d5f6b915541be3052"}},{"ruleId":"D2","level":"warning","message":{"text":"api.setupGhostApi (cognitive 22): api.setupGhostApi has cognitive complexity 22 (threshold 15). Drivers by points: boolean chains 18, if/else 4. Of this number, 20 points are the body\u0027s own statements and 2 belong to 29 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":"apps/portal/src/utils/api.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba83f208698c2d07d3eb007f8f29b10252fbd15e905bf3c38cc84984ccf1f69d"}},{"ruleId":"D2","level":"warning","message":{"text":"PostsImporter.beforeImport (cognitive 22): PostsImporter.beforeImport has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 6, error handling 1 (2 pts) (nesting depth added 6). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 253, 290, 321). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/posts-importer.js"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac8f9b281665cb0e4aea5028aaadad2b69bdd9fcc9e69e6b5878f3990839aa6"}},{"ruleId":"D2","level":"warning","message":{"text":"NewsletterEmailAnalyticsBatchProcessor.#processEvent (cognitive 22): NewsletterEmailAnalyticsBatchProcessor.#processEvent has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13 (22 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":"ghost/core/core/server/services/email-analytics/newsletter-email-analytics-batch-processor.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b3e5b70bd462da86ae45f5d3b25448ac703237c6703fca629e5eceedd2f54d"}},{"ruleId":"D2","level":"warning","message":{"text":"image-dimensions.getImageDimensions (cognitive 22): image-dimensions.getImageDimensions has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 3 (nesting depth added 10). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to one function literal inside it that branches (line 40). 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":"ghost/core/core/frontend/meta/image-dimensions.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"f71d7fbae574407e1dacef6e52097036c30701cbc5efe59fcdebb881ec97115a"}},{"ruleId":"D2","level":"warning","message":{"text":"navigation.navigation (cognitive 22): navigation.navigation has cognitive complexity 22 (threshold 15). Drivers by points: boolean chains 14, if/else 5, ternaries 3. Of this number, 16 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, 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":"ghost/core/core/frontend/helpers/navigation.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"da98a1106e4f49444d1f4360abc9daee276a206bd121b87f757fd81ee18178b5"}},{"ruleId":"D2","level":"warning","message":{"text":"error-handler.themeErrorRenderer (cognitive 22): error-handler.themeErrorRenderer has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 7 (nesting depth added 4). Of this number, 21 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/web/middleware/error-handler.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4b7d0780ddab2bcca5c5faab44edcd42827940178c90559e1933d72b833d59"}},{"ruleId":"D2","level":"warning","message":{"text":"poll.processStep (cognitive 22): poll.processStep has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (10 pts), error handling 3 (6 pts), ternaries 2 (3 pts), boolean chains 2, match/switch 1 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/automations/poll.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"bac4252e31c33d46d72b33bb3d7e724056cea232d57fbd33def0bbe0429b01b2"}},{"ruleId":"D2","level":"warning","message":{"text":"http.http (cognitive 22): http.http has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 4, error handling 1, ternaries 1 (nesting depth added 4). Most of this is not in the body itself: 0 of the 22 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 23, 96). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/api-framework/lib/http.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d76af672d74e8b10e8de5c2db4b110008d34139ccb94f7ba4704d7202f53da"}},{"ruleId":"D2","level":"warning","message":{"text":"all.validate (cognitive 22): all.validate has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (15 pts), ternaries 2 (5 pts), boolean chains 2 (nesting depth added 11). Most of this is not in the body itself: 0 of the 22 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 49, 36). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/api-framework/lib/validators/input/all.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf3b1f5020d5210c37adb4ec2e63f449680edf04d62e49b89cca4dce979c37a"}},{"ruleId":"D2","level":"warning","message":{"text":"setComplimentarySubscription (cognitive 22): setComplimentarySubscription has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 9). Of this number, 19 points are the body\u0027s own statements and 3 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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":2457}}}],"partialFingerprints":{"codehealthFindingId/v1":"8424e735348ace7556ee5acebc70dae3143b6d25ed084110007895e23a5f55a4"}},{"ruleId":"D2","level":"warning","message":{"text":"_getSubscriptionCheckoutData (cognitive 22): _getSubscriptionCheckoutData has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 5, error handling 1 (2 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"7572cb0374251af3bd3dbf24ef0ae542491c5fa9690d91727e1cc14b31ea1085"}},{"ruleId":"D2","level":"warning","message":{"text":"use-activity-pub-queries.updateLikeCache (cognitive 21): use-activity-pub-queries.updateLikeCache has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (12 pts), ternaries 2 (6 pts), boolean chains 2, loops 1 (nesting depth added 11). Most of this is not in the body itself: 6 of the 21 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 132, 122, 156, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"cada6a81ac26e10fd6d6bc441a056cab34d721781141f83d81d6bc226c3dbddf"}},{"ruleId":"D2","level":"warning","message":{"text":"inbox-list.InboxList (cognitive 21): inbox-list.InboxList has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 7, ternaries 3 (6 pts) (nesting depth added 4). Most of this is not in the body itself: 10 of the 21 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 59, 182, 105, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/inbox/components/inbox-list.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eac7b5a67a807502780ca2def1bf3a69d4c1ee8ee700e5c09794b1eabcc9fb7"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletter-radial-chart.NewsletterRadialChart (cognitive 21): newsletter-radial-chart.NewsletterRadialChart has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 5 (10 pts), boolean chains 7, if/else 3, match/switch 1 (nesting depth added 5). Most of this is not in the body itself: 2 of the 21 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 47, 139, 35). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/newsletter/components/newsletter-radial-chart.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1137d4d173fe9804f34a3dd94ecae5d5f5bd370a3032b2cc97c0e3086421524e"}},{"ruleId":"D2","level":"warning","message":{"text":"theme-modal.ThemeToolbar (cognitive 21): theme-modal.ThemeToolbar has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 7, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 3 of the 21 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 160, 211, 87, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"854d297e3858bb444c4e3dbbdfb83b552779e4028a2767847fea83f056527775"}},{"ruleId":"D2","level":"warning","message":{"text":"webhook-modal.WebhookModal (cognitive 21): webhook-modal.WebhookModal has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 12, if/else 7, ternaries 2. Of this number, 13 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations/webhook-modal.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"d99e9e019441682c1eb7b76b187e1d77cde94405ba47d12d0f1fad685ddcff39"}},{"ruleId":"D2","level":"warning","message":{"text":"use-unsaved-changes-guard.useUnsavedChangesGuard (cognitive 21): use-unsaved-changes-guard.useUnsavedChangesGuard has cognitive complexity 21 (threshold 15). Drivers by points: if/else 14, boolean chains 7. Most of this is not in the body itself: 5 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 90, 129, 168, \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":"apps/admin/src/hooks/use-unsaved-changes-guard.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d4a2104fbcaca68d4c37ac4bf3981e56277c7a433d9fd57fe7836bbb37462f2"}},{"ruleId":"D2","level":"warning","message":{"text":"custom-field-picker.CreateFieldInline (cognitive 21): custom-field-picker.CreateFieldInline has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 8, if/else 5 (7 pts), ternaries 3 (5 pts), error handling 1 (nesting depth added 4). Most of this is not in the body itself: 6 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 236, 284). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/member-custom-fields/custom-field-picker.tsx"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"36884c679587a6b83f274f296040e09b23e6421c0de5bd8e5bd505c5178f43a0"}},{"ruleId":"D2","level":"warning","message":{"text":"KoenigLexicalEditor.ReactComponent (cognitive 21): KoenigLexicalEditor.ReactComponent has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 4, ternaries 3, error handling 2 (nesting depth added 3). Most of this is not in the body itself: 3 of the 21 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 431, 484, 415, \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":"apps/ember-admin/app/components/koenig-lexical-editor.js"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"15eff5e15e3df617b4cb734a5ace4d4b77212e53d76c7122ca6abee61e8fbb96"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersCountCacheService.countString (cognitive 21): MembersCountCacheService.countString has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 7, ternaries 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/members-count-cache.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"36506da93e5e91a1b35eb4b279cda4c1b51697e687c04b7dcf0f8e87dec4dfcf"}},{"ruleId":"D2","level":"warning","message":{"text":"input-field.InputField (cognitive 21): input-field.InputField has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 8 (13 pts), boolean chains 4, if/else 3, match/switch 1 (nesting depth added 5). 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":"apps/portal/src/components/common/input-field.jsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cfb88ca9e8ea2f2eb11efa57aabd1a6d8ab57bd7ed66b4bcf589ae3eb68c012"}},{"ruleId":"D2","level":"warning","message":{"text":"date-picker.DatePicker (cognitive 21): date-picker.DatePicker has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 9, if/else 7, ternaries 4, error handling 1. Most of this is not in the body itself: 5 of the 21 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 346, 383, 392, \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":"apps/portal/src/components/common/date-picker.jsx"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e3a88693ff1a4a3f356fa40bda8e193a2a47465f0d2be07c0adc32ee7e230b"}},{"ruleId":"D2","level":"warning","message":{"text":"BookshelfPostsRepository.write (cognitive 21): BookshelfPostsRepository.write has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (14 pts), ternaries 3 (5 pts), boolean chains 2 (nesting depth added 7). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to one function literal inside it that branches (line 57). 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":"ghost/core/core/server/services/content-import/import/post-repository.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"48092f50641de97b4ba380d39d0f6043df5bc4b3f68c5213574385084d735bb2"}},{"ruleId":"D2","level":"warning","message":{"text":"upload.mediaValidation (cognitive 21): upload.mediaValidation has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 9 (nesting depth added 5). Most of this is not in the body itself: 0 of the 21 points are its own statements and the rest belongs to one function literal inside it that branches (line 409). 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":"ghost/core/core/server/web/api/middleware/upload.js"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"886bddfe498b60eccc37a8c6f360d2df067b2765f97e0c965a70ba3600fc881a"}},{"ruleId":"D2","level":"warning","message":{"text":"resolve.resolve (cognitive 21): resolve.resolve has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 3, ternaries 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/remote-flags/resolve.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"907a2e392eedc7c0a5636353fce3c6eaf6c8b600a4d3c401684ff62c5a94c6f4"}},{"ruleId":"D2","level":"warning","message":{"text":"csv.fieldValuesFromCsvRow (cognitive 21): csv.fieldValuesFromCsvRow has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (17 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/metafield-types/src/csv.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"db90e3bead07a4b3b73bc7aec00b2a81330233bd1d7aee72c85a1cb73d95e1e8"}},{"ruleId":"D2","level":"warning","message":{"text":"applyOfferToSubscription (cognitive 21): applyOfferToSubscription has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, boolean chains 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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":2224}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f864a561e3215352f33bcb0f65aadcdf96d8b01115c353ecfa2f1f8fe078e2d"}},{"ruleId":"D2","level":"warning","message":{"text":"permissible (cognitive 21): permissible has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 12, if/else 8 (9 pts) (nesting depth added 1). Of this number, 19 points are the body\u0027s own statements and 2 belong to 3 function items inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/post.js"},"region":{"startLine":1523}}}],"partialFingerprints":{"codehealthFindingId/v1":"087da299d074bc462d3149f7a41ff9e2f8f65d169f4d440811a92b2645617f5b"}},{"ruleId":"D2","level":"warning","message":{"text":"sendBatch (cognitive 21): sendBatch has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (16 pts), other 2, boolean chains 1, error handling 1, ternaries 1 (nesting depth added 7). Of this number, 18 points are the body\u0027s own statements and 3 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":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7badac69b5dd8e47b4325de79f0bbb7bbc00a334dc7db9604829ba02713ae8"}},{"ruleId":"D2","level":"warning","message":{"text":"getInfo (cognitive 21): getInfo has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (8 pts), boolean chains 2, 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":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5d63bbb55d7afba7ceeb608d7aa25fd53b0579f5c2c67d71ec02d2457b6fce1"}},{"ruleId":"D2","level":"warning","message":{"text":"mediaValidation::mediaUploadValidation (cognitive 21): mediaValidation::mediaUploadValidation has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 9 (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":"ghost/core/core/server/web/api/middleware/upload.js"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"d90d985ae1c0af5af3bd534a2c2370583ee9a58d7a51c4d5b6997529b9cfdd0f"}},{"ruleId":"D2","level":"warning","message":{"text":"model (cognitive 21): model has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 7, ternaries 1 (3 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"apps/ember-admin/app/routes/posts.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"16cf19f59d9d74c008d1a09a785d2fec3273fb7bc05d12d278e78affa85f51d6"}},{"ruleId":"D2","level":"warning","message":{"text":"use-activity-pub-queries.useFollowMutationForUser (cognitive 20): use-activity-pub-queries.useFollowMutationForUser has cognitive complexity 20 (threshold 15). Drivers by points: if/else 14 (16 pts), ternaries 3 (4 pts) (nesting depth added 3). Most of this is not in the body itself: 6 of the 20 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 1288, 1417, 1251, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":1231}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09faffe011659d985e3948dcc1dad235ec7898b71ba5b307aa1346c16fae109"}},{"ruleId":"D2","level":"warning","message":{"text":"unsubscribe-modal.UnsubscribeModal (cognitive 20): unsubscribe-modal.UnsubscribeModal has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 8, if/else 6, ternaries 5 (6 pts) (nesting depth added 1). Of this number, 11 points are the body\u0027s own statements and 9 belong to 9 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":"apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8736b0eeebac9289cfbdf4b52787f81f7b2a4f653ae5c341457883c9a4b14ea5"}},{"ruleId":"D2","level":"warning","message":{"text":"mapping.detectFieldTypes (cognitive 20): mapping.detectFieldTypes has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (5 pts), boolean chains 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/mapping.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"957bfd7dce6088c8954df1dc7a9702324565ce3d82c5cb3e2dfa26e18ebf4d78"}},{"ruleId":"D2","level":"warning","message":{"text":"portal-modal.PortalModal (cognitive 20): portal-modal.PortalModal has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 7, ternaries 3, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 3 of the 20 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 121, 170, 254, \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":"apps/admin/src/settings/membership/portal/portal-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"7432a0ae7889dc0cbc78d60cff025f4485eb0207ff805cacb76214f5e61e196e"}},{"ruleId":"D2","level":"warning","message":{"text":"history-modal.HistoryModal (cognitive 20): history-modal.HistoryModal has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 10, ternaries 5 (9 pts), if/else 1 (nesting depth added 4). Of this number, 14 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7fe1ecaf680b40c4f0d8ffcce2c119e218d3f7ead0961219d450317cebc0c1"}},{"ruleId":"D2","level":"warning","message":{"text":"post-list-row-email-status.PostListRowEmailStatus (cognitive 20): post-list-row-email-status.PostListRowEmailStatus has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 6, ternaries 2 (4 pts) (nesting depth added 3). Of this number, 11 points are the body\u0027s own statements and 9 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":"apps/admin/src/posts/list/components/post-list-row-email-status.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"78f4cbc0f7c5f4ebd61febe8200883f451fd744931fd5dabc0785a8a2a7918b6"}},{"ruleId":"D2","level":"warning","message":{"text":"export-all-modal.ExportAllModal (cognitive 20): export-all-modal.ExportAllModal has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 9, if/else 4 (5 pts), error handling 2 (3 pts), ternaries 2 (3 pts) (nesting depth added 3). Most of this is not in the body itself: 5 of the 20 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 117, 99, 95, \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":"apps/admin/src/settings/advanced/migration-tools/export-all-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ecae7239b378bf6d6ae5a0517c866ff53296c664b7af02de27e601c568dc75b"}},{"ruleId":"D2","level":"warning","message":{"text":"color-picker-field.ColorPickerField (cognitive 20): color-picker-field.ColorPickerField has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8, boolean chains 6, ternaries 6. Most of this is not in the body itself: 6 of the 20 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 146, 85, 91, \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":"apps/admin/src/settings/components/color-picker-field.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"04f9e2646a18d7094a9259bba8a254df4aa140927c0171477e0cf2dff440ab0e"}},{"ruleId":"D2","level":"warning","message":{"text":"use-default-recipients-options.useDefaultRecipientsOptions (cognitive 20): use-default-recipients-options.useDefaultRecipientsOptions has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 10, if/else 6 (8 pts), error handling 1, loops 1 (nesting depth added 2). Most of this is not in the body itself: 0 of the 20 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 104, 68, 152). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/use-default-recipients-options.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc8c8f3bb683120a3512c8a15322a80927b86413da1176d23d6bf8100d91fd2"}},{"ruleId":"D2","level":"warning","message":{"text":"relative-date-filter.RelativeDateFilter (cognitive 20): relative-date-filter.RelativeDateFilter has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 6 (9 pts), if/else 5 (7 pts), boolean chains 4 (nesting depth added 5). Of this number, 11 points are the body\u0027s own statements and 9 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":"apps/admin/src/shared/filters/relative-date-filter.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"555a5acc4e545f1c9efe7c37db52eb878fc423b839b098c76e19f38985b3b6bc"}},{"ruleId":"D2","level":"warning","message":{"text":"LexicalEditorController._hasDirtyAttributes (cognitive 20): LexicalEditorController._hasDirtyAttributes has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 6, ternaries 4 (5 pts) (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":1444}}}],"partialFingerprints":{"codehealthFindingId/v1":"18219c23bf984d3eb036a88fb43a79d9818807e960cfe54b89d90f853f2f569b"}},{"ruleId":"D2","level":"warning","message":{"text":"share-modal.ShareModal (cognitive 20): share-modal.ShareModal has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 12, if/else 4, ternaries 4. Of this number, 14 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/share/share-modal.jsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0faac311eb9e12931344cd06df9a5ac869edd50eba434551d4b4e190b585cbed"}},{"ruleId":"D2","level":"warning","message":{"text":"App.componentDidUpdate (cognitive 20): App.componentDidUpdate has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 3, error handling 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":"apps/portal/src/app.jsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"a942e4bea8b8ab2102322af824024aacee96417cc3ca2ebeb6460fbfb9c6f2e3"}},{"ruleId":"D2","level":"warning","message":{"text":"extract-adoption.scanApp (cognitive 20): extract-adoption.scanApp has cognitive complexity 20 (threshold 15). Drivers by points: loops 5 (15 pts), if/else 2 (4 pts), error handling 1 (nesting depth added 12). 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":"apps/shade/scripts/extract-adoption.ts"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e0c23826fe73d78278d4a7d0c9cb9fa39fb7d33886495260de628d38b88b1d3"}},{"ruleId":"D2","level":"warning","message":{"text":"code-editor-view.CodeEditorView (cognitive 20): code-editor-view.CodeEditorView has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9, boolean chains 7, ternaries 4. Of this number, 10 points are the body\u0027s own statements and 10 belong to 6 function literals inside it that branch. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/code-editor-view.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"2173df261383f96c578bca92f45d1199151d47be18e47a751915980e9754a4e4"}},{"ruleId":"D2","level":"warning","message":{"text":"App.componentDidUpdate (cognitive 20): App.componentDidUpdate has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 5, error handling 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/sodo-search/src/app.jsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4b8246b3b5c20f59e7fdd2e62514e628048b2838da1e9447c69d282c54c653"}},{"ruleId":"D2","level":"warning","message":{"text":"LazyUrlService.getRequiredRelations (cognitive 20): LazyUrlService.getRequiredRelations has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/url/lazy-url-service.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"51f3c4697df693b083059dc20e7430a0f2af8b807f4bd6f4d83af7b36cf12498"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsBREADService.edit (cognitive 20): SettingsBREADService.edit has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 4 (nesting depth added 7). Of this number, 14 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/settings/settings-bread-service.js"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"5928f1b795b8dc2f2ad3da9fb370213fcbdf7ba1990ca370a10197bc7c305a8e"}},{"ruleId":"D2","level":"warning","message":{"text":"parse.parseWithSource (cognitive 20): parse.parseWithSource has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/csv/parse.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"179e00bb00c7ab073d816e940396161814d946af5a72367e8c741a3e7ab914d5"}},{"ruleId":"D2","level":"warning","message":{"text":"edit (cognitive 20): edit has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (15 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"1743ccf36e2d4af81b5b5371c7a3d91382ca6aa746e5de752adc5ed39510dc76"}},{"ruleId":"D2","level":"warning","message":{"text":"feed-item-stats.FeedItemStats (cognitive 19): feed-item-stats.FeedItemStats has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 10, if/else 7, ternaries 2. Of this number, 12 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item-stats.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"735061ad9e4f56d65cedf746b35d8785e1ef07c3d2032a4e1f83cad6bf344617"}},{"ruleId":"D2","level":"warning","message":{"text":"members.membersCountString (cognitive 19): members.membersCountString has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 7, ternaries 3 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/api/members.ts"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"98fab72824bde410878b6c16df7512f00c280686a4115a945c6ef71487264b7b"}},{"ruleId":"D2","level":"warning","message":{"text":"use-koenig-file-upload.useKoenigFileUpload (cognitive 19): use-koenig-file-upload.useKoenigFileUpload has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 5, error handling 2, loops 2 (nesting depth added 2). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 161, 124, 145, \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":"apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e9e68ac31a7773f8ee13303a1e7f9fc7f89641970d81832c88447f4cbcbd77"}},{"ruleId":"D2","level":"warning","message":{"text":"growth-kpis.GrowthKPIs (cognitive 19): growth-kpis.GrowthKPIs has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 7, ternaries 6, if/else 4, match/switch 2. Of this number, 13 points are the body\u0027s own statements and 6 belong to 3 function literals inside it that branch. To reduce it, split the body: 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":"apps/admin/src/analytics/views/stats/growth/components/growth-kpis.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"63249b92acd72c2922c462b78ef6fe5ac3ace4498f30f662c1308fac06767abb"}},{"ruleId":"D2","level":"warning","message":{"text":"growth-sources.GrowthSources (cognitive 19): growth-sources.GrowthSources 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":"apps/admin/src/posts/analytics/growth/components/growth-sources.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddd2eb89f1fc474d94d6432c01e364fd23da823ecde88db9ba1d060e31d96f1e"}},{"ruleId":"D2","level":"warning","message":{"text":"gift-link-modal.GiftLinkModal (cognitive 19): gift-link-modal.GiftLinkModal has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10, boolean chains 6, ternaries 2, error handling 1. Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 74, 127, 143, \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":"apps/admin/src/posts/analytics/modals/gift-link-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9427909291cad99f888f87862f6d6b15a3a65aa15a9ce51e24c045217b801f60"}},{"ruleId":"D2","level":"warning","message":{"text":"use-post-snippets.usePostSnippets (cognitive 19): use-post-snippets.usePostSnippets has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 8 (9 pts), if/else 6, boolean chains 3, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 7 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 103, 43, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/use-post-snippets.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbf12cf62237c2c243d0c13bc03e1efbdcb086f06beacd0a108048a2a129060c"}},{"ruleId":"D2","level":"warning","message":{"text":"comments.CommentsPage (cognitive 19): comments.CommentsPage has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (11 pts), boolean chains 5, if/else 3 (nesting depth added 6). Of this number, 16 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/comments.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1808632abcc98421277b9f76229bcc2fe1a9ca36d92043d6af09f678d1ff866f"}},{"ruleId":"D2","level":"warning","message":{"text":"field-picker.FieldPicker (cognitive 19): field-picker.FieldPicker has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 12, ternaries 4 (5 pts), if/else 2 (nesting depth added 1). 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, 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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa930e348b80082c93e3dc4b90260c81f0b10f56ca73f421f911fc3bcdbba87"}},{"ruleId":"D2","level":"warning","message":{"text":"use-member-filter-fields.useMemberFilterFields (cognitive 19): use-member-filter-fields.useMemberFilterFields has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (7 pts), if/else 4, loops 2 (4 pts), match/switch 2 (3 pts), boolean chains 1 (nesting depth added 5). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 316, 380, 508, \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":"apps/admin/src/members/use-member-filter-fields.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc57905c6928780e9c204ee02d32cdc55a46434d2cea23326a4cfa97294c3058"}},{"ruleId":"D2","level":"warning","message":{"text":"stats-filter.StatsFilter (cognitive 19): stats-filter.StatsFilter has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 8 (12 pts), boolean chains 5, if/else 2 (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/analytics/stats-filter.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d4232b0e515d7c5808fb05784f7f5be37f4a527633c98c1b67110c8bfded78"}},{"ruleId":"D2","level":"warning","message":{"text":"admin-api.setupAdminAPI (cognitive 19): admin-api.setupAdminAPI has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 3, error handling 1 (nesting depth added 1). Of this number, 15 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, split the body: 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":"apps/comments-ui/src/utils/admin-api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3be343f553662c39a97f7c6b72e2e55e94af614f1da777d21c80cecdc10efb09"}},{"ruleId":"D2","level":"warning","message":{"text":"EmbeddedRelationAdapter.query (cognitive 19): EmbeddedRelationAdapter.query has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (15 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":"apps/ember-admin/app/adapters/embedded-relation-adapter.js"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca8adead9aaa184f415a0494963a1c82ae454d39bca7ad9991ce093cefabdcd7"}},{"ruleId":"D2","level":"warning","message":{"text":"Debug._fetchAnalyticsStatus (cognitive 19): Debug._fetchAnalyticsStatus has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 3 (6 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/posts/debug.js"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"324f8fd04d1cfedc73264c10812f1fc06f33f6d882f25560b6823100680c8143"}},{"ruleId":"D2","level":"warning","message":{"text":"LexicalEditorController.syncMobiledocSnippets (cognitive 19): LexicalEditorController.syncMobiledocSnippets has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (11 pts), boolean chains 3, error handling 1 (3 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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":996}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a7702a62c5023a117db5dcc06772a7f00c893580b132c0bdfca49c105a7d5b4"}},{"ruleId":"D2","level":"warning","message":{"text":"products-section.FreeProductCard (cognitive 19): products-section.FreeProductCard has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 6 (7 pts), boolean chains 5 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/products-section.jsx"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"b685ddfed04f14613807d29e28eb71d621e77e14b7a14a783c4b10e1c467b6a9"}},{"ruleId":"D2","level":"warning","message":{"text":"account-welcome.AccountWelcome (cognitive 19): account-welcome.AccountWelcome has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/AccountHomePage/components/account-welcome.jsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8d1d12c183f97074d8c29352c63d11562bff1e8c1fa1d8713ae62242c12d38"}},{"ruleId":"D2","level":"warning","message":{"text":"filters.FilterDatePicker (cognitive 19): filters.FilterDatePicker has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 3, ternaries 2 (nesting depth added 2). Most of this is not in the body itself: 2 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 824, 850, 795, \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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":766}}}],"partialFingerprints":{"codehealthFindingId/v1":"871337fd5ee52f0882ba07a2b176900eeb905ecc42af07780dd00ff66e02ab2d"}},{"ruleId":"D2","level":"warning","message":{"text":"MetafieldDefinitionsService.edit (cognitive 19): MetafieldDefinitionsService.edit has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 5, error handling 1 (2 pts), ternaries 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members-metafields/definitions-service.ts"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c694b639c679e58c4b498632b68ea0fd9b2c19f9d96b2165546ecac5fbe05d9"}},{"ruleId":"D2","level":"warning","message":{"text":"sentry.beforeSend (cognitive 19): sentry.beforeSend has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, 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":"ghost/core/core/shared/sentry.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"457e4e15dbca32a439a9b6806e5104691ee9c3b8f29ba9dbec5b7db38bd7e05c"}},{"ruleId":"D2","level":"warning","message":{"text":"LazyUrlService.getRequiredFields (cognitive 19): LazyUrlService.getRequiredFields has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 8). 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":"ghost/core/core/server/services/url/lazy-url-service.ts"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5f2fb2c23f4d8c70213a3c26a5c7f32376100d640af7da8f5c3a588afb71c76"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchSendingService.sendBatches (cognitive 19): BatchSendingService.sendBatches has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 3, loops 1 (nesting depth added 6). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 711). 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":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":685}}}],"partialFingerprints":{"codehealthFindingId/v1":"42beb651cb6cbc91ed9c81b84f3be9c0e1368322a6d005a0dc045bcc1a463d06"}},{"ruleId":"D2","level":"warning","message":{"text":"GiftService.startCheckout (cognitive 19): GiftService.startCheckout has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10, error handling 3 (4 pts), ternaries 4, boolean chains 1 (nesting depth added 1). 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: 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":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"a85e928dc11447229cf81aaf48151d934080dc617250bb313dfc3547fd280dc1"}},{"ruleId":"D2","level":"warning","message":{"text":"StripeCoupon.create (cognitive 19): StripeCoupon.create has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 10, if/else 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":"ghost/core/core/server/services/offers/domain/models/stripe-coupon.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"b25603db49de6c0a1307912d6f962cc0a835bd73ca95f8b49478cf5a62b3e63f"}},{"ruleId":"D2","level":"warning","message":{"text":"StaffService.handleEvent (cognitive 19): StaffService.handleEvent has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (11 pts), error handling 2 (6 pts), boolean chains 2 (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":"ghost/core/core/server/services/staff/staff-service.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"c56273f3b304977765ea4da4f6c38c9352c7e26117353052ce36aa497982fd54"}},{"ruleId":"D2","level":"warning","message":{"text":"middleware.SessionMiddleware (cognitive 19): middleware.SessionMiddleware has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (12 pts), error handling 5, ternaries 1 (2 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/auth/session/middleware.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d8994e4cdff0ea5e626a579b5e7b22ebcca92209ea4f3e80083c3e1232eecc"}},{"ruleId":"D2","level":"warning","message":{"text":"og-image.getOgImage (cognitive 19): og-image.getOgImage has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 5, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/og-image.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e75b2defe4fb8e5418da124e81668b0bb195934101d056c4e3da797bfd4933"}},{"ruleId":"D2","level":"warning","message":{"text":"renderer.renderer (cognitive 19): renderer.renderer has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, ternaries 1 (3 pts) (nesting depth added 5). 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 45). 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":"ghost/core/core/frontend/services/rendering/renderer.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb70157b802ce01e228fd091765fb48668e2c286732c5fd2b9a225321dfa55b"}},{"ruleId":"D2","level":"warning","message":{"text":"twitter-image.getTwitterImage (cognitive 19): twitter-image.getTwitterImage has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 5, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/twitter-image.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b6678179bb18f6bbdee3d5940a60fb892f3a937320dfd783106b1dc4da209df"}},{"ruleId":"D2","level":"warning","message":{"text":"has.has (cognitive 19): has.has has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 17, if/else 2. Most of this is not in the body itself: 5 of the 19 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 145, 148, 151, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/has.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"65d23e42fae1c2849ea8fd61c2342cac39d6bef65352408fea53336094367aa5"}},{"ruleId":"D2","level":"warning","message":{"text":"DataGenerator.importData (cognitive 19): DataGenerator.importData has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 3 (5 pts), ternaries 1 (2 pts) (nesting depth added 7). 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":"ghost/core/core/server/data/seeders/data-generator.js"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d23bbff0a0bce9debedaddfe53f502a504f851e286164a262437bea94bbe54"}},{"ruleId":"D2","level":"warning","message":{"text":"check-internal-packages.validateConfigFiles (cognitive 19): check-internal-packages.validateConfigFiles has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 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":"scripts/check-internal-packages.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da3f3634ecf56e55188f21914291a11ad0750f5509c3c2f7863c6dbd98ade02"}},{"ruleId":"D2","level":"warning","message":{"text":"buildBookmarkData (cognitive 19): buildBookmarkData has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 3 (9 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb7c50472f3a139cc45d4c9f0c60807e8266879156e156f7c1f898756f500346"}},{"ruleId":"D2","level":"warning","message":{"text":"populateProductsAndPrices (cognitive 19): populateProductsAndPrices has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (7 pts), error handling 2 (5 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stripe/stripe-migrations.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"631620654f73560724933eb22e02678d8b314e9f7928c369872c018c32f1bf89"}},{"ruleId":"D2","level":"warning","message":{"text":"handleSetupEvent (cognitive 19): handleSetupEvent has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (11 pts), error handling 2 (5 pts), boolean chains 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stripe/services/webhook/checkout-session-event-service.js"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3326dc2c91c8ac85e2ca20c7f6b4d2a4aef4cd6fb76f0563fd0bfdbcb3253fa"}},{"ruleId":"D2","level":"warning","message":{"text":"edit (cognitive 19): edit has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 2 (nesting depth added 7). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 2 function items inside it that branch ((anonymous)::then, (anonymous)). 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":"ghost/core/core/server/models/settings.js"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff416899aef751bfeaa347fc1e6f0a190dd3c2a9bf43cbb6be483fee09e092d"}},{"ruleId":"D2","level":"warning","message":{"text":"extendModel::permissible (cognitive 19): extendModel::permissible has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 12, 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":"ghost/core/core/server/models/relations/authors.js"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"68e73c5c83b3f95f2f6e4703e27af943e01d57ad0ef4356e25e1c6491568f323"}},{"ruleId":"D2","level":"warning","message":{"text":"single (cognitive 19): single has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 3 (nesting depth added 8). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to 3 function items inside it that branch (singleUploadFunction::(anonymous), singleUploadFunction::(anonymous)::deleteFiles, singleUploadFunction). 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":"ghost/core/core/server/web/api/middleware/upload.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"407694c01440f00e2acca860fb57630c731d9f66aeb5ee3b6d8079b9bbbd19b4"}},{"ruleId":"D2","level":"warning","message":{"text":".pnpmfile.beforePacking (cognitive 18): .pnpmfile.beforePacking has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 3 (5 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".pnpmfile.mjs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3a9761eaf17f12b2999aa22b1988a6559f67d2cf4e4b6f644fa3714eccacb6"}},{"ruleId":"D2","level":"warning","message":{"text":"use-form.useForm (cognitive 18): use-form.useForm has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, boolean chains 4, ternaries 1 (2 pts), error handling 1 (nesting depth added 1). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 97, 74, 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":"apps/admin-x-framework/src/hooks/use-form.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"82fa3580a3bd5713384c7f1eab859ee85b731311427602841aca0528677f99fd"}},{"ruleId":"D2","level":"warning","message":{"text":"url-helpers.generateTitleFromPath (cognitive 18): url-helpers.generateTitleFromPath has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 6, boolean chains 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/utils/url-helpers.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e7eebe8451b4484eab9739592922ada5abc0802251a058897fbb0b4d78fd0a7"}},{"ruleId":"D2","level":"warning","message":{"text":"post-context-menu-items.getPostContextMenuItems (cognitive 18): post-context-menu-items.getPostContextMenuItems has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13 (18 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/post-context-menu-items.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"1884f89de4a760c591bd87d1946fa09317116b69ec38bf669d4c6cd7ea395d9b"}},{"ruleId":"D2","level":"warning","message":{"text":"post-settings-sidebar.PostSettingsSidebar (cognitive 18): post-settings-sidebar.PostSettingsSidebar has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 10, boolean chains 7, if/else 1. Of this number, 14 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, 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":"apps/admin/src/editor/settings/post-settings-sidebar.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b9c440787f12d8395b111f89aabd7d8f51a27a9e46bf144e1e4d078a4c9477"}},{"ruleId":"D2","level":"warning","message":{"text":"members-header-search.MembersHeaderSearch (cognitive 18): members-header-search.MembersHeaderSearch has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 6, if/else 5 (6 pts), ternaries 6 (nesting depth added 1). Of this number, 10 points are the body\u0027s own statements and 8 belong to 4 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":"apps/admin/src/members/components/members-header-search.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"49eec1eaab0e28c2c2ca15115e3c70e492cdd589bc150f88e97d190180fd7f48"}},{"ruleId":"D2","level":"warning","message":{"text":"custom-integration-modal.CustomIntegrationModalContent (cognitive 18): custom-integration-modal.CustomIntegrationModalContent has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 8, if/else 3 (4 pts), ternaries 4, error handling 2 (nesting depth added 1). Of this number, 9 points are the body\u0027s own statements and 9 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":"apps/admin/src/settings/advanced/integrations/custom-integration-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd297b84e873ba836bb30273daf7ee3306683197d3db62f5fed923182ed0909"}},{"ruleId":"D2","level":"warning","message":{"text":"use-pintura-editor.usePinturaEditor (cognitive 18): use-pintura-editor.usePinturaEditor has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13, boolean chains 4, error handling 1. Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 64, 19, 42, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/hooks/use-pintura-editor.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f7e7aead7cfadb721cd2bb59e4cda3e36c3b6dbd4f8a9cade0c2e90465da66"}},{"ruleId":"D2","level":"warning","message":{"text":"content.Content (cognitive 18): content.Content has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, ternaries 5 (8 pts), if/else 1 (nesting depth added 3). 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":"apps/comments-ui/src/components/content/content.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ddbe45e46c6742756520be03691b405217971f9fc3b600dee52b33872cf2a70"}},{"ruleId":"D2","level":"warning","message":{"text":"GhSegmentTokenInput.searchTask (cognitive 18): GhSegmentTokenInput.searchTask has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 7). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-segment-token-input.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ef3d599d979f8a0c5e7a3be0fb4df610c0d81ec353d5b6c539177c526fbb3a"}},{"ruleId":"D2","level":"warning","message":{"text":"errors.chooseBestErrorMessage (cognitive 18): errors.chooseBestErrorMessage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 4, ternaries 1 (nesting depth added 1). Of this number, 10 points are the body\u0027s own statements and 8 belong to 4 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":"apps/portal/src/utils/errors.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d84ebf9f27a29bc50ab229959034cf0357b25509b62e6d89cb16314999b7824"}},{"ruleId":"D2","level":"warning","message":{"text":"recommendations-page.RecommendationsPage (cognitive 18): recommendations-page.RecommendationsPage has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, if/else 6 (7 pts), ternaries 2 (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, 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":"apps/portal/src/components/pages/recommendations-page.jsx"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4758f504fa3f15c895710d6c0704465e765f53b0766682b7c43cc2ea73fa4ab"}},{"ruleId":"D2","level":"warning","message":{"text":"utils.loadAdapterClass (cognitive 18): utils.loadAdapterClass has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 1 (4 pts), error handling 1 (2 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":"ghost/core/core/server/services/adapter-manager/utils.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"a88bf7777ea7e3717c215e611f2d88fd36c82d51274955238de05440a6746a1e"}},{"ruleId":"D2","level":"warning","message":{"text":"PostsService.#bulkAddTags (cognitive 18): PostsService.#bulkAddTags has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 3 (4 pts), boolean chains 2, ternaries 2 (nesting depth added 5). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/posts/posts-service.js"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd8a38e35bd2cda64f55788d5c17471769b9bc074e53b0883c2c258122d7b49"}},{"ruleId":"D2","level":"warning","message":{"text":"MemberWelcomeEmailRenderer.render (cognitive 18): MemberWelcomeEmailRenderer.render has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 13, if/else 2, ternaries 2, error handling 1. Of this number, 14 points are the body\u0027s own statements and 4 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":"ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"14e16e2d3dea4256cd5b6784d0b97384e7fa700ccdf14b1a7cfbdda7404b60ff"}},{"ruleId":"D2","level":"warning","message":{"text":"PostsStatsService._generateTitleFromPath (cognitive 18): PostsStatsService._generateTitleFromPath has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 6, boolean chains 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe1b3392e98352a227fdf83a3690bd4f568d496cf7103a71216601bc051b229"}},{"ruleId":"D2","level":"warning","message":{"text":"url.getUrl (cognitive 18): url.getUrl has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 2 (5 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/url.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"cedb3286c9024f59f1e8e6d297c32313aeb5426378ce8033f3aec781fa52a863"}},{"ruleId":"D2","level":"warning","message":{"text":"compare-image-report.render (cognitive 18): compare-image-report.render has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), loops 2 (5 pts), ternaries 1 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/compare-image-report.js"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b995d821cddf3509f425f32d1cf906f6ddaf0dd818c1d3257a2bade4709fab90"}},{"ruleId":"D2","level":"warning","message":{"text":"getMemberOffers (cognitive 18): getMemberOffers has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, boolean chains 5, error handling 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":1212}}}],"partialFingerprints":{"codehealthFindingId/v1":"a940c437a3737c3eeec4996c67c93bf4095d2084028ff045a2294258067b8b44"}},{"ruleId":"D2","level":"warning","message":{"text":"getCustomerIdByEmail (cognitive 18): getCustomerIdByEmail has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 2 (5 pts), boolean chains 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stripe/stripe-api.js"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"068b47de333076bfd151346267c0a52d47598e81b116e7c50cd398ddbc97f7c6"}},{"ruleId":"D2","level":"warning","message":{"text":"createTable (cognitive 18): createTable has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 5 (nesting depth added 4). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 639, 656, 633, \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":"ghost/core/core/server/data/schema/commands.js"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad99a2bce6c72a270c9238a9b3b8f83022f870d633ac611dccf7fefbc0fcd73"}},{"ruleId":"D2","level":"warning","message":{"text":"moderateComment (cognitive 18): moderateComment has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, 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":"ghost/core/core/server/services/comments/comments-service.js"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b0de3c68edfd476656fb21fa40eb2d3dfd37d13b5e787b9cbd5d785138a9e55"}},{"ruleId":"D2","level":"warning","message":{"text":"#fetchEventsFromDomain (cognitive 18): #fetchEventsFromDomain has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 8, if/else 2 (4 pts), ternaries 4, error handling 1, loops 1 (nesting depth added 2). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/lib/mailgun-client.js"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee9ebd578ac0c5e64d600bb71859770f48ad469abc7216365b9bd86b53553cf"}},{"ruleId":"D2","level":"warning","message":{"text":"content-text.renderedTextOf (cognitive 17): content-text.renderedTextOf has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 6, ternaries 2 (nesting depth added 2). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/content-text.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"55e8965698cc460ed9a80a8572129790760cc8c611f36243922c23dbfd1ce1b3"}},{"ruleId":"D2","level":"warning","message":{"text":"members-list.MembersList (cognitive 17): members-list.MembersList has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11, boolean chains 4, ternaries 2. Most of this is not in the body itself: 3 of the 17 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 115, 131, 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":"apps/admin/src/members/components/members-list.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c426d2ebba20f73f0ebec60983ae567596bf3c6f395eae3796928e0c9c700ea1"}},{"ruleId":"D2","level":"warning","message":{"text":"activity-row.ActivityRow (cognitive 17): activity-row.ActivityRow has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 10, ternaries 6 (7 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":"apps/admin/src/members/activity/activity-row.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f267d42263a0028ccf0fc765f991cf252c64139825fd73d70c59154e5e4b354"}},{"ruleId":"D2","level":"warning","message":{"text":"navigation-item-editor.NavigationItemEditor (cognitive 17): navigation-item-editor.NavigationItemEditor has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 15, if/else 2. Of this number, 10 points are the body\u0027s own statements and 7 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/navigation/navigation-item-editor.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"51faa74f87782877ebb97a7987845e30d50de04150c90e10932dd65b09ca1a42"}},{"ruleId":"D2","level":"warning","message":{"text":"profile-tab.BasicInputs (cognitive 17): profile-tab.BasicInputs has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 13, ternaries 4. 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":"apps/admin/src/settings/general/users/profile-tab.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c39c8eea219910bb5c6f780c454448ad98c478465ef8a52f9ab4ead8b94da46"}},{"ruleId":"D2","level":"warning","message":{"text":"portal-links.PortalLinks (cognitive 17): portal-links.PortalLinks has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 13, boolean chains 3, if/else 1. 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: 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":"apps/admin/src/settings/membership/portal/portal-links.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"908ce1d5ff13bc1e900334aff9039bd32e6bc256c2c68638d2c9ce10357cd2de"}},{"ruleId":"D2","level":"warning","message":{"text":"stripe-connect-modal.StripeConnectModal (cognitive 17): stripe-connect-modal.StripeConnectModal has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 6, error handling 1 (2 pts), ternaries 1 (nesting depth added 3). Of this number, 9 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"01dd83f9bb09d7d3ba44b65e6f55054d9e38bde1526fd59abfa3f8b45e8b9536"}},{"ruleId":"D2","level":"warning","message":{"text":"add-newsletter-modal.AddNewsletterModal (cognitive 17): add-newsletter-modal.AddNewsletterModal has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6, ternaries 4 (6 pts), boolean chains 5 (nesting depth added 2). Of this number, 11 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"apps/admin/src/settings/email/newsletters/add-newsletter-modal.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"849db42982c09991c38cbf1339477501a144ab0bb9cf5c9af945171868fdb015"}},{"ruleId":"D2","level":"warning","message":{"text":"offers-container-modal.OffersRouteHandler (cognitive 17): offers-container-modal.OffersRouteHandler has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 3 (6 pts), boolean chains 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/offers-container-modal.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeb6786f9ea6b8218a38b946372cecad1043cc48eecd40f9ad5c01bdd0b879bf"}},{"ruleId":"D2","level":"warning","message":{"text":"tag-image-field.TagImageField (cognitive 17): tag-image-field.TagImageField has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (8 pts), boolean chains 5, ternaries 2 (3 pts), error handling 1 (nesting depth added 3). Most of this is not in the body itself: 8 of the 17 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 92, 86, 153, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-image-field.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2df2afe66b5435d2a99a35af02e946eeb677743571f07c536849fd9620632b"}},{"ruleId":"D2","level":"warning","message":{"text":"use-theme.useTheme (cognitive 17): use-theme.useTheme has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, boolean chains 4, ternaries 4, 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 6 function literals inside it that branch (lines 65, 108, 82, \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":"apps/admin/src/hooks/use-theme.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"924c0e06bb1f8ee1c190f1ee7909ff24f3833a7e4331c5fae4ff124bb353b848"}},{"ruleId":"D2","level":"warning","message":{"text":"edit-row.EditRow (cognitive 17): edit-row.EditRow has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (8 pts), if/else 4 (5 pts), boolean chains 2, error handling 2 (nesting depth added 3). Of this number, 10 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, split the body: 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":"apps/admin/src/members/label-picker/edit-row.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5210444e7e563c98ec21faba308af8bf48c81be782ad7a871f0881e00dba3b0"}},{"ruleId":"D2","level":"warning","message":{"text":"search.useSearchService (cognitive 17): search.useSearchService has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 5 (nesting depth added 2). Most of this is not in the body itself: 0 of the 17 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 80, 37, 59, \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":"apps/admin/src/settings/utils/search.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e80c20da8c2542a127d3f263001d31c762fccf19181407613b4d3cef2f43fa"}},{"ruleId":"D2","level":"warning","message":{"text":"comment.PublishedComment (cognitive 17): comment.PublishedComment has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 3 (4 pts), ternaries 4 (nesting depth added 1). Of this number, 11 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, 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":"apps/comments-ui/src/components/content/comment.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bf9907cc88350e2f7aa1351e09bbfab96185c3457be876237f514dffc30767a"}},{"ruleId":"D2","level":"warning","message":{"text":"main-form.MainForm (cognitive 17): main-form.MainForm has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 6, loops 1, ternaries 1 (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 4 function literals inside it that branch (lines 49, 15, 42, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/content/forms/main-form.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"79664f6f4d34e22860a680e574385b1a256fb8975b08e211375a5c4120b35ded"}},{"ruleId":"D2","level":"warning","message":{"text":"GhSiteIframeComponent.resetSrcAttribute (cognitive 17): GhSiteIframeComponent.resetSrcAttribute has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (14 pts), error handling 1 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-site-iframe.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"a33b9e92d554e92e54bd29a56c6764e031176ae34c8ee3ba6b333edffc751279"}},{"ruleId":"D2","level":"warning","message":{"text":"gh-format-post-time.formatPostTime (cognitive 17): gh-format-post-time.formatPostTime has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 3 (5 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":"apps/ember-admin/app/helpers/gh-format-post-time.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"50331259448a2f309ee7302f689eb7e61a9e756886222f21587c0077ff4ebe61"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.signup (cognitive 17): actions.signup has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 5, 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":"apps/portal/src/actions.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdf357ccf54dd018005a39b94d38c1fa8d78502d4e86ea98fbbc38c6cdd8a4c6"}},{"ruleId":"D2","level":"warning","message":{"text":"commands.addForeign (cognitive 17): commands.addForeign has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 1, error handling 1 (nesting depth added 4). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/schema/commands.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce7c8048086b6a2c961cf6cd492d5dd745bf45501fd6cdcc56d0ac080e09792"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.default (cognitive 17): actions.default has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 7 (8 pts) (nesting depth added 1). Of this number, 9 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/actions.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1dca128815687d54aa1cf5842192d5ebc9eda472cf0e7436a8864a585827ed9"}},{"ruleId":"D2","level":"warning","message":{"text":"CacheManager._doGet (cognitive 17): CacheManager._doGet has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 8, if/else 8, error handling 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":"ghost/core/core/shared/settings-cache/cache-manager.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3a5f9c71c26d2960b13fc1315172bb141405a1d83a8b53ab0f7fef8480f4e4"}},{"ruleId":"D2","level":"warning","message":{"text":"members.serializeMember (cognitive 17): members.serializeMember has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 4, 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":"ghost/core/core/server/api/endpoints/utils/serializers/output/members.js"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b957eac51fc4ab70188048cc0f4f5c939c7b9dd87faeb7b8e28abaf0e74153d"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsBREADService.prepSettingsForEmailVerification (cognitive 17): SettingsBREADService.prepSettingsForEmailVerification 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":"ghost/core/core/server/services/settings/settings-bread-service.js"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dc8ce9fdd5b0d8928283641589de6ec1c78c0e83e78b73c54f88cd1207272c3"}},{"ruleId":"D2","level":"warning","message":{"text":"Base.handleError (cognitive 17): Base.handleError has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 1 (nesting depth added 5). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to one function literal inside it that branches (line 120). 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":"ghost/core/core/server/data/importer/importers/data/base.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"d831fa97a9d9adf817979044d0e43e1c1425b1278c73a816aaf0c5afc61d6fbf"}},{"ruleId":"D2","level":"warning","message":{"text":"GiftEmailAnalyticsBatchProcessor.processBatch (cognitive 17): GiftEmailAnalyticsBatchProcessor.processBatch has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 2, 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":"ghost/core/core/server/services/email-analytics/gift-email-analytics-batch-processor.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ce0022b268e8cdd6ed5b53cc3b58d7cb6ce00a015bf8f1085f9a0bbbce5cf7f"}},{"ruleId":"D2","level":"warning","message":{"text":"PostsStatsService._buildFreeMembersSubquery (cognitive 17): PostsStatsService._buildFreeMembersSubquery has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (13 pts), ternaries 4 (nesting depth added 2). 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, 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":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc740549c191d13c6ab5e10ee7ce900ea2a9b7b201e51157b721716371289b47"}},{"ruleId":"D2","level":"warning","message":{"text":"serve-public-file.createPublicFileMiddleware (cognitive 17): serve-public-file.createPublicFileMiddleware has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 5, ternaries 2 (nesting depth added 3). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 73, 46, 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":"ghost/core/core/frontend/web/routers/serve-public-file.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"0082c2d828256c902fe480bd32de3527f253cb5a8427869a91a3ea0e229ac39a"}},{"ruleId":"D2","level":"warning","message":{"text":"middleware.tokenPermissionCheck (cognitive 17): middleware.tokenPermissionCheck has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 6 (8 pts) (nesting depth added 2). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/web/api/endpoints/admin/middleware.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f64b35eb26643bfeba242c354c65d587d7f96602f43943f9969298ebbec1a4c"}},{"ruleId":"D2","level":"warning","message":{"text":"check-agent-skill-links.checkAgentSkillLinks (cognitive 17): check-agent-skill-links.checkAgentSkillLinks has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), error handling 3 (6 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-agent-skill-links.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1022d549d3c5321833c07744035a462ea12fb28c8b3191fbb95480b2b5ef9b2a"}},{"ruleId":"D2","level":"warning","message":{"text":"updateSubscription (cognitive 17): updateSubscription has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":2118}}}],"partialFingerprints":{"codehealthFindingId/v1":"de1a17a68d511806bafdd12b8e80e8aaaffbcc9c44fb2647f09b018d63d81e3b"}},{"ruleId":"D2","level":"warning","message":{"text":"_getImageSizeFromUrl (cognitive 17): _getImageSizeFromUrl has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 6, error handling 1 (nesting depth added 3). Most of this is not in the body itself: 3 of the 17 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 207, 198). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/lib/image/image-size.js"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"3583c1a312ce64c2fada479ddec488423685a194212488cf2a2fefcab482b7b9"}},{"ruleId":"D2","level":"warning","message":{"text":"_syncRepositoryWithTheme (cognitive 17): _syncRepositoryWithTheme has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (7 pts), boolean chains 5, ternaries 1 (3 pts), loops 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"f45c6e79cfb5cdddd3be01a04caf974557eca2cbec7d59798c5c80b0469f88f1"}},{"ruleId":"D2","level":"warning","message":{"text":"#runMemberQueries (cognitive 17): #runMemberQueries has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 5, loops 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/milestones/milestones-service.js"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab209b083d162761d206660396ed823e56c113c02833c66862edeae94592be82"}},{"ruleId":"D2","level":"warning","message":{"text":"use-activity-pub-queries.useUnfollowMutationForUser (cognitive 16): use-activity-pub-queries.useUnfollowMutationForUser has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (13 pts), ternaries 3 (nesting depth added 1). Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 1007, 1026, 1092, \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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":987}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d81eb8475f0fbcfe6ed86ca48be4d4eaf62f796222479c8424aaa8d123b7be4"}},{"ruleId":"D2","level":"warning","message":{"text":"components.Toolbar (cognitive 16): components.Toolbar has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8, boolean chains 5, ternaries 3. Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 170, 190, 210, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-toolbar/src/components.js"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"475ae43bfb9655da75eeb61d6c88a80018882ca4037ad95e2f9a86fe5ddbabe8"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.getActionTitle (cognitive 16): actions.getActionTitle has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/api/actions.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4535c9f39c22fe40012ab46e19c19973ed65cab2bd866ee8b8ff4e92931a772"}},{"ruleId":"D2","level":"warning","message":{"text":"newsletters.NewsletterTableRows (cognitive 16): newsletters.NewsletterTableRows has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 6 (10 pts), boolean chains 5, if/else 1 (nesting depth added 4). Of this number, 10 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":"apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ee37ef71ec253c611a092360760b9314b2251dae22a2649f7d09876fe939d7c"}},{"ruleId":"D2","level":"warning","message":{"text":"admin-layout.AdminLayout (cognitive 16): admin-layout.AdminLayout has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 3 (4 pts), ternaries 4, loops 1 (nesting depth added 1). Of this number, 12 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, 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":"apps/admin/src/layout/admin-layout.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f8b2b7a305025ea413a2598ed20b3f960b1bff8fb3fa7fd9ce6842e5b86702"}},{"ruleId":"D2","level":"warning","message":{"text":"manage-post-view-popover.PopoverBody (cognitive 16): manage-post-view-popover.PopoverBody has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 5 (7 pts), if/else 4, boolean chains 3, error handling 2 (nesting depth added 2). 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 76, 100, 133). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/components/manage-post-view-popover.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"d64da80f9d53c3b1562dcd686cfca5dff5ee42a5bf6fe7bac761fb0d8d4e9856"}},{"ruleId":"D2","level":"warning","message":{"text":"confirm-step.ConfirmStep (cognitive 16): confirm-step.ConfirmStep has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 10 (15 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/confirm-step.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"20dbb216e335becf8ac0643afa29f7c49201939e65778e5d3f66b6a2a847f7d9"}},{"ruleId":"D2","level":"warning","message":{"text":"members-filters.MembersFilters (cognitive 16): members-filters.MembersFilters has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 9, ternaries 5 (7 pts) (nesting depth added 2). Of this number, 15 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/members-filters.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e070b561661095aa3b8ac369d56c14adb529ec640d17c02a68ccd82a9f2a7d"}},{"ruleId":"D2","level":"warning","message":{"text":"member-add-comp-modal.MemberAddCompModal (cognitive 16): member-add-comp-modal.MemberAddCompModal has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 5, ternaries 5, if/else 4, error handling 1, loops 1. Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 84, 59, 75, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-add-comp-modal.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f2023983984550e464101fed7b2a9b1f6f3bc75dbec926f05b8e7d2782af396"}},{"ruleId":"D2","level":"warning","message":{"text":"theme-file-tree.ThemeFileTree (cognitive 16): theme-file-tree.ThemeFileTree has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, ternaries 4 (7 pts), if/else 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 3 function literals inside it that branch (lines 113, 151, 178). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme/theme-file-tree.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"45865aea5d62917f4056065a2e6755bc21ea742639f9b6a9cf0619d6b75a957a"}},{"ruleId":"D2","level":"warning","message":{"text":"user-detail-modal.UserDetailModal (cognitive 16): user-detail-modal.UserDetailModal has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 5, ternaries 3. Of this number, 10 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":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"7296c75ac501859e0b8b6cb2f965b1b908356d9945db9f087be4d92a7d031a04"}},{"ruleId":"D2","level":"warning","message":{"text":"offers-index.OffersIndexModal (cognitive 16): offers-index.OffersIndexModal has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 7, ternaries 1. Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 363, 425, 472, \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":"apps/admin/src/settings/growth/offers/offers-index.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"900f116c5a5d72f8b73af4c9bb0e5ef1c8413ae9061cc6c1a88059f0fcdac38f"}},{"ruleId":"D2","level":"warning","message":{"text":"label-filter-renderer.LabelFilterRenderer (cognitive 16): label-filter-renderer.LabelFilterRenderer has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8, ternaries 4, boolean chains 3, error handling 1. Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 53, 33, 114, \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":"apps/admin/src/members/label-picker/label-filter-renderer.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ef43c7d8613ad939c3cc7c96a48a55db368d6b2ff9ba3db38d97d22fd5d00d"}},{"ruleId":"D2","level":"warning","message":{"text":"emails.EmailsGroup (cognitive 16): emails.EmailsGroup has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 5 (6 pts), ternaries 2, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 119, 108, 102). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/emails.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"14859e1683468142e27d23937416d2def39f8f6c23504460eab83fd488908538"}},{"ruleId":"D2","level":"warning","message":{"text":"use-navigation-editor.useNavigationEditor (cognitive 16): use-navigation-editor.useNavigationEditor has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 4 (nesting depth added 1). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 80, 164, 123, \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":"apps/admin/src/settings/hooks/site/use-navigation-editor.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3c6222aeda0f0651073239646678dc55b66c3a7230b4a572b9db872866ff09"}},{"ruleId":"D2","level":"warning","message":{"text":"helpers.getScrollToPosition (cognitive 16): helpers.getScrollToPosition has cognitive complexity 16 (threshold 15). Drivers by points: if/else 2 (8 pts), loops 3 (7 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":"apps/comments-ui/src/utils/helpers.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"9262262fa58681193de01a82ce8fba56052edd3a5522ae87e306eb6fc0784d39"}},{"ruleId":"D2","level":"warning","message":{"text":"PublishModalComponent.setCompleted (cognitive 16): PublishModalComponent.setCompleted has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), error handling 2 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/editor/modals/publish-flow.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd50576b8b55e20ff9499ec2ee3fe60cf7d2d294012314c0588890868844afc3"}},{"ruleId":"D2","level":"warning","message":{"text":"GhKoenigEditorLexical.onExcerptKeydown (cognitive 16): GhKoenigEditorLexical.onExcerptKeydown has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 9, if/else 5 (7 pts) (nesting depth added 2). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-koenig-editor-lexical.js"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e04ae4b28750a7a0f467da6a9b69935a01328b3ba90ad78da31d2589cc8eef"}},{"ruleId":"D2","level":"warning","message":{"text":"NotificationsService._showAPIError (cognitive 16): NotificationsService._showAPIError has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 6, ternaries 1 (2 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":"apps/ember-admin/app/services/notifications.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"b658d35f0a9228331cfef8d430b6134d1bf52a95f061cab3b13442bb029fffab"}},{"ruleId":"D2","level":"warning","message":{"text":"account-plan-page.getRetentionOfferMessage (cognitive 16): account-plan-page.getRetentionOfferMessage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/account-plan-page.jsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a04121087e61166b00fc31821d274821bf24f548a5a4717a9224015b06ceb91"}},{"ruleId":"D2","level":"warning","message":{"text":"recommendations-page.RecommendationItem (cognitive 16): recommendations-page.RecommendationItem has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 6, error handling 2 (nesting depth added 1). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 211, 243, 268, \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":"apps/portal/src/components/pages/recommendations-page.jsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"c415c6c6dd7f3e7523597fc40974f5a991a54d7a5874d38ccefd5b123bc8a6dc"}},{"ruleId":"D2","level":"warning","message":{"text":"account-email-page.AccountEmailPage (cognitive 16): account-email-page.AccountEmailPage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, boolean chains 5, ternaries 3 (4 pts) (nesting depth added 1). Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 43, 30, 120, \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":"apps/portal/src/components/pages/account-email-page.jsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d73ccad9b82692b153498c50043d71c8ae82d807279afe7582296b18b1e480be"}},{"ruleId":"D2","level":"warning","message":{"text":"plan-step.GiftPlanStep (cognitive 16): plan-step.GiftPlanStep has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 10, ternaries 6. Of this number, 8 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift/plan-step.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb6c271127a0e0d98e1dd6b369520ee9107d70b0c6da031acbeb626f02f79064"}},{"ruleId":"D2","level":"warning","message":{"text":"MetafieldValuesService.planWrite (cognitive 16): MetafieldValuesService.planWrite has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 2 (4 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members-metafields/values-service.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"32677304e86ef7b239ef02449f4c3dd05356034f0df7944a8bb65657a3c8d1a9"}},{"ruleId":"D2","level":"warning","message":{"text":"duplicate-deps.checkDuplicateDependencies (cognitive 16): duplicate-deps.checkDuplicateDependencies has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 3 (4 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":"ghost/core/bin/lib/duplicate-deps.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"a19f4002c7b1640c3b49a96ceab2c36836464e4b1b5c59eded5d1a876d59c44a"}},{"ruleId":"D2","level":"warning","message":{"text":"BlogIcon.getIconUrl (cognitive 16): BlogIcon.getIconUrl has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 4 (10 pts), if/else 4 (6 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/lib/image/blog-icon.js"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba48c9216c64b9df76e74628a7358fbebd14bbebaeb9eaf064078be9289307c3"}},{"ruleId":"D2","level":"warning","message":{"text":"ReferrerTranslator.getReferrerDetails (cognitive 16): ReferrerTranslator.getReferrerDetails has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 7, if/else 4 (7 pts), loops 2 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/member-attribution/referrer-translator.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"32bb600cb7f64401c8bdc272ed6f03e403c01c89d72c888e7d7682ee2811fa30"}},{"ruleId":"D2","level":"warning","message":{"text":"StaffServiceEmails.notifyPaidSubscriptionStarted (cognitive 16): StaffServiceEmails.notifyPaidSubscriptionStarted has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (7 pts), boolean chains 5, ternaries 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":"ghost/core/core/server/services/staff/staff-service-emails.js"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b778ee3d04d947df806cb80ebc831b9738401fb14e92071e1911395eab41b1f"}},{"ruleId":"D2","level":"warning","message":{"text":"PostsImporter.replaceIdentifiers (cognitive 16): PostsImporter.replaceIdentifiers has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 2 (nesting depth added 1). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 147, 141, 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":"ghost/core/core/server/data/importer/importers/data/posts-importer.js"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"2faa71834c9ef6a2a644e0108e13c073cbbd1ba1eab4a9b21bfef744751ab64c"}},{"ruleId":"D2","level":"warning","message":{"text":"row.importableRowSchema (cognitive 16): row.importableRowSchema has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 4, loops 3 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/import/row.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1627d7d54933c50b530edb42ebcecf99451ff999f5a48cf6a61a80ff69f9014"}},{"ruleId":"D2","level":"warning","message":{"text":"EmailAnalyticsServiceWrapper._logJobCompletion (cognitive 16): EmailAnalyticsServiceWrapper._logJobCompletion has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8 (10 pts), if/else 3 (4 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":"ghost/core/core/server/services/email-analytics/email-analytics-service-wrapper.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3fed1772d78eef094753114e3d1894f47e6542aa20ca8f59c82dc48559bb88"}},{"ruleId":"D2","level":"warning","message":{"text":"NewsletterEmailAnalyticsBatchProcessor.processBatch (cognitive 16): NewsletterEmailAnalyticsBatchProcessor.processBatch has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-analytics/newsletter-email-analytics-batch-processor.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5498a3bb6d82f793c4f5598abf2f55a2ff118713301cf3b370dd0c11b1fbe46"}},{"ruleId":"D2","level":"warning","message":{"text":"ContentStatsService.enrichTopContentData (cognitive 16): ContentStatsService.enrichTopContentData has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), boolean chains 5, error handling 1 (2 pts) (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 249, 303). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stats/content-stats-service.js"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"49d6534c4522e16888c1d16a27fb0b6569f4b727fea02aa0a815cb6cbbb0e43c"}},{"ruleId":"D2","level":"warning","message":{"text":"entry.entryController (cognitive 16): entry.entryController has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 2, error handling 2, ternaries 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/routing/controllers/entry.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8e74807b81fec218ce12e69f2922bf4acefc9064a80e4449ef2a86fa7098e17"}},{"ruleId":"D2","level":"warning","message":{"text":"asset-url.getAssetUrl (cognitive 16): asset-url.getAssetUrl has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 3, ternaries 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/asset-url.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e37f96fc6d055cc4d93a5ce11fe3101706544f66ee8f29d008e48371c1d45a"}},{"ruleId":"D2","level":"warning","message":{"text":"post_class.post_class (cognitive 16): post_class.post_class has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 4, ternaries 4. 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":"ghost/core/core/frontend/helpers/post_class.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"da8ef71a7e6eac573499ef349912408b162793defd240f463fdfe2c92f1254bb"}},{"ruleId":"D2","level":"warning","message":{"text":"MachinePaymentsService.#handleFulfill (cognitive 16): MachinePaymentsService.#handleFulfill has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (8 pts), error handling 3 (5 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/machine-payments/service.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a5713dc219f0a32e9c93dc345accae2a199e151381b1f1fac9a7aa07162e31"}},{"ruleId":"D2","level":"warning","message":{"text":"UpdateCheckService.createCustomNotification (cognitive 16): UpdateCheckService.createCustomNotification has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (7 pts), boolean chains 3, error handling 1 (3 pts), ternaries 1 (2 pts), loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/update-check/update-check-service.js"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed979aef4acca8a2bb4ff59a747667c612101cd55b482cac3d07e425b2f3513"}},{"ruleId":"D2","level":"warning","message":{"text":"boot.bootGhost (cognitive 16): boot.bootGhost has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (14 pts), error handling 2 (nesting depth added 3). Of this number, 14 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body: 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":"ghost/core/core/boot.js"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"5643204806710e0eb37755c3d53ba6fa4d4ac7603d344b6ee3f58a168234d678"}},{"ruleId":"D2","level":"warning","message":{"text":"release.detectBumpType (cognitive 16): release.detectBumpType has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (13 pts), error handling 2, boolean chains 1 (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":"scripts/release.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"072ed5ba23d448554d77b5689201ada9f860fd43a4805e63bd1f85fdf6c0efc5"}},{"ruleId":"D2","level":"warning","message":{"text":"sendMagicLink (cognitive 16): sendMagicLink has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 1, error handling 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":913}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddbf9085122598b19c59a30b024fa29f7d249069cbfac1a63bfde16f49087f98"}},{"ruleId":"D2","level":"warning","message":{"text":"setupGhostApi::checkoutGift (cognitive 16): setupGhostApi::checkoutGift has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 9, if/else 4 (5 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":"apps/portal/src/utils/api.js"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"556553347e67c72d368589166b2c8096f0c51bb420cafdeb55abbb1857145723"}},{"ruleId":"D2","level":"warning","message":{"text":"reportBillingAppLoadFailure (cognitive 16): reportBillingAppLoadFailure has cognitive complexity 16 (threshold 15). Drivers by points: other 5, if/else 4, error handling 2 (3 pts), boolean chains 2, ternaries 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/billing.js"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cdd1995cbd908265e0a9b226fe6e2cadf5e2406b4ff231c900244307010ec2c"}},{"ruleId":"D2","level":"warning","message":{"text":"handleDonationEvent (cognitive 16): handleDonationEvent has cognitive complexity 16 (threshold 15). Drivers by points: other 14, ternaries 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":"ghost/core/core/server/services/stripe/services/webhook/checkout-session-event-service.js"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"2819679f7edb09b3f6af7d9ba87e274404d19c10823ce905f0ca200d8f3a222f"}},{"ruleId":"D2","level":"warning","message":{"text":"send (cognitive 16): send has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, boolean chains 3, ternaries 2, error handling 1. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/lib/mailgun-client.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"66244d5f00177fa98ea90e7d40f82bd0572ed3a16a056821cd0d57dbc528fdb9"}},{"ruleId":"D2","level":"warning","message":{"text":"MembersAPI::getMemberDataFromMagicLinkToken (cognitive 16): MembersAPI::getMemberDataFromMagicLinkToken has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 3, error handling 1 (2 pts), ternaries 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/members-api.js"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"c217ee69d202e4cba1a025fd9ddb4e97f6d0541b7ac6a0ed3afa03d52499a151"}},{"ruleId":"D2","level":"warning","message":{"text":"sortTableList (cognitive 16): sortTableList has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (8 pts), boolean chains 5, loops 2 (3 pts) (nesting depth added 6). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 58, 77). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/data-generator.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"c26294c967ced9900e0a54c580e93edf73d266d733f443ee0ac14899aed5a171"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: dots-pattern.DotsPatternn: FunctionTooLong \u2014 DotsPatternn runs 3364 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3264 over it, 33.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/dots-pattern.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5dd9499bf5996507393ac58e183be2c476dbe9f4d28eaf92d20ec89abde234"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: api.setupGhostApi: FunctionTooLong \u2014 setupGhostApi runs 750 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 650 over it, 7.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":"apps/portal/src/utils/api.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f706d9b804fa3c5ac5d7d75d67e80bc4d0bcd61a4ada7b7fa214075128918865"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/dots-pattern.tsx: FileTooLong \u2014 3368 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: DotsPatternn (6-3371). The bar is 500 significant lines; this is 2868 over it, 6.74\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":"apps/activitypub/src/views/preferences/components/dots-pattern.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"447a49557d34532cf1ca266847acd0d05525bfb1aaaf8f4edc3a60a06decc80e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: reader.Reader: FunctionTooLong \u2014 Reader runs 567 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 467 over it, 5.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e0159fb0dca3068526772f586036d4b3ee22ded94b465deb0e2151b79b34b9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: theme-code-editor-modal.ThemeCodeEditorModal: FunctionTooLong \u2014 ThemeCodeEditorModal runs 556 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 456 over it, 5.56\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"3623bf178b354b62a62e77c6e128f9b71bb1879d82579962e4425a5b082b2747"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: patterns/filters.tsx: FileTooLong \u2014 2616 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2116 over it, 5.23\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"522287a0155f00a8e8a548f763e44a19a705740c73ea1d6b1ce0da4ad99f3e1f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: domain.Domain: FunctionTooLong \u2014 Domain runs 461 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 361 over it, 4.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/domain.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9df020479d3fc1844191fbe765b3f8d13c6e7d7e24f99d2a9a7b2383f576c32"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: schema/schema.js: FileTooLong \u2014 2114 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 1500 significant lines; this is 614 over it, 1.41\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":"ghost/core/core/server/data/schema/schema.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d64359c70b4dbbedb3495a609ab486060bc04858b81b80d79fad7c29ceea651"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: editor-session.createEditorSession: FunctionTooLong \u2014 createEditorSession runs 420 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 320 over it, 4.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":"apps/admin/src/editor/session/editor-session.ts"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"9762e4fc63088f1ce5c2c729e12e3baa54cb834dcbe5a93fbf181d91be3db86f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: newsletter.Newsletter: FunctionTooLong \u2014 Newsletter runs 420 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 320 over it, 4.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":"apps/admin/src/posts/analytics/newsletter/newsletter.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"a057e5b074d95c5bc0a6d4bc35a18ee066ae268e193c7f46d9204693394a848e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sidebar.Sidebar: FunctionTooLong \u2014 Sidebar runs 408 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 308 over it, 4.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/layout/sidebar.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e54b33118e35a250d42584fef20010fe1807c7ee3b6a07cc37c8865f01dd68"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gift-page.GiftPage: FunctionTooLong \u2014 GiftPage runs 387 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 287 over it, 3.87\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-page.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b90d90465fe78d71b0b2808c3e76508e252b3a44f5a48c6580e80a5d9157b49"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hooks/use-activity-pub-queries.ts: FileTooLong \u2014 1872 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1372 over it, 3.74\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":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdcb8702bfe1d5c95268f2ca60b8282188dad5b9c480790bd7da8041c3df8777"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: editor.AutomationEditorContent: FunctionTooLong \u2014 AutomationEditorContent runs 371 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 271 over it, 3.71\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/editor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b1eebdc6c7a3836c21a25c36b0b6fbc8a8a7db5ada0b0c3ec9d5a315a05f10f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: products-section.ProductsSectionStyles: FunctionTooLong \u2014 ProductsSectionStyles runs 371 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 271 over it, 3.71\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/products-section.jsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c2ccf71e56198b8effae8eca106445d9bbde230de7c4930c0744b8ae409af3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tag-detail.TagDetail: FunctionTooLong \u2014 TagDetail runs 356 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 256 over it, 3.56\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b49504460016f205f6cc12347471dd697f0392e44f33c6de5b60ae410cf2ddd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: stats-filter.StatsFilter: FunctionTooLong \u2014 StatsFilter runs 328 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 228 over it, 3.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":"apps/admin/src/shared/analytics/stats-filter.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"851f752f0c392b64207a0f0463aec99853e30d7d4780de83b4b1df5071400c3b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: access.Access: FunctionTooLong \u2014 Access runs 326 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 226 over it, 3.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":"apps/admin/src/settings/membership/access.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"6109e04a8f6ac722d553317bbf1f16029a654bf2ca2f53c03b338b279bc41e73"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: post-preview-modal.PostPreviewModal: FunctionTooLong \u2014 PostPreviewModal runs 318 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 218 over it, 3.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/preview/post-preview-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"2698682ea06328d8085101facea74a59d3a665bfb495e4ff4827426d44e8b47d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-publish-flow.usePublishFlow: FunctionTooLong \u2014 usePublishFlow runs 315 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 215 over it, 3.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/use-publish-flow.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a8110521ebf471e48d752909733ddfee9140539e06f387eaf96c9ffdc497c9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: profile.Profile: FunctionTooLong \u2014 Profile runs 313 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 213 over it, 3.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9016ce0d5db2bf720980566fd2af4efdee2742e1afd96d1046d9d8b7326e299"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: note.Note: FunctionTooLong \u2014 Note runs 310 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 210 over it, 3.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/note.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b584d822f01465385635e5fdf3543e1668ee8204dbf3be576ad88ac51d151cd4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: repositories/member-repository.js: FileTooLong \u2014 1538 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 97% of them inside a single declaration: MEMBER_STATUSES (58-2732). The bar is 1500 significant lines; this is 38 over it, 1.03\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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d5cae4e6ce7704957485e39bc96b7155c9a30b8931f05a363d2993617c695ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: api.setupGhostApi: FunctionTooLong \u2014 setupGhostApi runs 307 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 207 over it, 3.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":"apps/comments-ui/src/utils/api.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"54054a2bfd53c6c61f2c2672a9135fefe5d32fd94f0846b0509596a25316a4ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: seo-meta.SEOMeta: FunctionTooLong \u2014 SEOMeta runs 300 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 200 over it, 3.00\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/seo-meta.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbcd5b7d66666a54d76ca4d1d1ef57bd34d8fab4226d181e285d4f54e7090826"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: posts-list-screen.PostsListScreen: FunctionTooLong \u2014 PostsListScreen 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":"apps/admin/src/posts/list/posts-list-screen.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"67533c9bd96ad8351e10c138a9c5a8274277086f76ceadf3a35413ae5dfe8892"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: post-analytics-header.PostAnalyticsHeader: FunctionTooLong \u2014 PostAnalyticsHeader runs 288 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 188 over it, 2.88\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/components/post-analytics-header.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7bb33f4f7a667ed3a156da0831557d52dc42ee0e4cbc7802b6ca7d52df9deff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: add-offer-modal.AddOfferModal: FunctionTooLong \u2014 AddOfferModal runs 279 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 179 over it, 2.79\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"6320748ff3378ce837d156f9198cc4c11204b513945d724732af991808eeff88"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: member-activity.ActivityPage: FunctionTooLong \u2014 ActivityPage runs 274 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 174 over it, 2.74\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/member-activity.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"deccc5e84f1cb432e493e11d38cabcab039540e60ad851dcf32bc864cb45e914"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: notifications.Notifications: FunctionTooLong \u2014 Notifications runs 269 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 169 over it, 2.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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"76f9b0dc712f697bcd34ba173b64675e1c7a96560684bfef23abf7c71b0341aa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: bluesky-sharing.BlueskySharing: FunctionTooLong \u2014 BlueskySharing runs 268 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 168 over it, 2.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"26779a2a1b8a798c57e18a084c480eaf722ba59eb566486d6c112f307b0afb2a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: new-subscribers-cadence.NewSubscribersCadence: FunctionTooLong \u2014 NewSubscribersCadence runs 264 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 164 over it, 2.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"840c4468c50fcfd983b9999ac59b192a652b9be184af60ecd12cf9a4949f0432"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: growth.Growth: FunctionTooLong \u2014 Growth runs 264 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 164 over it, 2.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/growth.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bea9816628e9fb03ba99b211d2b5c0e3471ffec86dde211448edae11d1e824a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-editor-session.useEditorSession: FunctionTooLong \u2014 useEditorSession runs 263 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 163 over it, 2.63\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/use-editor-session.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e582b67f77582365fbd3c00a653ce1c85fbcaa1281f710a454beeeadce32e9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: edit-profile.EditProfile: FunctionTooLong \u2014 EditProfile runs 261 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 161 over it, 2.61\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2e0948b7cc6fe78377d2157e9ff9d416cc5d58f5a1133b06b4ffeaa2d7b53a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: edit-retention-offer-modal.EditRetentionOfferModal: FunctionTooLong \u2014 EditRetentionOfferModal runs 258 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 158 over it, 2.58\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"86fe68ea202a10f42ee61afcbf05674d4ca4c8ad347f81a469d8516e6fdc08f3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: app.App: FunctionTooLong \u2014 App runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/app.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3a8a0557488b7dde869fac545b1db0086b9238ef60a926ba9b755b55419617"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tier-checkout-collection.TierCheckoutCollection: FunctionTooLong \u2014 TierCheckoutCollection runs 252 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 152 over it, 2.52\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers/tier-checkout-collection.tsx"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc77a682058e4d69af1bb013693ab2daeb5a539af0dbb891a1ab69ab572a05d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: App: ClassTooLong \u2014 980 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The bar is 400 significant lines; this is 580 over it, 2.45\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":"apps/portal/src/app.jsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf5fcd7888192deff97a76b7e32ff5f0b975b2de1e9f0a5d1a0baf799a5ec615"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: latest-post.LatestPost: FunctionTooLong \u2014 LatestPost runs 244 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 144 over it, 2.44\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a093aae193da5a962abaf34f146bc6cada4b180767b18aa64ae863083625fb2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: slug-machine.createSlugMachine: FunctionTooLong \u2014 createSlugMachine runs 238 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 138 over it, 2.38\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/slug-machine.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d7297c31584d23ae62dbba593520d757527b3e898e30a4f9a6b59a7636452da"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: automations/database-automations-repository.ts: FileTooLong \u2014 1178 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 678 over it, 2.36\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/automations/database-automations-repository.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b28a4c72d7678e731e1e2159382a19746cd1822e6914096ca85195c969b6d40d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PostsStatsService: ClassTooLong \u2014 937 significant lines (blank, comment-only and punctuation-only lines excluded), 24 methods. The bar is 400 significant lines; this is 537 over it, 2.34\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d42987b7d89cd38c97679f5fa7e1083ace80f70fec4662094adf29c7768bba8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: custom-field-modal.CustomFieldModal: FunctionTooLong \u2014 CustomFieldModal 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":"apps/admin/src/settings/membership/custom-fields/custom-field-modal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c20367675378d9e03873ab500be4d639a6a604c635add388364be65809f3909"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: overview.Overview: FunctionTooLong \u2014 Overview runs 233 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 133 over it, 2.33\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/overview/overview.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"9445f14105e163c723cc640cfb8cf2fa3593004aeedcfe5efe8ce8fcb2fdcdbe"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: welcome-email-modal.WelcomeEmailModal: FunctionTooLong \u2014 WelcomeEmailModal runs 232 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 132 over it, 2.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"74809cc0062b3f27fb619eddf3c3f55eaf6bd9bab6eb2c1c08c0152f08172dfe"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProductRepository.update: MethodTooLong \u2014 update runs 231 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 131 over it, 2.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":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f2004710f8c6a434f0931aa56e1c761f146d7ea8af4e8560f747f4a7ccb5cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: unsubscribe-page.UnsubscribePage: FunctionTooLong \u2014 UnsubscribePage runs 228 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 128 over it, 2.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/unsubscribe-page.jsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4525fd78aed2a042d6ae53f0687efc787d40dac563e5bce22a4b00609d89ce7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: beta-features.BetaFeatures: FunctionTooLong \u2014 BetaFeatures runs 227 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 127 over it, 2.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/labs/beta-features.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bc12578e1d0aed66fafb59d11fd654f5e3fa8eda799dfe1dae187f2ef55d3fc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: testimonials-modal.TestimonialsModal: FunctionTooLong \u2014 TestimonialsModal runs 227 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 127 over it, 2.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/explore/testimonials-modal.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e03b9e88802732115ae55430f2c4fde49ac2753f0832d1d26f51de151d209ab8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: chip-picker.ChipPicker: FunctionTooLong \u2014 ChipPicker runs 225 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 125 over it, 2.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/pickers/chip-picker.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c94b2b7385f9781a98182631508e25e87d52e9070779ec83376c48f17e1ff05"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: top-posts.TopPosts: FunctionTooLong \u2014 TopPosts runs 224 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 124 over it, 2.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":"apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"497e95bc8368d565fce9ae049ec6bbe56abb8986dbd2e7f169e1bc37207a2edb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: search.Search: FunctionTooLong \u2014 Search runs 223 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 123 over it, 2.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":"apps/activitypub/src/components/modals/search.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3cb9759c642001f1522538e5a04a2400282ea085fd8874d513e52906250258"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: data-attributes.handleDataAttributes: FunctionTooLong \u2014 handleDataAttributes runs 222 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 122 over it, 2.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/data-attributes.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"570554f1f2f6fe4c0b1d028f4b2ae869a04026003d5386b9a98c112e83b091b2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: moderation.Moderation: FunctionTooLong \u2014 Moderation runs 220 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 120 over it, 2.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/moderation.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e069520d2fdc70e62978beecaa4ac43794d4153590de016daa6f31668d88286"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-activity-pub-queries.useDeleteMutationForUser: FunctionTooLong \u2014 useDeleteMutationForUser runs 217 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 117 over it, 2.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1eb00e38e41ff0758c0482e61290508bc37cc1caf6773171906ca848955eac"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: feed/feed-item.tsx: FileTooLong \u2014 1082 significant lines (blank, comment-only and punctuation-only lines excluded), about 63% of them inside a single declaration: FeedItem (506-1334). The bar is 500 significant lines; this is 582 over it, 2.16\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a369937d04d01127b6551542f72f8d302402b28b19bc7ba2436b35dfc5b26088"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: gifts/gift-service.ts: FileTooLong \u2014 1056 significant lines (blank, comment-only and punctuation-only lines excluded), about 75% of them inside a single declaration: GiftService (324-1577). The bar is 500 significant lines; this is 556 over it, 2.11\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe434d18caa8836ab960342294c56aac854c1117cf7f3ec956f833aa14ff37d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/app.jsx: FileTooLong \u2014 1049 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: App (85-1511). The bar is 500 significant lines; this is 549 over it, 2.10\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8434be18a16b031e056f7b339617cbec03313af762e061b629716e1112010f0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: welcome-email-customize-modal.WelcomeEmailCustomizeModal: FunctionTooLong \u2014 WelcomeEmailCustomizeModal runs 208 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 108 over it, 2.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.tsx"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"53f20efacc5c7a8ff24bef4eb2df7281c4ce4c56c2be6473a2e2d3d8f58e5fd0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: post-editor.PostEditor: FunctionTooLong \u2014 PostEditor runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/post-editor.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83c92583509ecd46f0afaa09cdfdad79d8103cbb513d2929ce1d3c84d970a8c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: default-recipients.DefaultRecipients: FunctionTooLong \u2014 DefaultRecipients runs 204 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 104 over it, 2.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/default-recipients.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb7c9c98163e33239b8e39b5b3cb9f00c13456bc81721c8cf53c58c6a541888d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LexicalEditorController: ClassTooLong \u2014 814 significant lines (blank, comment-only and punctuation-only lines excluded), 53 methods. The bar is 400 significant lines; this is 414 over it, 2.04\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83414aebfc5dc3ee9af7fd04d7b5d0530f4d126b46c0fb567a2b8b3c8ad7500"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-member-filter-fields.useMemberFilterFields: FunctionTooLong \u2014 useMemberFilterFields runs 201 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 101 over it, 2.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/use-member-filter-fields.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"7038bccd975f3ea64e9774828a1bf224548db767bc9eb606a0f76cc98af6c6e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tiers.Tiers: FunctionTooLong \u2014 Tiers runs 201 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 101 over it, 2.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a7c284c56023a91bfe710a11c4f638df5b71f2e3aef9c6786dc98befece82f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: share-modal.ShareModal: FunctionTooLong \u2014 ShareModal runs 201 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 101 over it, 2.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/share/share-modal.jsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0ca57082258d894f433aaf9e2d5652cd0c9fa4aa454a33e999007d68edf1b88"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: analytics.Analytics: FunctionTooLong \u2014 Analytics runs 199 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 99 over it, 1.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/analytics.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b53a3bb469493604590f77d12cd06c888c995c166036f62f14d97a49001958ab"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GiftService: ClassTooLong \u2014 794 significant lines (blank, comment-only and punctuation-only lines excluded), 32 methods. The bar is 400 significant lines; this is 394 over it, 1.99\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":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c639b114368bd88f27947d3a87a02513cef5c188f475c4875091e920e58946e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: theme-modal.ChangeThemeModal: FunctionTooLong \u2014 ChangeThemeModal runs 198 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 98 over it, 1.98\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"287971e5d4dc84c2842ad07530b7f720ff64c1001d5c32455086a51dab79c0e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: service.createLlmsService: FunctionTooLong \u2014 createLlmsService runs 196 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 96 over it, 1.96\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/llms/service.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a92a1575f6c0394c6c6ff4e0a5ed2355a6da7175789d16d1c9f10e740c01077"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: members-list.MembersList: FunctionTooLong \u2014 MembersList runs 195 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 95 over it, 1.95\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/members-list.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d0841379bb9fe0d1ccb6b5a6c58c44ecb0222d387fb302bfbb147d819da545"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/reader.tsx: FileTooLong \u2014 961 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 461 over it, 1.92\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde3e6b6c5a17fafd98856a4bd98891aaa7f4b445226d2cfc5b29337d9ae1257"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: publish-options.createPublishOptions: FunctionTooLong \u2014 createPublishOptions runs 191 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 91 over it, 1.91\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-options.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"035e96fd19c4b950167a4a8b3be281a5830be382c521ccc37ba47389582064ec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: database-automations-repository.createDatabaseAutomationsRepository: FunctionTooLong \u2014 createDatabaseAutomationsRepository runs 189 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 89 over it, 1.89\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/automations/database-automations-repository.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"a39f94c56aa367827f63f92752e08964ebbdce21bdab8f9563c2893ef7aac35a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: stats/posts-stats-service.js: FileTooLong \u2014 943 significant lines (blank, comment-only and punctuation-only lines excluded), about 99% of them inside a single declaration: PostsStatsService (80-1665). The bar is 500 significant lines; this is 443 over it, 1.89\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":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb0cb1d6abe72f91e06d70296899a1cbcf490a488edc12d618ea303cb7af41a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: invite-user-modal.InviteUserModal: FunctionTooLong \u2014 InviteUserModal runs 186 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 86 over it, 1.86\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/invite-user-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d3becbdffee10915e3147f3cd68caa7345c801a748a9a17348732acf20d930"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: newsletters/newsletter-detail-modal.tsx: FileTooLong \u2014 924 significant lines (blank, comment-only and punctuation-only lines excluded), about 75% of them inside a single declaration: Sidebar (159-999). The bar is 500 significant lines; this is 424 over it, 1.85\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"74286999705382fbbda28dc821a7b396e52811e8a56962334640a5118cbe9092"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: common/products-section.jsx: FileTooLong \u2014 917 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 417 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":"apps/portal/src/components/common/products-section.jsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48a2874b3b7c72ea775f625318a3beacfa9c9446c544b053e739c140d3ee4b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: comment-likes-modal.CommentLikesModal: FunctionTooLong \u2014 CommentLikesModal 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":"apps/admin/src/comments/components/comment-likes-modal.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd6cb337c34b089f479b920e68085c54657868d5a52c880007f0f410104ad9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: web.Web: FunctionTooLong \u2014 Web 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":"apps/admin/src/posts/analytics/web/web.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"586eef90fc4dea7b707e032485ecdb92fae8eaed1f246f54a62ea8e321d6a91a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: controllers/lexical-editor.js: FileTooLong \u2014 910 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: LexicalEditorController (149-1632). The bar is 500 significant lines; this is 410 over it, 1.82\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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58271e644fff56e8a2c8c66f19c82347e8b3bb75e1663e6b360bb864d7daacc1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: comments-list.CommentsList: FunctionTooLong \u2014 CommentsList 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":"apps/admin/src/comments/components/comments-list.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d670b8635aab624d89043199a9987d1304d28453c8629dd28a3bc509f940f21"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: add-details-popup.AddDetailsPopup: FunctionTooLong \u2014 AddDetailsPopup 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":"apps/comments-ui/src/components/popups/add-details-popup.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d2b4ad1d597f386814605f1ee43f66fe4a0cdb1ac4786ea60fb0c86390eb09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: change-password-form.ChangePasswordForm: FunctionTooLong \u2014 ChangePasswordForm runs 180 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/users/change-password-form.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f80ee02ef25b06ae77b7ff5faa83013a27518537846b47079acb72b0de11b510"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LexicalEditorController: TooManyMethods \u2014 53 methods. The bar is 30 methods; this is 23 over it, 1.77\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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ceb78a5d6dd54396e8745744c0bbf37b64f9f6b2b79ad965c18b420dd1691a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: unsubscribe-modal.UnsubscribeModal: FunctionTooLong \u2014 UnsubscribeModal 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":"apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"b533d06a5fd8bb750bf557ad379564edba4035fe24a19d232fef12e911aa994f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: design-and-theme-modal.DesignAndThemeModal: FunctionTooLong \u2014 DesignAndThemeModal runs 175 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 75 over it, 1.75\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/design-and-theme-modal.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1abde783b0bd8b67e8f492b8c4adc237f0fa8258bdc55e7d4c9b86346dd4254"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: field-picker.FieldPicker: FunctionTooLong \u2014 FieldPicker runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 74 over it, 1.74\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4543287e84eb30d3c413b47ea2b0f1a63fbf96e61b86ff1de589f13247348e0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: theme-modal.ThemeToolbar: FunctionTooLong \u2014 ThemeToolbar runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13eeddd92435c0c71e9d32b302c28abc4cc5f526609de941348329182bc3f95"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: email-service/email-renderer.js: FileTooLong \u2014 851 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 351 over it, 1.70\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":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9fb8857ac2b2c82b7867738dd75e29111d52dfb6742defa1fc52ac01b3e545"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ActivityPubAPI: TooManyMethods \u2014 51 methods. The bar is 30 methods; this is 21 over it, 1.70\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":"apps/activitypub/src/api/activitypub.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c3335d551beeb6d2ed546aac10f2efd29630b90eb70f4c37e2a137e10c99a1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: api.createApiInstance: FunctionTooLong \u2014 createApiInstance runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/api.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69530bb7d8136dacfb5016e13bd9d37fed567b655cbc9bdc0c77919762fdcc9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gift-redemption-page.GiftRedemptionPage: FunctionTooLong \u2014 GiftRedemptionPage runs 168 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 68 over it, 1.68\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-redemption-page.jsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4feb0050239525c3e1552e55df2618c7656bac6478709a9e948a5776141a906"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mapping-step.MappingStep: FunctionTooLong \u2014 MappingStep runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef961257cea35d56737dc31d8aea9b205b701c992e964fe7e28a19e8eec6939c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: design-modal.DesignModal: FunctionTooLong \u2014 DesignModal runs 166 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 66 over it, 1.66\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/design-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc5548465d58894a5f08ce8512a3af245ca85364cec3b96e8da1d560b41b9f64"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/actions.js: FileTooLong \u2014 826 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 326 over it, 1.65\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/actions.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15e58dc58830895902757646fce03b39893b33b9667d56b4e26db3c65de784f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-post-bulk-actions.usePostBulkActions: FunctionTooLong \u2014 usePostBulkActions runs 164 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 64 over it, 1.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/hooks/use-post-bulk-actions.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4b78a44ec6a80b3afbc98c672a51825e447a3b6d9073c85c0199e675801a4b9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: add-recommendation-modal.AddRecommendationModal: FunctionTooLong \u2014 AddRecommendationModal runs 164 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 64 over it, 1.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/recommendations/add-recommendation-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"14d6ae652e9401654e58f22fb165104d048a9450ad1a50b174e39b6a47580530"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: email-template.renderImportEmail: FunctionTooLong \u2014 renderImportEmail runs 164 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 64 over it, 1.64\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/import-export/import/email-template.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c2c85b584537921a0f646a0307b0417a943c6c9ffe669bcec3c6f553aad419c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: activity-email-preview.ActivityEmailPreview: FunctionTooLong \u2014 ActivityEmailPreview 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":"apps/admin/src/members/activity/activity-email-preview.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c030eaf050b951daeda1cc23166b05b6579501efd8201582ef1a860aa88860c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tips-and-donations.TipsAndDonations: FunctionTooLong \u2014 TipsAndDonations 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":"apps/admin/src/settings/growth/tips-and-donations.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"09335bced9e01427f37d71e31c1930f10b3f77e0cb95deb5f93315c9e13e9921"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: portal-modal.PortalModal: FunctionTooLong \u2014 PortalModal 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":"apps/admin/src/settings/membership/portal/portal-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"21175d8af8929b651694bdea9cda18d2ebd0839044ece49d3a76562eef071a7f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PostsStatsService.getTopPostsViews: MethodTooLong \u2014 getTopPostsViews 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":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":1256}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d5c8607024da07623f2bb9765b04760d95555bc80f1b4c1335372db4b7e079e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: repositories/event-repository.js: FileTooLong \u2014 813 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 313 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":"ghost/core/core/server/services/members/members-api/repositories/event-repository.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79dc0ea0105789ef796ae990d508d1859a54a75b5efc34d4869acfdf867b0c75"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-activity-pub-queries.useFollowMutationForUser: FunctionTooLong \u2014 useFollowMutationForUser runs 162 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 62 over it, 1.62\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":1231}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c3d1584cba2a07ba9dcb151f1f29d146f57485a3671ef7728b4a502a842c26"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: update-flow-modal.KeyedUpdateFlowModal: FunctionTooLong \u2014 KeyedUpdateFlowModal runs 162 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 62 over it, 1.62\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/update-flow-modal.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed9393f5556ba1d974b16c83c3889a5176222335d6f87754b47c89e2614ec9a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-activity-pub-queries.useUnfollowMutationForUser: FunctionTooLong \u2014 useUnfollowMutationForUser runs 160 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 60 over it, 1.60\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":987}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d66ed12ee597886c333e1cbe2c37fb80a7377bf251a3eaaa78b20b9a72b8f44"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: universal-import-modal.UniversalImportModal: FunctionTooLong \u2014 UniversalImportModal runs 160 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 60 over it, 1.60\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/migration-tools/universal-import-modal.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"57bfdfc1ee079a575b0bc617a16fb7f80b93b9a268563619c0622e57253aeb58"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: change-tracker.createChangeTracker: FunctionTooLong \u2014 createChangeTracker runs 157 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 57 over it, 1.57\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/change-tracker.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"9727b94cde749e61b911b1b4046ad503748e922e678bfd1451e8bbd8c78012e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: newsletter-preview.NewsletterPreview: FunctionTooLong \u2014 NewsletterPreview runs 157 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 57 over it, 1.57\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/newsletters/newsletter-preview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c9154a9bf53b88fd999754205f95a7eba8ae28a2edd91720db28f91df8e7d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: overview.Overview: FunctionTooLong \u2014 Overview runs 156 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 56 over it, 1.56\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/overview/overview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1d8859358eb98dd986de86ce7d4643b73acaa6f92a988362df48e08163247d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: controllers/router-controller.js: FileTooLong \u2014 779 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 279 over it, 1.56\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/controllers/router-controller.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"892ff5f7a51bca81e80efa075d36bd08d61117062424f1c7f27314bad4e71349"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/actions.ts: FileTooLong \u2014 776 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 276 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/actions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61bd2ead9d837d28c086cc059d001a66191a4714dd06ceebeb0d9bccd6a404c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: publication-language.PublicationLanguage: FunctionTooLong \u2014 PublicationLanguage 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":"apps/admin/src/settings/general/publication-language.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab8be904f3fbb23974de407cd9e76f17f0f5420a2a62063c1da0c587a9d05585"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: email-notifications-tab.EmailNotificationsInputs: FunctionTooLong \u2014 EmailNotificationsInputs runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/users/email-notifications-tab.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"19526429d8142eb383391657e45625d366a5864d5609e669c6c887e6d3d24bec"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: paid-account-actions.PaidAccountActions: FunctionTooLong \u2014 PaidAccountActions runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"b70512fb521b1637acfc11e41e0442417cd58631e0881133192ca705b9a4e227"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: feedback.Feedback: FunctionTooLong \u2014 Feedback runs 152 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 52 over it, 1.52\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/newsletter/components/feedback.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d935330173b55f712ff2eaa7657d5da8b5ddd9eb2c3eaf61b4434cc1f38380a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: portal-links.PortalLinks: FunctionTooLong \u2014 PortalLinks runs 152 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 52 over it, 1.52\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/portal/portal-links.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a145a896098770a367f43b4f6501b3bb25e606a50de6fb4d46e91cfc54e85e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/api.js: FileTooLong \u2014 753 significant lines (blank, comment-only and punctuation-only lines excluded), about 100% of them inside a single declaration: setupGhostApi (4-1104). The bar is 500 significant lines; this is 253 over it, 1.51\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/utils/api.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bda3c9a2a6fc156a472312df98c1bb0dbceb8b5fdcfbcd720cbccac4db7aeb1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: theme/theme-code-editor-modal.tsx: FileTooLong \u2014 749 significant lines (blank, comment-only and punctuation-only lines excluded), about 74% of them inside a single declaration: ThemeCodeEditorModal (298-1129). The bar is 500 significant lines; this is 249 over it, 1.50\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":"apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe317a61802c65140d88262c0d4fa08491acc96d70a73b49e72c4f113cdcd07"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: account-migration.AccountMigration: FunctionTooLong \u2014 AccountMigration runs 148 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 48 over it, 1.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/account-migration.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3028f4b04896f72193d8609d92ca470459359c245c4bb3461224aa13fd5dcde5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pintura-modal.PinturaModal: FunctionTooLong \u2014 PinturaModal runs 148 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 48 over it, 1.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations/pintura-modal.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff9dcf36867f8a137f796e9de0283a85441719dc508481f5df4492b67fe0b09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: member-emails.MemberEmails: FunctionTooLong \u2014 MemberEmails runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/member-emails.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d4b20127e80b3576d154b7ac680e4153a62ab18d730b4456c06caa75d8049ab"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: custom-integration-modal.CustomIntegrationModalContent: FunctionTooLong \u2014 CustomIntegrationModalContent 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":"apps/admin/src/settings/advanced/integrations/custom-integration-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd6f2f2c715b4b982a6eb417712d09c3a2e447ba3d3d6c3fa24796e3a069382"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: milestone-email-config.milestoneEmailConfig: FunctionTooLong \u2014 milestoneEmailConfig 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":"ghost/core/core/server/services/staff/milestone-email-config.js"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"756dd91ba0bfd4a99fed183535a7be93603a4fe89fe31163523c11b0a105980a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BatchSendingService: ClassTooLong \u2014 573 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. The bar is 400 significant lines; this is 173 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"de437b0e1b951b2282c568ed10f54b9a9b5198b48a5422a6c610df136ea2e400"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: offers-index.OffersIndexModal: FunctionTooLong \u2014 OffersIndexModal runs 143 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 43 over it, 1.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/offers-index.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"6122144964faeea58c278014ec8c7e8ce627b86d26673d99bed8879621692b05"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: members.mockMembers: FunctionTooLong \u2014 mockMembers runs 143 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 43 over it, 1.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/mirage/config/members.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8176ca437a9c9260df147cf8cc2896bd55f46b3345ac43f18da9b3b922f966"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GiftDeliveryService.send: MethodTooLong \u2014 send runs 143 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 43 over it, 1.43\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-delivery-service.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f2aac214883ac888282e0a675b943b15670ccde246b02f2c1c03f5c4d9c7b3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: suggested-profiles.SuggestedProfiles: FunctionTooLong \u2014 SuggestedProfiles runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/components/suggested-profiles.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a46c75a2041aabef5560f6fa2023f3c8f7f4fe6964fee21a295fa7ef9f6dbba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: danger-zone.DangerZone: FunctionTooLong \u2014 DangerZone runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/danger-zone.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7254a42051908e040f3f9b3b68b739817b68e1998e68011564a2c44d4b7253a9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: App.fetchLinkData: MethodTooLong \u2014 fetchLinkData runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"602f8053850b649da35f13311785105e9bb5f0349e393a52f6371ddc32104b50"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/helpers.js: FileTooLong \u2014 697 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 197 over it, 1.39\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/utils/helpers.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac1807f4d15569524e251a2524a884860fa20089fa400ed6b477e58419b5e04"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: member-add-comp-modal.MemberAddCompModal: FunctionTooLong \u2014 MemberAddCompModal runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-add-comp-modal.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d159163c8c101f2694d353641415b7031f026681da9647dc8eba205e51d7a09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: explore.Explore: FunctionTooLong \u2014 Explore runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/explore.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f538978cf7c80f3c9c3072a2e69f83ec52524e28cd7c245c1662d7c026805255"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MembersCSVImporter.writeRows: MethodTooLong \u2014 writeRows runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/import-export/import/importer.ts"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"34afe6305f60e43eaf7e2399a7c535eecd6d6783b77d4ad7501757eb44102be6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: offers/edit-retention-offer-modal.tsx: FileTooLong \u2014 679 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 179 over it, 1.36\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24106f65aed8641628939edce44ed0e52af5d97f4e7ada8cb68bde337b538ef1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: web.Web: FunctionTooLong \u2014 Web runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/web/web.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d4c9be0e6e21ca87e649d0a2f8442aef44af1db8628b69b7ea2f848257679cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: offers/add-offer-modal.tsx: FileTooLong \u2014 674 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 174 over it, 1.35\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a16bdcd894803662534de5273ead45aacee32b384df5de4efadddd04627f60d9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: transistor-modal.TransistorModal: FunctionTooLong \u2014 TransistorModal runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations/transistor-modal.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e575fb58c90f26c4a83600ed71c3c27ec90879ac5f9c32a342e6209cab02351c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-pintura-editor.usePinturaEditor: FunctionTooLong \u2014 usePinturaEditor runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 33 over it, 1.33\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/hooks/use-pintura-editor.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8a700246b444a213986c6669cc4936062758bcc665eefb285ebc0ef2b034f3a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pages/signup-page.jsx: FileTooLong \u2014 664 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 164 over it, 1.33\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/signup-page.jsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9afba6b047799d7c313030ad6d7c566fc14a97fcb2f6db0e8b64c2b3941ac28"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: engine/save-engine.ts: FileTooLong \u2014 663 significant lines (blank, comment-only and punctuation-only lines excluded), about 66% of them inside a single declaration: createSaveEngine (364-997). The bar is 500 significant lines; this is 163 over it, 1.33\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":"apps/admin/src/editor/engine/save-engine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"605f36facf3e37239a9cd540997069da10ff8fbf4eacd6458ae41e7a2e3892b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: email-preview.EmailPreview: FunctionTooLong \u2014 EmailPreview runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/preview/email-preview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"c807082e8bf0cf31aba8b2b1a6f853ebf2145d680c250ade089e9cb1910de2bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: options-step.OptionsStep: FunctionTooLong \u2014 OptionsStep runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/options-step.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad5b9ff7d98ddb0973311ef5276aa1a2b892cddd463cad9fe03d83bc076781a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: about.AboutModal: FunctionTooLong \u2014 AboutModal 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":"apps/admin/src/settings/general/about.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0cf7905b35f368250da2aac97547d02633e6f0d9033acd69571203da8a3704f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: recommendations.Recommendations: FunctionTooLong \u2014 Recommendations 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":"apps/admin/src/settings/growth/recommendations.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7d6496a97be8e593dfe7d4c1764d44c4296121d573a2c426a15fa646e861a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: boot.bootGhost: FunctionTooLong \u2014 bootGhost 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":"ghost/core/core/boot.js"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fe98fbd5aa73454cf5bf618f2b0ae6cef8a531910c7d3b4ceae3eeae0637ac4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pages/account-plan-page.jsx: FileTooLong \u2014 639 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 139 over it, 1.28\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/account-plan-page.jsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"899b667c61bfe3eea06b063af2cc04eab21a6021fd65cf710b43ee29b59d57da"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: App: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"08dd8342594f7ca7028a23aa3769aa74ba6809940eb6f10bdfcab5fd71ac092c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MemberWelcomeEmailService: ClassTooLong \u2014 504 significant lines (blank, comment-only and punctuation-only lines excluded), 28 methods. The bar is 400 significant lines; this is 104 over it, 1.26\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":"ghost/core/core/server/services/member-welcome-emails/service.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"62051c386398e34583380df9a6fc316eb691c02a2d6e333f40211595b37f9e4d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-pintura-editor.usePinturaEditor: FunctionTooLong \u2014 usePinturaEditor 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":"apps/admin/src/hooks/use-pintura-editor.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0893bb008e0a2f7927a6ba26366571da35d6396484fbf092f155ce7589739b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: check-internal-packages.validateCompliantPackage: FunctionTooLong \u2014 validateCompliantPackage 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":"scripts/check-internal-packages.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"e19794f222337a7ef73f7204a5219ad71a56609d7ee06b7d378ab191d7eb6c25"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-growth-stats.useGrowthStats: FunctionTooLong \u2014 useGrowthStats runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/hooks/use-growth-stats.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"049a7e5ef4518070d4c82b86d242abf98ecffbfa1bdbce0e23a4479d898f94ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-post-success-modal.usePostSuccessModal: FunctionTooLong \u2014 usePostSuccessModal runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"c85ba55632d2b67a892aee3e3e86f7adfd263748b13f597e951d76c09ca8d91a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: KoenigLexicalEditor.ReactComponent: MethodTooLong \u2014 ReactComponent runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/koenig-lexical-editor.js"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"00cff66d1372e02bd2ac821bd893f1fd1e487238d4c6bafcdf5c3e801cfd1a42"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gift-success-page.GiftSuccessPage: FunctionTooLong \u2014 GiftSuccessPage runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-success-page.jsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c6bfd4302d77113ad40bbcfba5c6aa8485e8ff578f3bd3a2fc435a8e6b7def5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: index.init: FunctionTooLong \u2014 init runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/index.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"84c312595e51d9b2f35ad5348846489762650617ff8711c0ff865497048d706f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-scroll-restoration.useScrollRestoration: FunctionTooLong \u2014 useScrollRestoration 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":"apps/admin/src/shared/virtual-list/use-scroll-restoration.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"78cffc0b2e5c367849fa0184ddc573e4b991d143e88808f7112cf58e93189d6b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CommentsService: TooManyMethods \u2014 37 methods. The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/comments-service.js"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d369a15d51738903a003888612b7d5766b4f93887edecf56e1307f25599e0f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: step-2.Step2: FunctionTooLong \u2014 Step2 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":"apps/activitypub/src/components/layout/onboarding/step-2.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"31f95bb3c89f214d355c6cdfe98f0e5d48a53a4c74a305fc0c4763c4a8ac76c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-post-newsletter-stats.usePostNewsletterStats: FunctionTooLong \u2014 usePostNewsletterStats 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":"apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e010a7761ed0bda4d0d2c79022ab00c15f7289b5ffa4bb06a88e045a2110755"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: history-modal.HistoryModal: FunctionTooLong \u2014 HistoryModal 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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"c511211324d92c8c496061125a24e25ed9cc467aa7c4ac2d99b5aa0ac12106d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mailgun.MailGun: FunctionTooLong \u2014 MailGun 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":"apps/admin/src/settings/email/mailgun.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"bca05f20443e643ab01b03be206dd1f23ef8b19e164629b363283a1685292d0f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: EmailServiceWrapper.init: MethodTooLong \u2014 init 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":"ghost/core/core/server/services/email-service/email-service-wrapper.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"94221634c5b60705ec52d5eab74aa1e24064b2c22378c9fc439880aa8d3bf395"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: newsletters.Newsletters: FunctionTooLong \u2014 Newsletters runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 22 over it, 1.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/newsletters.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"d19ae62ec92c080f545461237d0159d77969b3aabd8fa0689ee66bdab5ddd0a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/activitypub.ts: FileTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded), about 65% of them inside a single declaration: ActivityPubAPI (307-944). The bar is 500 significant lines; this is 108 over it, 1.22\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":"apps/activitypub/src/api/activitypub.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"804a984b4a98975972df8198843bad40f5e4a6521ae96ed1f091e0726f2042f9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: newsletters.Newsletters: FunctionTooLong \u2014 Newsletters runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"e471f37027d02187d584a3b282cf592fbfd61696eab1b278a3c9eb55d723f384"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: growth.Growth: FunctionTooLong \u2014 Growth runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/growth/growth.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc7a5bb520daae7126ac918d829a565ec493e58ed5a69b0532d544974f39deb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: zapier-modal.ZapierModal: FunctionTooLong \u2014 ZapierModal runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations/zapier-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ac894f562cb88f7c316d05da2fb1de4b6e12920e6ada25ae162fff241bc323"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GiftService.startCheckout: MethodTooLong \u2014 startCheckout runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"2248705e30ae2d2808a9558b96590f2056a6ab086d383cc81c5f7cb086397407"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: canvas/automation-canvas.tsx: FileTooLong \u2014 603 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 103 over it, 1.21\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/canvas/automation-canvas.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb9b54357b6409c580f392a636eebecac17db761077edb5c8d5edb7c2a4aa42"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: step-1.Step1: FunctionTooLong \u2014 Step1 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":"apps/activitypub/src/components/layout/onboarding/step-1.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"e50553aa8082a670ffafd8332272e2576ed09cbbd280d176270a319e984738a0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: webhooks-table.WebhooksTable: FunctionTooLong \u2014 WebhooksTable 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":"apps/admin/src/settings/advanced/integrations/webhooks-table.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"d979eb1e24665751d269a93e8e4e4edb03d9f400ec1844df060d32202e843ccc"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MembersStripeCustomersSubscriptionsImporter.generate: MethodTooLong \u2014 generate 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":"ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c95716e97a234d95a3921e99c095afe540465b154f414e8bea1cbc21b6e9530"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: announcement-bar-modal.AnnouncementBarModal: FunctionTooLong \u2014 AnnouncementBarModal 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":"apps/admin/src/settings/site/announcement-bar-modal.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"f329b91dc07b3439535a147b36b0072f67e4f571c18397a9e8d98d526294ad2e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-label-picker.useLabelPicker: FunctionTooLong \u2014 useLabelPicker runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/hooks/use-label-picker.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a9fa357a440025c78b672b44575bd834de5a670d0653d591e29bf7248ea6cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: offer-success.OfferSuccess: FunctionTooLong \u2014 OfferSuccess runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/offers/offer-success.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"294a65914161455e6f4f03b0767e1a63adb9a4ed20ad22c0f32b00a6c51ef1be"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: plan-step.GiftPlanStep: FunctionTooLong \u2014 GiftPlanStep runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift/plan-step.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4694b0b40a1bc0879bcd4ef8644018244b86333f7e60321f48d44913a0b609c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProductRepository.create: MethodTooLong \u2014 create runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a77d17269d3d49e176344674f22b49512c80a2d9000e214fadffaaaea7031c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: newsletters/newsletter-preview-content.tsx: FileTooLong \u2014 588 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: NewsletterPreviewContent (11-658). The bar is 500 significant lines; this is 88 over it, 1.18\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":"apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b21f741356ce1d971f8f7fad1deb5bc4a715f6779a1090b55b7209ec7771f5ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: email-service/batch-sending-service.js: FileTooLong \u2014 586 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: BatchSendingService (28-1159). The bar is 500 significant lines; this is 86 over it, 1.17\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":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e255fa26264278df1bca9e17d86edd2903f7c280658a9e70444516ee9f75b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: post-history-modal.PostHistoryModal: FunctionTooLong \u2014 PostHistoryModal runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/settings/post-history-modal.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"b04acd3c41c6896cc78c4f060ae12dd83a1deaad580abb8940f808b70453084b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: add-newsletter-modal.AddNewsletterModal: FunctionTooLong \u2014 AddNewsletterModal runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/newsletters/add-newsletter-modal.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a07da5f69a4a0e9560bf22c82249953731bb6dc12613d4188ab24998af9a14b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: general/user-detail-modal.tsx: FileTooLong \u2014 580 significant lines (blank, comment-only and punctuation-only lines excluded), about 76% of them inside a single declaration: UserDetailModalContent (118-669). The bar is 500 significant lines; this is 80 over it, 1.16\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c28139d6bcd26457e6dbc59953bd2dbb8b0d66d1626cc24634c5c1444a47742"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sidebar.Sidebar: FunctionTooLong \u2014 Sidebar runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/sidebar/sidebar.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c23510581f3bd174c117793c08acc17659b2808f6d2812a0ca0c6dbf5d9fde5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: editor-header-actions.PublishActions: FunctionTooLong \u2014 PublishActions runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-header-actions.tsx"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9ca833cb5df284c0607462ac7908da599ed2f6d416618a179fcdf13e6bcc198"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: input-field.InputField: FunctionTooLong \u2014 InputField runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/input-field.jsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7880049811f3bbf21c66a1bdd7b30e898395a46f730b549f805fa702e217ca6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CommentsService: ClassTooLong \u2014 462 significant lines (blank, comment-only and punctuation-only lines excluded), 37 methods. The bar is 400 significant lines; this is 62 over it, 1.16\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":"ghost/core/core/server/services/comments/comments-service.js"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"331abf2c714111c11b3bc2c675ff2b5a318f6fb6b427b2122027ff85d90ccb32"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/sidebar.tsx: FileTooLong \u2014 576 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 76 over it, 1.15\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/sidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"adc5ac1bd3bfb3a9cd0b1c75a7a789f0ee4054aa4640dccfcaac27c4a712afe2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: member-welcome-emails/service.js: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 89% of them inside a single declaration: MemberWelcomeEmailService (57-892). The bar is 500 significant lines; this is 69 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/member-welcome-emails/service.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"662ea2b0476d0c516a1d3640c3655bac9fc9106de6d1b9b7b28f738eadde69de"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: session/editor-session.ts: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded), about 74% of them inside a single declaration: createEditorSession (216-847). The bar is 500 significant lines; this is 69 over it, 1.14\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/editor-session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"438f7e77731414c5ed2e963e0c42ad4ffdc20011cd950515ff79e0401cd0cb83"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GhPostSettingsMenu: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-post-settings-menu.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"331ca5a62447180b50d607bbf57923c324c54c65d3df1c4b1a8641b43b5afa19"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/members.ts: FileTooLong \u2014 557 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 57 over it, 1.11\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":"apps/admin-x-framework/src/api/members.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6f1d40079a2ca86149b88e87c555ae4c472388cbcb8359cbff89241672c916"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DockerAnalyticsManager: ClassTooLong \u2014 445 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. The bar is 400 significant lines; this is 45 over it, 1.11\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":"ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8dceb72a2e30ff2afb22bae464422503b2e86d6f6cfa4c564c662c5700f6e0b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: analytics/stats-filter.tsx: FileTooLong \u2014 556 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 56 over it, 1.11\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":"apps/admin/src/shared/analytics/stats-filter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee9fbd3efadecc1451db8430bd05cbd3c1b11bca1c98d77604fa622c75914c90"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: email-recipients-options.EmailRecipientsOptions: FunctionTooLong \u2014 EmailRecipientsOptions runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/email-recipients-options.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ccedc62a55b9969721d04a3b4969fb2af2aabccef098a2957adfc215e21e108"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tiers/tier-detail-modal.tsx: FileTooLong \u2014 551 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: TierDetailModalContent (58-646). The bar is 500 significant lines; this is 51 over it, 1.10\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e768b97f0110a30cf4f487a3d6ffc164c011266ca7b33b899cf3c994d5229fb8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BillingService: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/billing.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf6695119c1179959b5d9733565779c47e98f95a22de75b69fa9d56081786f8"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: StaffServiceEmails: ClassTooLong \u2014 440 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. The bar is 400 significant lines; this is 40 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/staff/staff-service-emails.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c11ccb8876a3b4192dd68a5e6b22442196ea367d23f4dd312c49eccca86bf16"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: edit-row.EditRow: FunctionTooLong \u2014 EditRow runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/label-picker/edit-row.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c0d534a907e42d70a8ad3d6a525c8bf60efbb46fcc89cc8278ae7aa4f96d9fd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: boot.initServices: FunctionTooLong \u2014 initServices runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/boot.js"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a1b7d73eba34697a5d4183880f62daaa0343679d57f28f8321470a67e78675b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: feature-image.FeatureImage: FunctionTooLong \u2014 FeatureImage 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":"apps/admin/src/editor/feature-image.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2972eb8c3126f7852e22c439f9184097cf7ddde7254472e4eac7d8f8b5113648"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: welcome-email-preview-content.WelcomeEmailPreviewContent: FunctionTooLong \u2014 WelcomeEmailPreviewContent 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":"apps/admin/src/settings/email-design/welcome-email-preview-content.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"496077619d8bd32aab045ab25bd9aa22d578a7b92dd430e499348a990961a514"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ContentCSVImporter.processRows: MethodTooLong \u2014 processRows 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":"ghost/core/core/server/services/content-import/import/importer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aeac651d4cd3df8cae9acf11902a0b2e7d5a4099b87651b6db1fe81f2cd71c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-post-selection.usePostSelection: FunctionTooLong \u2014 usePostSelection runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/hooks/use-post-selection.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc063744569902119efcf3e85324ccc068802b414411937fa5a188e1e03e950"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: webhook-modal.WebhookModal: FunctionTooLong \u2014 WebhookModal runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations/webhook-modal.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2be23ff634d4cedd9a627b0a0bfb3fe13a024a4552ec392ee2188c503774a08"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-koenig-file-upload.useKoenigFileUpload: FunctionTooLong \u2014 useKoenigFileUpload 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":"apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"55aaa3d53f4cc7655026ffd3f08cf4a68aadeac599751c8fa4731e2af3816468"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: welcome-email-preview-frame.WelcomeEmailPreviewFrame: FunctionTooLong \u2014 WelcomeEmailPreviewFrame 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":"apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"195adcb620b83a9123bf43c88b84e584997f717b9dbb597b1de180d3fed89589"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MemberWelcomeEmailRenderer.render: MethodTooLong \u2014 render 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":"ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"786b5bcca443fc6dab200e7d4e79e829b95dcd38b363a817ec87b171c4e40213"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GiftService: TooManyMethods \u2014 32 methods. The bar is 30 methods; this is 2 over it, 1.07\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":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a76b094073f828844eaaf1bf9f3a53947d26a858ab3e9007268d2c655e5382"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: comments/comments-service.js: 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), about 87% of them inside a single declaration: CommentsService (103-1007). The bar is 500 significant lines; this is 30 over it, 1.06\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":"ghost/core/core/server/services/comments/comments-service.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"710dc74f0a32846bdfa7229f6429cda2e9ee152bd53f2061bcae0ae26bcf6d9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: preview-frame.EmailPreviewFrame: FunctionTooLong \u2014 EmailPreviewFrame 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":"apps/admin/src/automations/components/email-modal/preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e9e92b637dfd7f490fb5c00ff2416d658e56cf623732bd2919d336dc4e1f65"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: social-card-section.SocialCardSection: FunctionTooLong \u2014 SocialCardSection 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":"apps/admin/src/editor/settings/social-card-section.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"700f3efb2bd8a69edc99887cab94a5a09fc4128277590f5ddb96d0adb1368a3f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: email-sending-status-provider.EmailSendingStatusProvider: FunctionTooLong \u2014 EmailSendingStatusProvider 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":"apps/admin/src/posts/analytics/email-sending-status/email-sending-status-provider.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3106792a47b38a37085f2ef314e82178ccd4c9c17244900b95349bc68ab2f03c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: embed-signup-form-modal.EmbedSignupFormModal: FunctionTooLong \u2014 EmbedSignupFormModal 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":"apps/admin/src/settings/growth/embed-signup/embed-signup-form-modal.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b86aec73a2f1235142cfc8007775c9ab05d9ffac0c26e978849062068dcac0ce"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/domain.tsx: FileTooLong \u2014 525 significant lines (blank, comment-only and punctuation-only lines excluded), about 88% of them inside a single declaration: Domain (88-634). The bar is 500 significant lines; this is 25 over it, 1.05\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":"apps/activitypub/src/views/preferences/components/domain.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa829ebcf0a22a43bc44e3d369e27381ca0845fbc6fb617be5d30a62cc4d81d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-post-snippets.usePostSnippets: FunctionTooLong \u2014 usePostSnippets 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":"apps/admin/src/editor/use-post-snippets.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60dde1641dab870d048478ec9b9934d243e1959c2c79133c2630e616efa842a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: nav-content.NavContent: FunctionTooLong \u2014 NavContent 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":"apps/admin/src/layout/app-sidebar/nav-content.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"5996c0bced9101d584f83b6f765750db92000e0dd1f95d34d5d67e629a446013"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: content.Content: FunctionTooLong \u2014 Content 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":"apps/comments-ui/src/components/content/content.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7dc56699f1bff522c21807c3047bbba478019194a40b707edd95bf42394c0b3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: App.getPageFromLinkPath: MethodTooLong \u2014 getPageFromLinkPath 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":"apps/portal/src/app.jsx"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"db12bbba9f5b129c80fc8db2785c78f8db4f4465997d2d7b0c9a03b154b40505"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: feed-item.renderFeedAttachment: FunctionTooLong \u2014 renderFeedAttachment runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"e29390e4e000e6fc218027232b12f2f82c43d4ff0185c380dc02dcf899380c15"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-members-filter-state.useMembersFilterState: FunctionTooLong \u2014 useMembersFilterState runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/hooks/use-members-filter-state.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c01a9aae19d6b6e252511cbd43591910614418365cc311c2f8c74405e26e8e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: tags.Tags: FunctionTooLong \u2014 Tags runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/tags.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af40c1a9cb1518e8391b43917d3bea48867ed1839840f64fc635d034113802e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: explore.Explore: FunctionTooLong \u2014 Explore 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":"apps/activitypub/src/views/explore/explore.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b38aa6f56ba1d385e2c6e54efbe3ec60c250baba854d4f3cf73e6dc149bbd54"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: stripe-connect-modal.Connect: FunctionTooLong \u2014 Connect 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":"apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"d68dfac5dd24a2c1488ea47034fe20d0a05e2f2e6ef93b3176e3acf9837c1889"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: theme-setting.ThemeSetting: FunctionTooLong \u2014 ThemeSetting 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":"apps/admin/src/settings/site/design-and-branding/theme-setting.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"467599d28dac83d1160c1fc560c5a22af6f2f5be7b2ef6a118df4259e94f3891"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: calendar.Calendar: FunctionTooLong \u2014 Calendar 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":"apps/shade/src/components/ui/calendar.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed7c79ea68032c4027ddcd39de016826f96439fbb8152918881051270c82877"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: newsletter/newsletter.tsx: FileTooLong \u2014 512 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: Newsletter (102-637). The bar is 500 significant lines; this is 12 over it, 1.02\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/newsletter/newsletter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"829f71e4ea23dfa1747412b84f6bc587d81465d2419f11594928234c3c19104d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/profile.tsx: FileTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded), about 61% of them inside a single declaration: Profile (242-609). The bar is 500 significant lines; this is 11 over it, 1.02\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4bdfe05fcbc67f60596fdec9efc41370ec24f0b60f4d7667d1fb00c811bb40"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: use-default-recipients-options.useDefaultRecipientsOptions: FunctionTooLong \u2014 useDefaultRecipientsOptions 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":"apps/admin/src/settings/email/use-default-recipients-options.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e64450c19964326dd24289597909269ae716aadaa3f153c1e988aa39875a54b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: recommendation-description-form.RecommendationDescriptionForm: FunctionTooLong \u2014 RecommendationDescriptionForm 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":"apps/admin/src/settings/growth/recommendations/recommendation-description-form.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b31b65be8a937b8b614a1514ac7033e35ac0b26f3eccbd2d0b8f48c371f4fa3b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: platform-validator.createPlatformValidator: FunctionTooLong \u2014 createPlatformValidator 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":"apps/admin/src/settings/utils/social-urls/platform-validator.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f90a6edc81e378946bddd9a4b626b1843e420ffc93b60852cee4a1870e2cfda"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: admin-api.setupAdminAPI: FunctionTooLong \u2014 setupAdminAPI 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":"apps/comments-ui/src/utils/admin-api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"584e7328893f338500e52631993bda894efbdf581804dbd53cc3732a926e7bab"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BillingService: ClassTooLong \u2014 406 significant lines (blank, comment-only and punctuation-only lines excluded), 33 methods. The bar is 400 significant lines; this is 6 over it, 1.02\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/billing.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfadaddc8642029e973d7b19c8a14070bbcba8ceb3c66c1baa888fc1c066cddc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/spam-prevention.js: FileTooLong \u2014 506 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 6 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/web/shared/middleware/api/spam-prevention.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a3fb95042836af48a89c0cd9e34f7f7ff75eb8600ab048156798535c5d51079"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: step-3.ShortFormContent: FunctionTooLong \u2014 ShortFormContent runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/onboarding/step-3.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"96a740bf75bf92859a2ddc4d8074a17c86ad5ab78e7a537bfb1cc9d540ba7404"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: activity-row.ActivityRow: FunctionTooLong \u2014 ActivityRow runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/activity-row.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f7a4e75fe300cc75b2d414fad6f030fa1a72e789921ab853ded30e19c375d93"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hands the analytics action back to the Admin host: 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":"apps/activitypub/test/acceptance/error.test.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"6faaf0920b6c246be07fdc2fa247668b7f39673b842ae2d9ae9204036b392c13"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects a contributor away from settings: 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":"apps/admin/src/route-access.acceptance.test.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"25657a8bc52337b16f3c39af3a32e641fec70bde3ba891f7ffefd4815bacc946"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects an author away from another staff member\u0027s profile settings: 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":"apps/admin/src/route-access.acceptance.test.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f6e7071f37625270aff6b68d9fc8a4a09cb14439e1f7eac53aa9389cb409e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects a contributor away from tags: 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":"apps/admin/src/route-access.acceptance.test.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"733565065a1311e09f178c535b0ec88c0179af44f813a54e164524d43d41b5da"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects an editor away from members: 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":"apps/admin/src/route-access.acceptance.test.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"560ba618491ba728652a4bf9c90d06dae61e4a03c5780824ae04fd32f970fc80"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects members to billing during a force upgrade: 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":"apps/admin/src/route-access.acceptance.test.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"869a791f02ae163e630250abc089adb2cbdc711e1288abdf69064c383568f4a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: applies labs flags alongside browseConfig and browseSettings overrides: 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":"apps/admin/src/render-admin-app-labs.acceptance.test.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"48c98dcecc8456011dab38f31e798184201ea845aa39fc118c84f54b1e7c9544"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends admins to Analytics: 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":"apps/admin/src/home.acceptance.test.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"880aef7f629e7824efa0bd835d731ce386d0620ff224ecae53b7589dcf7d6ef2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends contributors to Posts: 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":"apps/admin/src/home.acceptance.test.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff87a7443ad034084c9e573a9667190444befb0400e6311d6fbaffbc44e89b38"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends other staff roles to Site: 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":"apps/admin/src/home.acceptance.test.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2023f60c3f9bc9972fd6416849a4184f994a2f606570bdc76d7eb68dfe798e1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects to Analytics: 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":"apps/admin/src/home.acceptance.test.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c17d0feefc79e10f12250c12a8cce307a06c0ec30dc0e3917f04dbeb0c386f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders zero KPIs when growth history is empty: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d2819e7520854af483a358eaed7c4229b7121b2b24d794a9fb75f755221e9d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the latest and top posts with zeroed stats when nothing is recorded: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea48c63838aea6830827e9cf5450f7948d7642099e6dd5f57457383c30df7ab6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: navigates to the web traffic view from the visitors KPI: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"333b840e1ddc3a504cdf8417c2c172e76f527c28eb57ede9886028c54c27055f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: navigates to the growth view from the members KPI: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b3de72ce79e5a3b7cd02d62c5810a2cbcb88ab77f91a7cd46d9cd1ee081a8e6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays on the Web route while settings load, then renders seeded analytics: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"e640d0ce8e08eb216b4d79d687ba485b23982d635540280ebb18e9677f6bd6ec"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders zeroed KPIs and empty cards when there are no visits: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"78de5a286c6f1cef5a9b89a721d40551782fe0067317e8aa68e30642313cfc2f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the empty state across the top content tabs: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20ea2714d5bc4f6f647433c35a10e31a7edd74fe1048dfa9783734b3745cd5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the seeded member growth and top content: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"a03054b2168b77186e274cb52e2d379a9c8a8a81af054a85ffb1723241afb61f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows No conversions across the top content tabs when nothing converted: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e905d984a73419877186f1407f9cdd4a94420641012feebc5ac53af19dbe3a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the seeded subscriber KPIs and top newsletters: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d612a7fe16643b2aa751ea3579076539dcf2791d9f493e88d53d4de2ae5da1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the empty state on every newsletter card when none were sent: 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":"apps/admin/src/analytics/analytics.acceptance.test.tsx"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c85f34546e597a6e400f6c5af29a8b454169549a4872fd9a8b50069c784dfc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the automations page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/automations.acceptance.test.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5eb220e159df6d33374866a415fd5019191aad73ede67e065af860ad9d68de0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides run analytics when the backend does not return stats: 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":"apps/admin/src/automations/automations.acceptance.test.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bfee1752b4acdfc546bfa78148477e571b809ad7028bad9b963d51d8a9d64d0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: navigates within threads and shows the replied-to context: 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":"apps/admin/src/comments/comments.acceptance.test.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f76799c70f5b81222bec6d29b01b3f8dee335064e9668b4faae7094495f076e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens threads from the main comment list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/comments.acceptance.test.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f7dfc075d75e8266738e472a56a9b3151d6532698abd9a3e118b0b24834990"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers the disable action for members who can comment: 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":"apps/admin/src/comments/comments-mutations.acceptance.test.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"a43a735d29e14b5ec53a8520369fd5c2ee64aa709061c00d086ea6925909b72c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the member and hide-comments option in the confirmation dialog: 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":"apps/admin/src/comments/comments-mutations.acceptance.test.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d07becdf8981f7827d34ce8d207b78eb838664048e4de73263a5f91c02ce97b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: disables commenting without hiding existing comments: 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":"apps/admin/src/comments/comments-mutations.acceptance.test.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2e9734eb5a23b1376e38cb27e2b8286b5217f6f85ff645a555291424c15bc9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides existing comments when requested: 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":"apps/admin/src/comments/comments-mutations.acceptance.test.tsx"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"839bd2827ab7e222392af1fe2883c78add90eab7978aa3c7f1926d16f5be1e55"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the enable action for members with commenting disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/comments-mutations.acceptance.test.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eba432f0fac8f51481e1ae795b621e3d21080fe9048f38f3d05b97c1a053764"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: re-enables commenting and restores the disable action: 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":"apps/admin/src/comments/comments-mutations.acceptance.test.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d07a395ad54b651a1fe157ebed1ceef43bb7ac496688426f05229704c104614"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: updates the word count as the body is edited: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce2d609fbb149f3393e6fa3b034fbac387e97a1d16b384ae61b999353a895f90"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers no snippets in the card menu until the last page of the browse arrives: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"e631b5456bca8877a15a7d0c709fc37696ab2c015f237956dabbdee86d257422"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps title edits in memory: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae71768cae2abfaf36fc1d54509c24a8776148f4fad0991881fa5d670860d3b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves from the title into the body on Enter and cleans pasted titles: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"868342082e4b78d325440ee1de619285f4b956be0b8a4f64ad6d36056cc16916"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the excerpt only behind the editorExcerpt flag: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"55325fd1adf98f0be8cc6bdedbae841125f091deae8bfba5918861f42ee6f044"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a 404 for a post that does not exist: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b60a8616ee4a7d6b10baa4ce8404b1c1a61af7f3e668c2cd5cb484b5d993dcc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a 404 for an unknown editor type: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a1101a288132d4c91bc8e6ae351a199c8827407da58343dc598e8fcf0326f1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens an empty editor for a new post: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb1fe22972d43f0e991fe1c9a5e0fe65709c841765ebd86d1c2dfd9c314118d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: labels a new page as a page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bcd16f2a783691658e708aaa52c0725bb37d0d1f1783b74f679af6c9093319e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends the bare editor URL to a new post: 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":"apps/admin/src/editor/post-editor.acceptance.test.tsx"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea10740f016407acae59679a6cc49aa026f3e68513695283f8f7133b4a57e56a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the React editor when the flag is on: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor.acceptance.test.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"390eb1e965c50e1be3b95d8039f9897ffe18f976825e40cf08c41be9e81e518a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: serves a new-post URL too: 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":"apps/admin/src/editor/editor.acceptance.test.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16fc125a003de3a70eb883a827517717177c1f2a107c3b907e70a57d04e374e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns page editors to the pages list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor.acceptance.test.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"001972d4b851fcf6a00b78837fce0a136be87327e2e1c08ad2bbd79f39e3f18a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stands in the post\u2019s own title and excerpt until the X fields carry their own: 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":"apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fdf841fcffb624be3adfe4b670f2a983b34d971a7817aa5bb343d7ebf098165"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the excerpt the server generated for the post: 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":"apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35a1a91d8bc22c8c93246b6b3ffc5ebae14b8795ea99740d52d90cf13abdf59"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the site\u2019s own description for a post that has none: 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":"apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff73fd6a067a1826705901219a16f16c1f2a2b96dc217d78deb498e5eaede01"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the meta fields where the post has none of its own: 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":"apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e6171579808c96e542daa01afe0c59ce4a943070a006e168f0ccc5a54743bed"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: gives a contributor the pane their role can write: 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":"apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ce206dec6867c18cf257a62d111754ad3a06e6174b704414370071cececb82b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers Unsplash on an empty X image field: 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":"apps/admin/src/editor/editor-settings-x-card.acceptance.test.tsx"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"2026c36191dbe5e18006c333b6c3257f4419ee7d4ee6637368054b53c986ef39"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): holds the input shut until the generator answers: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-settings-url.acceptance.test.tsx"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"6accad3d9eca59a8a6bf280feef53dc16d587e00c8e11a4d8b00231c52b4102c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hands the choice to the theme when the post\u2019s URL matches a template: 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":"apps/admin/src/editor/editor-settings-template.acceptance.test.tsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"b17dbc009c202e62854c8e558d4bd8aa99dec9994d5d577549505330d15e10e7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: refetches the site\u2019s tags once a save has created 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":"apps/admin/src/editor/editor-settings-tags.acceptance.test.tsx"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"935ecf2cf788dfa2f68066d89f1d781200a77fbd3d8b88ecc4b6308d80953aa6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: drops an uncommitted term when the list closes: 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":"apps/admin/src/editor/editor-settings-tags.acceptance.test.tsx"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"58eb3c66e8f01fdeb2f5e0d27195b38832ba3f88ea8228e9788afca55f5dc146"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: points the field at the row the keyboard is on: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-settings-tags.acceptance.test.tsx"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6eec5b901f7300ca9ca8ebb314de2735fbc30b8d1973f5d42d680fa637e895"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: saves the sidebar excerpt when the inline one is off: 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":"apps/admin/src/editor/editor-settings-sidebar.acceptance.test.tsx"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"08aef38f85077703240d39a42c7f4210b4067a62128f1fc164db1ccb59e8c8a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a field the acknowledgement adopted, with no refetch to carry it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-settings-sidebar.acceptance.test.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6f4e6fde5cc1a6cb162dd7e15035ce4505e9a4affc49e0d5cc7dcb604b6772"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the excerpt the acknowledgement normalized: 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":"apps/admin/src/editor/editor-settings-sidebar.acceptance.test.tsx"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"d163ec30b526d9519c8cbba49d92cb89e9310a6fe2daa4cbd7ae3fea37c1bca0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: warns on a theme report that carries the gap as a warning: 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":"apps/admin/src/editor/editor-settings-show-title.acceptance.test.tsx"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a296b04439421c68dfcc76f9c92dfe5108188730e50a803d75e781e699b482"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends a scheduled post to the publish menu to be re-timed: 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":"apps/admin/src/editor/editor-settings-publish-date.acceptance.test.tsx"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"78941e881285ae889710ed1dc65fd6a6b5326c4f4edb434b0c8612c058e197bc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the editor usable when the API returns malformed history %j: 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":"apps/admin/src/editor/editor-settings-post-history.acceptance.test.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"89bcc16fa33533d12ec958da422727ffbcba24bb7814e39e65310623ad60a4cc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers the row for a published post that also has a web version: 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":"apps/admin/src/editor/editor-settings-post-history.acceptance.test.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"d421704c95d901693898de6f2e89a1f24a9c3ef383c459d13844c939d1739c85"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews the version the writer selects: 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":"apps/admin/src/editor/editor-settings-post-history.acceptance.test.tsx"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a10c946346c7af1544f445eb138f4e73b03d98dcb7b28c1cffbb521e5ad6de"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the editor and the versions on screen when the restore cannot be saved: 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":"apps/admin/src/editor/editor-settings-post-history.acceptance.test.tsx"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e3180c350a51712bb7b73753fae13ca337c2284b228e023eec5f15cfe72656e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: warns that restoring updates a published post on the site: 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":"apps/admin/src/editor/editor-settings-post-history.acceptance.test.tsx"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"6337aec7b3ec5099f2fa669ba2b53b269d1382d5ce49ce3c65eedd744d35bd5f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: names the panel after the pane it is showing: 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":"apps/admin/src/editor/editor-settings-meta-data.acceptance.test.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"d38e479acc4512fd4147a92153b65912962e358c606ce571a985717436a9c3a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves focus into the pane and back to the row it was opened from: 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":"apps/admin/src/editor/editor-settings-meta-data.acceptance.test.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6bf1439fa570633f3ff7e08c5434fd4dcd0fe0360811c5409fab6804efc512e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews the post\u2019s own title and excerpt until the meta fields carry their own: 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":"apps/admin/src/editor/editor-settings-meta-data.acceptance.test.tsx"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb426b4f574ad5e42b2aee34eec925d9864147c6110ae95283e0428b34bafe9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: explains the result a post with no description of its own gets: 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":"apps/admin/src/editor/editor-settings-meta-data.acceptance.test.tsx"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbbb0e77235875e5c6519089a7c848c0cc94c17e53fcdf1f1a5435a1dfc584d7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: gives a contributor the pane their role can write: 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":"apps/admin/src/editor/editor-settings-meta-data.acceptance.test.tsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbce6da3c34ac28cab77eeffd6794db8367e4ed54515fd9e23f77c446577efde"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: names the modifier a glyph stands for when the writer hovers it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-settings-keyboard-shortcuts.acceptance.test.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c11249ffbad10b72ec43337d0cf5ab18cfb7af9fcefcc11b244e27b26cb8420"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers the post\u2019s own title and excerpt until the Facebook fields carry their own: 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":"apps/admin/src/editor/editor-settings-facebook-card.acceptance.test.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d42fae2821f26985f7cb536afa1e1cd9052fe88a330482ceb765a63a7f7e632"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the site\u2019s own description for a post that has none: 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":"apps/admin/src/editor/editor-settings-facebook-card.acceptance.test.tsx"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c5fab63e09e4678182a82ecb06ccdfd354ca5b4e4e27656253a13abae7ee0b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers Unsplash on an empty Facebook image field: 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":"apps/admin/src/editor/editor-settings-facebook-card.acceptance.test.tsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"7deb06b8ec72689124578d8a510fb63148a3beec4f2575f0b674ee1a2407a0ae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: names the post it is about to delete and warns that it is permanent: 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":"apps/admin/src/editor/editor-settings-delete.acceptance.test.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"5598badceaa3f43196d18db1ffb996854cd05d6ad98c801334aa3fde6b263a8e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves for a list that no longer carries the deleted post: 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":"apps/admin/src/editor/editor-settings-delete.acceptance.test.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"1638c77ef56a1e28239ca73cf0a4785d3a4085e1244c196d8b1f079b4a5fa3d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: deletes a page through the pages API and returns to the pages list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-settings-delete.acceptance.test.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"a499730835949b964db6d3b2d4d60ae477d32bbfc3acf27e76041d02c1152454"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the pane open on Escape inside an editor: 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":"apps/admin/src/editor/editor-settings-code-injection.acceptance.test.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"1413244b9b3777b106cc798c0779ca8bcf91b302143d2478285e4f71c87932df"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves between the editors on the Tab that follows Escape: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-settings-code-injection.acceptance.test.tsx"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"491ded1cf9476677702b1dc133725c4ab9b85e8608199c79b2857eb5766f2f62"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the code the post was saved with: 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":"apps/admin/src/editor/editor-settings-code-injection.acceptance.test.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9c5076489af276e8ea63a2b7d54237f2a3c0a1cf29f6741a914dddc0dc398fc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: gives a contributor the pane their role can write: 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":"apps/admin/src/editor/editor-settings-code-injection.acceptance.test.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"a707be679e8bf68dd9100507c11fa02112322d9886f687328514a7bdb987f037"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: browses paid tiers at the URL the publish flow and preview also send: 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":"apps/admin/src/editor/editor-settings-access.acceptance.test.tsx"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5e0f8647a1d76568053b84a9c3364ed2b7347774fdd6837aec5f1f18cb65ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays clean once the save has been acknowledged and refetched: 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":"apps/admin/src/editor/editor-save.acceptance.test.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"2695fb867b09f33bc870be81dc919562823fcc70942636fc6f5be885eefb0b25"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves an old-schema post alone until it is edited: 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":"apps/admin/src/editor/editor-save.acceptance.test.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7f2c12e3e462536b3433ee63ac8b8156b600ceb7215d34c11c20b9522ca8693"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reports the save in the header and settles on saved: 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":"apps/admin/src/editor/editor-save.acceptance.test.tsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"e75405445ee8746a87749c906ad5f1bf0ea8955d81c4558b12537d0d50f092af"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reports a status the post reached elsewhere once a save refetches it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-save.acceptance.test.tsx"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"35eb030afe3f769be2709152fcea7073e66e804d7cc16190cc9a088cf5688cb6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: halts on a collision and keeps the content: 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":"apps/admin/src/editor/editor-save.acceptance.test.tsx"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b1dc3a9bc1e57ccadd083fc4522a410d7c029b16f3cb203561d7df28a139d85"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: still says saving stopped after the session banner is dismissed: 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":"apps/admin/src/editor/editor-save.acceptance.test.tsx"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"186965d6e4838cbed04a624bb1cf9266faaf778ba6aaa915db25a4292480b913"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens a post whose caption carries markup without making it unsaved: 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":"apps/admin/src/editor/editor-feature-image.acceptance.test.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"3731a3a3dc9474fe958f7655e123a69939cd5c4c1c870d760e255112186c9fdb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps local content when a save starts before the reload answers: 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":"apps/admin/src/editor/editor-conflict.acceptance.test.tsx"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"df1fde262a28bfafc7053b545679a1f606d2b5a0b6262daaa21854464c969dd1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: follows the status the other writer left the post in: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor-conflict.acceptance.test.tsx"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ebdac5914ecf80d53d39ec23657061ed509f7aee081a7344f71d78027c790c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the reloaded status when a later read answers with the copy it replaced: 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":"apps/admin/src/editor/editor-conflict.acceptance.test.tsx"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98bac593723857323f222c502c043fd86016e5be26f988c17be97803965dac7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews the post in the browser as a free member: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a88a7f29ac3d5c65ac444063007e6687956717b463952fa9c132c7e48e1ed20"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews as a public visitor: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"36da3ed7f734ed6915218747df5377768e0b02fd77551fcfa496079ebaf72790"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews as a member of a specific tier: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"be7ce8934d6dfddff22c4e83fe0b048d818259c5df3a8f293e9cc33aed7fe718"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: switches the frame to a mobile viewport: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3595f9e77602ff50d4b6d92405da00bc81e0c7e829610a042ec9433519f17c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: copies the preview link for the selected audience: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68290d4d06364113a1324abfeb3c4b59856d93724e73f30d76630d76637bdf5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews the email for the selected audience: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"0784886be004f4d93d2eae376f586857811d80044c51078262ced2f6d0d1ee66"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the email HTML in a sandboxed frame: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e8989919df8218dd18aa534ff2cb7fc7be79328ac9783d073c581383b84870"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: previews the email for another newsletter: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"0909375905399c224c500db2f4432384ca8ba94126446fdc4c095b57df21ea66"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: preselects the post\u2019s own newsletter: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ecde22b0f317b25ba68326752ec017e051d8f49e65c9cacc2d181a1f972478"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the post\u2019s archived newsletter selected everywhere: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ca3a317e9d4d29163021b001802602c2558c9089da52c032c499aeb3b9cb2a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends a test email to the current user for the selected audience: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc9d14adedc414eb7d77c3f5bcc970c2643c06a36e92d6fea2d63d3e9ff2069"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends a test email to another address: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7286e6193e1959311eae70c35805639a1d662b4980c769fa2a8c15acc13f3e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reports a rejected test send: 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":"apps/admin/src/editor/preview/post-preview-modal.component.test.tsx"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"99a99d96fe34778f84b99184512d6f276ab77da8a442467d3a7398337592e517"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the calendar on the site timezone day the field shows (%s): 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"d899af26b36615d3fb1a8fcb025551409d75958c418d147650e99eb339963629"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot continue with Email only after clearing every recipient: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bd67c6e5e7ba1cf6775439b50e64e31b81f1fb7711dd649eab3720fd0724a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: gates the flow behind the TK reminder: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc98ca38a1f5c1e4c0d7bafb1788249ef72ba721829c67587ac1eea91cc2e675"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: warns about an ineffective public preview before opening the flow: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35c34f815fc499f1b3550e72ea0e48b8e4a07dc52d7fbe77c59cf2464254844"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the user on confirm when re-auth interrupts the publish: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"8737d87c57d9f4d9a3348dcd30fbaaa89e6abd447b8ff4b4b7a2c5e28754135f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: explains a collision instead of completing: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d68e34d5c559490d5e979acc2415eba84bb6a730c44a2622cc4d2099b058b03"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: recovers when the publish dispatcher rejects unexpectedly: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"66cc9de027bc1868b8c29c6ccd0bc365da161c1db10bad9934d7d27d91277200"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blocks the options step on a publishing limit and links the upgrade phrase: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ecefe70ac524fdfe7b262e82ce2047356d1a54ff86c80a60a424f36eff4334c"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): rechecks limit readiness when the mounted flow moves to another post: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca42a9eb59fa490b5ce12af26c4e416088d1b82c55d764eb85aae4a0539bdc1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: never claims an email-only send landed when it could not be confirmed: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":676}}}],"partialFingerprints":{"codehealthFindingId/v1":"c49c8c20841b19dca47c9195d271043af5ba3bc7586496534adbcf8808e6b320"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a validation failure in place: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb6ccc96186d653ecf59c864520214e50ca38c0f592aace721745c40c96a6e94"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says a dropped command is no longer publishable: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b38e7dc00ffbccce5e9110debfcfe1fe4da4503a75c30dd0ac49461a4d7f4a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says a superseded command is no longer publishable: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"8954fa435ae7d3ae193d52e1dae721d52e4ce68e25b786c5198314ed969460f2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reports a retry failure when the failed email has no id: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5ead5d6a35b5877840b54a62d044c7a28f3919d143c6a3b8233f66ada772894"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: describes an at-open failed email-only post as created, not published: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"f79165bb3335bac6ca50b70228f32c10cf20ac3a6ea74ee6086795702dfe09f6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: describes a historic %s segment without using the current default: 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":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":918}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb5365b3c7119adee6d3eea7f13d502a6eb6c8ff9a51a8972f9a835b883ba1e"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): names a since-archived newsletter a scheduled post was already sent to: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":1149}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d902cfdacd128d84591ab2b072a130e5c8f850b5657c9c4ba7f000a5690c46"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): describes the audience for a scheduled email that has not been sent yet: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"a53f4ce9df21ad18e287be46a806d401859c2d52fe6274c865618f17b96e5267"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): does not claim a scheduled email-only post will be published: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":1207}}}],"partialFingerprints":{"codehealthFindingId/v1":"b71398625bd1889d9c6d918b163ad3754981880f743c318ebb4572da68ccc2a8"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): does not count the current default newsletter for a missing persisted newsletter: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":1236}}}],"partialFingerprints":{"codehealthFindingId/v1":"c94d9b83ea2b9e36dcd302e9140efbb0d5cd07ddbf8cec592f28042531f45898"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): does not replace a missing persisted segment with the current site default: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":1265}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ce3c6ce75f72fb66a0157f8e90ad78f0196ab5cc6f9dc286be9917eb8edda0"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): does not claim that a failed published email was sent: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-flow.component.test.tsx"},"region":{"startLine":1293}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9fc7bea55c5a133e7078a1dac85cbce93382935825eb6934a092f3649f5a43"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens from the sidebar button and lists grouped results: 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":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b54632acd26df8cac33990c4be9d9cc37a3742ece11a420494fa2e945c98fef3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens from the shortcut after Ember has already handled the key: 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":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"3098dd61fb1bcc4fbe0642c304a63850a686bbfbc6405555763909bdb84edfe8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes on a click over the shortcut hint, which sits on the overlay: 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":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d12d9e64b68b53b6067dd34af065ecf05540edede791b542aba29eb51c8925"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: starts empty each time it opens: 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":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"c21b15577024e41d6475ba1ff89773d8d7ba8721880795a2a3deb945ea23f10b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says when nothing matches: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bc8213d27d9fd515b24b59c75c0f9f33783965d3bfbef6df295b5942ff7651"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens a tag in the React tag screen: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"e576bae1052920803e04216e2810daf89eb269e8c064c046530e4c2eeb225fe6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hands a post to the Ember editor: 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":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"35a87ba4e4858f6335149bb91c1d59fc5da00c2a2264842c0763996b4b5b4067"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hands a billing result to the billing app route: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/global-search/global-search.acceptance.test.tsx"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a57382c5cf033c135ca65982703ff654f7563225136cf3f44ea455da2283dc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders navigation without waiting for Labs config: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6cd8d79565e966371e333bf529cdba4517308e0edd3bcec64c8efde1b9f49d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders navigation when config cannot be loaded: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"71e8fca39951e180a99adb4e611a27bd4744ed1d0e3c654d97225af26a70198e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders navigation when accessibility JSON is malformed: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"84c8064c172e19d460a070f7e1941c83be36aa6291a2efb9d194edab4df9b87a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the navigation for the current user: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"055c8ed15f092de7877282697a4496c1ca77f42610d6fcf8415939ee09d8e635"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clicking a nav item navigates and updates the active state: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b68cc62c99da2f6043cb412fb2318fc565ed52873c303f837a4203e87c37c7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clicking Posts and Pages navigates to the Ember-owned lists: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f5a8973ce0b316b84400bb42141e1c25195bcc37532f5dd40eb43ffb6a578f1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the $label active state after leaving its Ember route: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"0736b880148dae7bfb915c24f4e96ae882bc7546cac86d12e4ffe27e27d3600b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the default post views and collapses them with the toggle: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"68c528c68bfd6629ebbef18a1e26c46a6b7dfab67ead4088d3b5169d370632a7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clicking a posts submenu item navigates to the filtered list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b9b05f2e6a607c37c224cf01e9f234211feb56c864dec4318242e6ffc110cbd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: navigates to settings from the sidebar footer and hides the shell nav: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"41e409218b16230c9ae54e2e883b931028ec1fb069216c720297c94fbe25cc5e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides the shell nav when a settings route is loaded directly: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f96b1f5fe62dd86c8b0ae43a760d7245f753c9eb70efa6f1887c882eb0c58be"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the user menu with profile, appearance and sign-out items: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe08c89ab420ffce9b5b5d7312117150b3e420d34f03fe751b94c557f060076"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: navigates to the profile settings from the user menu: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"e776d0daf81fac3cd0d2d1057c0a2f5d2bdd9f4d8b64a8fbb8673ef79813c55d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: signs out through the session API and surfaces a failed sign-out: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d868380af4e84ae8b4c004ae4a4db33100e5b0912d3815450a8047a5621cfbc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: switches the appearance and shows the current choice: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f4f27e73fcbd7c7ff64c88578c6d5a45d855ee02ea924171bce18a20275bbe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the unread notifications count on the Network nav item: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"f61ab72fde4b52decf1e09eb9b9cbfd2fc3a5ce777072b7267feb45f81c513ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not show a badge when there are no unread notifications: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"c79b1090c1222a7c2f790725419ce59fd5edd4792d873c3d0ccf45fdb75df19c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides the badge on the network route and restores it after navigating away: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d11c11a4f129759d316b78d5e155159b57afaab2831ee0378b4627aaa3bc7b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a banner when the active theme has errors: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"253be8b69c03d966974ac20fbfee877df4ee5cac63fbc312ac68480b25a0dbcf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows no banner when the active theme has no errors: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"50478ab2f8f784b0689440d2ade5f6ee89caceb01a9fc122ad42cce4941ecd24"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not show a banner for page-builder errors handled inline in design settings: 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":"apps/admin/src/layout/sidebar.acceptance.test.tsx"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"199e1b1201e991764399effd059b5d3260586fab03b54cfae99c13bdae5a9dc8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves the sidebar alone on the posts list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/layout/editor-sidebar.acceptance.test.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe38feaaae1fe01c0538abdca1b6aa2f2d2c5c55fb30dbb245cf0234561a1c7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renames a label inline: 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":"apps/admin/src/members/members-labels.acceptance.test.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"2739ee953f1070ae973d26656a6990a94256706b928c0e9fe9175859df79c82b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: deletes a label inline: 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":"apps/admin/src/members/members-labels.acceptance.test.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2cf126782238eb36d6690173bb824829d06910f97b9c6e53f7fb560d93485b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a saved member search without overlapping filter actions at %s px: 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":"apps/admin/src/members/members-header.acceptance.test.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe116871bb812435dd31652a4492d144a141b60ef3408a90b3e383de09d7db5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: serves the redesigned import when the flag is on: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-gate.acceptance.test.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d8abeae8272bdba2a5efddba7278afa28ea66b678301048226bd780761732d3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: serves the import as it shipped when the flag is off: 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":"apps/admin/src/members/import-members-gate.acceptance.test.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4010956e55c3e89cd0c087a4b1a3467db7f23a80c523eddd154de1e2611b2a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: serves the import as it shipped when only custom fields are on: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-gate.acceptance.test.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cad39e937b7d47b9dd98e48cc9b4836e2db0bb5fb143af8b58cf4d454ab36a5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: creates a custom field for an unmatched column and maps the column onto it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"399e9751d23c86ce8239b6988ae3b1abf1ec9ce16d2341866642056475a3fd95"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: marks a custom field a membership field already has the name of: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"1223b74e0b7473098ae6b281607fe01e404f5e945a193e642b750297a00ad539"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves a custom field no membership field is named like unmarked: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cb1ccaf6a0f1b41a29fdbae4870b1f296045ff70a3fce7cd842e5599ad4d5a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: searches the names on the rows rather than the columns behind them: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f306e2117e7e9a2d3d6842ed0c3650916082852f7c1522d52fa2f1fa8044955"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: puts the create form away when another picker is opened: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b34907fced71eded9b817df37ad554928934fd7a22e4c482ec784050c6eb17"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps its field when a column is deselected: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"8807fd209181385d34e380260ac8f8132b442777bd2eb4e7e7c6150ea3045783"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: creates a composite field and asks which part the column holds: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"accba890290e7c79999b78aae32b35d9f591914abc6fef55743402493dbf2807"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pins a name the site already uses to the name input: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d0358325c89a109a267c6d47defdd39a42d02ed1af73d5d88b66a18b99a1e14"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows why the site cannot take another field, and stops offering to retry: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f5e3115cc21a1dd8ca7e8e6327f402cae75cbbe977e5d4d01b6c25ce2aceff6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says the field exists when the response carries nothing to map onto: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa073f0c6753588b16e6e3f298dd5dff3048e1b9e6e6b1f695b83fa8e373fbfb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: names every column it is not importing rather than omitting it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"50802e19d34aa9a806991d4c3ae87815dcdebc534bc0a83f796644759726a60b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps a deselected column out when another column takes the field it held: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"55993ff20c66c0453213ca38c7b2108c71db6a29fda0309d5bdd8448b8aabe88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows every column the file has, not just the previewed row: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"21313aeb0e24e552ee45a6b75bfcbebc725592505d63c8df9e0ac1f6b8060920"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the result when the import completes: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5651261cb7667eb7aee472ba781a6fdb6073538389ea0e6830672540c7902f6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says the file was too large rather than blaming the data: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3b3617885354cd1f728008704baf96c22807097005851c9f02eeb76d9f0c6d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the host limit refusal and does not offer to try again: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"a58f6c153637e9ac8c87291e49693daf7314243658122c811b04335c50a344bc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows what the server refused about the data: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f965d9d1d82d519e545d2a078168cbbd4bfda698d9dc725443a7541b03a0f9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: imports with membership fields when custom fields cannot be loaded: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22e33c3e010ec7961b505ee3238a2c1f118eb57115fc02f4822953f59f9da1b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears a refusal when the column it named is answered by creating a field: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"38b5f145d9a4c1399f598f859d4a24d9de38900630e36d1c078b1869448d00f2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers membership and custom fields in one searchable list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"b135ba11befa0e763335501b90f7f50340374a5d37a78e5f24f76b293f1d09db"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers to add a field when the search matches none: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":685}}}],"partialFingerprints":{"codehealthFindingId/v1":"158e0a1695910f49126192940d55a9294fa066c71b256a0d4f17b96ca00074f8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes without asking when nothing has been changed: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"c67e0c865bb215419aefe18ac4e00ac74f68c6a0bddb2164afc859d98360a7a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: asks before discarding a mapping that has been changed: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":740}}}],"partialFingerprints":{"codehealthFindingId/v1":"a00a6277acb11ecaf2360c227d73c1cb4e3a77932868f9ebfaef25b1b7598d8d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: asks even when the dismissal lands before React has settled: 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":761}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f371a61b30a7437d674af24ef195a6eac3a42d99c5830af27e2364dcfa78104"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says no field matches a search rather than offering to make 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":"apps/admin/src/members/import-members-custom-fields.acceptance.test.tsx"},"region":{"startLine":791}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c47029ce2371f53b1f4beac715930e671cbd5855dda8d9bd1cffedf4049b5c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens a member from the global table, retains exclusions, and follows browser history: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"6564624fc61b4ed73912da1be7f65cbde871a3e0867a581dbf1ad460742a9c6a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: omits global email filters and respects disabled newsletters, comments and click tracking: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"a29371f36c8c95ce169ae24bdcf1272e5416979c661522c48f487878406e9f46"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows subscription revenue, one-time payment amounts, and newsletter names: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"665f496d342807ee9c1823addfd924255c535a3ece07434c0a817793224957b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a missing member state with a way back to global activity: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6a41e6166a89f34367658e2961afbbeeddde274e0142de3b0b0fac3bd688c6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears old rows while a changed filter is loading: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c1986945676a576aa2ae31290d849d4425a8285188bd625eb581f436f99c1ee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a request error and retries without losing the member filter: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5371f9559b45e64a5acaa8f9b9fd49a8ccb2385c17d1683b253a4e77caa9fca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows %s to browse activity: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb470d377752c46c06d46e5472221c4b7c4661fa833ad203fb3dd4958b645e5d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the stored email preview and fits the mobile device at desktop and narrow widths: 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":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"725096236d9b337601d8d29d837c3a39d19c8515ebe418999226cd5a6997e333"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the global filters reachable on a narrow screen: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/activity/member-activity.acceptance.test.tsx"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"871b9fff396e533bd2110045d68fff09ad94de0fcdcbad6df33e243d905cf64f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: guards leaving via the breadcrumb (react-router link) with unsaved edits: 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":"apps/admin/src/members/detail/member-detail-leave-guard.acceptance.test.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb45f513e916d346edca06927237fb4d0dbc1fcb8d9fedf9a331741a257a43b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: guards leaving via the sidebar (native hash anchor) with unsaved edits: 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":"apps/admin/src/members/detail/member-detail-leave-guard.acceptance.test.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"59ded2b7f7ec5a1be3859796c2fd147cc2a4ab32d8f54a88618ded85bfcc7728"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows a back navigation to an untracked history entry: 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":"apps/admin/src/members/detail/member-detail-leave-guard.acceptance.test.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3006d2c168affd4a6f792682ca944125ac39a72d911be0e53a792d713fb2e3c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the member\u2019s values as a read-only record, addresses as one line: 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":"apps/admin/src/members/detail/member-detail-custom-fields.acceptance.test.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"88004c0d31743cdfa8350df810ae5d2725072fcff889b3c83f0a32d13eec9c7f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: a dirty editor refuses casual dismissal; a pristine one closes freely: 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":"apps/admin/src/members/detail/member-detail-custom-fields.acceptance.test.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"b221b35ee16f9c94d99cecd605363b159bf618db96dee99de400ac49e6f27e02"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pins a server-side 422 to the field it names, inside the editor: 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":"apps/admin/src/members/detail/member-detail-custom-fields.acceptance.test.tsx"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8384913914af3baefe1494c3a0c260c9dd006e5f538df64720cda30b30f36d6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides the section when the site has no custom fields defined: 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":"apps/admin/src/members/detail/member-detail-custom-fields.acceptance.test.tsx"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"964f3b79c7ed18fd326f91266a0b48733c9a2916ebfbefdcf73cab52040bdff3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects active onboarding from Analytics: 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":"apps/admin/src/onboarding/onboarding.acceptance.test.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d6f2481880c40de6805c41af2f0d08742db2b981bf64975a166543814418f8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: preserves the Analytics subroute when redirecting: 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":"apps/admin/src/onboarding/onboarding.acceptance.test.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"83daee14330ca59116e7e2b476fd353e3dda77771dc7bbd9fcd997f06bd747f4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: build-audience marks complete and navigates to Members: 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":"apps/admin/src/onboarding/onboarding.acceptance.test.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e77da0154d82ab6386e756bdfe07f05d44bddddf8efeb94c89e4debb2215ba7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the share dialog and marks the share step complete: 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":"apps/admin/src/onboarding/onboarding.acceptance.test.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc80f1d5d6886b1cade539cf3e37d5fb7e36c2607a7046fca004a8245d496e6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows sending progress and withholds newsletter figures with the URL override: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"d312cd6684f17f544274786b40e7747c839d05e1b56f00f9d2d5c9ba477f2bfd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows only recipient counts until a sending estimate is available: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"10128c0fef72b25c0c94d6ca83ed7767e878730e2e6428e6c9f648f1fadabab2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves a failed send and its retry action into the banner: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3198596b4541b08bae7e4eeff547b5f0854552caa2e24a7d9f4ff995e3ed837"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: refreshes the failure reason and does not count prepared recipients as sent: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b594939072d56e927df91a816d2a3b6f7a205fd3fb8e204094732aa944e562"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the production analytics UI when the status endpoint is unavailable: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"6111ea74a4a486dcc99841275e2ee1b7cdf3d141d84f4aad0b538a193a166c9c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: recovers from a transient status error on focus: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"27bf6c07d79fe87386bded27e62b780d70ffedef87860975c19e5810c1afafa7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the post context when switching to the web tab: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"011f437d1c0a986415e89e68290f3da7adb2abaed8be19669aa3e262b84f112f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders every tab and zeroed sections for a post with no activity: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"be1d7e51b7c65325762bedf956491cdad82f2e80d77dab19efbab406c6912a05"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reaches the empty web traffic view through web performance view more: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"173e1565247964e1850440d3b65b9bbdc247b66df362f6f38977b8c779ee2897"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reaches the empty growth view through growth view more: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"24e13f178463de9452d25a961706ccdf2c6e5b6ca2877bbc9a9f318405096860"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides the growth tab and section when member source tracking is off: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"28eea56cef07515c2d75939ad37e1caed4c99911d7eed7283c6239d7c3bc872c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the seeded KPIs, locations and sources: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":724}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4fc82c794e2ba30d357293ac59b853b383e658555ef2f924a6cba3ac4504417"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the seeded member totals and top sources: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af89370d5179b44b490439cb63595a29590bc524fee94fdc13def9cefcd6428"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the zeroed members card and empty sources when nothing converted: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"72db55ea4e91a0e35cb9e1087c141e9f7f397b4512b501b26ae3abee8a9d342b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the seeded email performance: 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":"apps/admin/src/posts/analytics/post-analytics.acceptance.test.tsx"},"region":{"startLine":813}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f9411f7632394846dca1bb468550b454842ae9bcb84a2508717bd23ee2df28"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the React screen when the flag is on: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list.acceptance.test.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3561d40ca4513c31720e944ebde0d0c21dcf7f76e3dff781bb6f7180d8bc48"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers the primary create action: 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":"apps/admin/src/posts/list/posts-list.acceptance.test.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc728389776adc91f40e16ea5842a4d7a0672b467c9e5583d6591eb617028562"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: adds a second row rather than replacing the first: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"77abee4e0e7aea6d4f4ce3b3a26e316b23b78a628aef99b12bccee8337467179"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: deselects a row on a second cmd-click: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cf3772a15676d77b36a8f4220a1d2857a1789668393620aace80bf49b64afa9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: selects a range on shift-click: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe8a8377a61298e9bd2b44760222e9febbada39435cc08a597512596042d984"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: selects a backward range including the anchor: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fdef507bf24701473228acf03ab2628ca04a4070cbc57bed094d390b96325fb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: selects everything on Cmd\u002BA, including rows never loaded: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d2cf30745c0113b319e88baa4c15de0df3d2310e2ffd6ee4ee4cf136e44acd8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: selects everything on Cmd\u002BA when CapsLock reports an uppercase key: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"86b82cf9829972f313575bc8bcd08c801eda47cfb0430982849c387a3a58fccb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: lets a row be taken back out after Cmd\u002BA: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"476eac507360fc45f3fe783273730f67a8a3541255efcf457a9640fd7811abf0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the selection on Escape: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"877cbc609fc27a66ed75a60145d19aa4ce0009c833585298c5d944d2c7d2eafa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the selection on an unmodified click elsewhere: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"716d250640aab41e0f413d0a3ddb257453dda4960c16684b96f7796f2914d01c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not select when the trailing action button is cmd-clicked: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"c46e27a1213f2c7155c71536f7f73ac9a3d9250e62eb1387fad47bc80ca70ca4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot select a row at all: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"b70bd586a2430bf48c1ef95b173dd84247a97274928626b1e18f97ee8b90759a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot select everything with Cmd\u002BA: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc5c6891bfa8a101c49a2bae3ac212750b40aa2a60d7022d5063a16958137e99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: drops the selection when the filter changes: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d18177e3718cadac04e3b4067b0cdc6b25137327e53ccbbb1918cb1a9f9862f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: drops an inverted selection rather than re-bounding it to the new filter: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbce544a2e03c698164c57c72c76a6992044c172019bd46756cbf180ea543de7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: puts the list into select mode and takes it back out: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"05cc4d9be58b89bccab93544734f365909ee3dc63e75e3e13882f2903a4efcce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves select mode when the window loses focus: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"1680ae3103ee04fef0f211559ab5934ff9781842a9654bbcab6f04fad5d39931"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays out of select mode for roles that cannot select: 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":"apps/admin/src/posts/list/posts-list-selection.acceptance.test.tsx"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"458a3c15a0051e952c9496b8979ccf675c93f6fb18c96054f3204d9e0cc003c7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the title, byline, primary tag and status: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc6e7175a81101f844ae22c244a8a64bd729da5fd227f305437b6db7004ca019"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says a published post\u0027s newsletter failed: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"c04c965723f30c7bf3a55b316d57d4913f84de3604cab11683398c1d25aed521"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not say \u0027Sent\u0027 for an email-only post that failed: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"982d9b2747d83e43c1da579a4209a8ede59c835f1a0e841c4e7dc8aa12959a37"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: links a row to the editor: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3e34f06ca09759ff2a834920d356599b85ef4b2cad3161b94740de70ac6d2f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: links a published post out to the site instead of the editor: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b4ecbf65b61fc9265fb8001e2f70d4d93993a5d5af09cfb08de672a83b2f80"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: still links an email-only post to the editor: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"6753be45533b31e2c6067ed88e062def2f4c8b7dda014ffa4dcd1eae5195c016"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: links a draft to the editor: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"8269b20d1baa039d209a9570176734bfa5797d1472bb0d3f1e8a00fff560c9cd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: links a page row to the page editor: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3cdc52ffa8ff797951ed8dde758fe9fef9f19ce5c1d3b2a040fc5c56b28637e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders page metrics without linking to post analytics: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"0239c532ff66aa449718b83d4fe0e07807d91125ea793cbd0d41389bee16d324"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows preparing progress and hides only email metrics: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b03918ec5e4bc02a3437a38bd2c017c17960c9fe0bfb6feb63598f392f0d86f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows coarse sending copy through a transient error and recovers on focus: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7366bc6a1a4d16130bd907bf2ca02e10c2dea3d8de1e2c23f1312ddb667fb87"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: refreshes the post and restores settled copy and metrics after sending: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c5173bd5c22ca2e62a8378878fdfe63a5ace5efb7e83ce00d733fd50ab54d0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: uses the existing failure state when polling reports a failure: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d18b143168896000f3e2e309f52da2c682eaae15abdae23702b222e11186037"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the existing row when the status endpoint is unavailable: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbd825cea5b098833245484b359082a0089a0f6ad19f809bed3eceba4ac93a7c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: polls every concurrently active email independently: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"e310ccc9a980cb627899518a0750b3d79015f270862bf87ddd3217293542c7eb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not request status when the sending UI flag is off: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a24b35c3a31dab441130a3e183d5922dc021d1111416890707299f7d00f8ebb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invites you to write when there is nothing at all: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f0af2a0958206c1a15198df7615b7f714d8aca86b9fd0db0b82c36ed0aea545"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: uses the page wording on the pages screen: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7251c1f2c38b599be0dea97dc15bc0e5322d34448cd1caa2c52f6db98eebe30"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers a way back when a filter matched nothing: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fce2f052f97e11754db4fc4dbbadbf185ca2cfcd52de94eb0324c8beca5dd88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the filters but keeps the sort when taking that way back: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf167cf682fd59b2a4cf8f1c5ba00ace8dc02345ed8174b60247da5e7eb46131"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: treats a sort-only URL as unfiltered: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"207edee63ab34e273295e9fd4c8eeff29c93508f419ff04a016e0cfc100f2ca5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the editor for an author: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f508ea9947042d1fa6aeb0faf717fe8f42b4d290e6d0ef76c1b06071930ae71"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: links a contributor out to the live post: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aae84eb2a33218f1baa8f7c3922acbbae7400cf4e5d61b158ff64d615e803a4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: goes to the editor on a page, which has no analytics screen: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef03b2fac05a3ce84bf4e04dc34c6994ba0de82908ece83aae19dbf1da0e4ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the newsletter breakdown on hovering a metric: 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":"apps/admin/src/posts/list/posts-list-rows.acceptance.test.tsx"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"4063590bc203b834a1d228dbc613912905e5bb2d6b62abcafab4564ad3b1d8f0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hydrates a chip from the URL: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ea0c77e6a39dbda1509b6c98b6c3feda90ca998f06feef119fc6f19f3cd9535"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves a tag slug in the URL to its name: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"16792ec188a0f099d46ceb6a7c2c5f67dec4810038e23c06b2b4c5666c85414d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves an author slug in the URL to their name: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3139919b854b2119ccd1b547c0a46939c591740e50a8191d7f0ed287ae35097f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows an unknown-value chip rather than an empty 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dd550da9528c8314055c9591a6be6da84eba74210b0269775e4157a71320a52"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows an unknown-value chip for an unrecognised type: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"587fb1617e408c99d2519de1271b8235edda54a1bb361bba2be247f55c6c34c2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the default when no order is set: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb1e4b4d72838c5cf8f9d547cd0cda0646eba974883b227e4155bf6164e94b8d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: names the order from the URL: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"32763dd16fca550dc820df5b96ac23ce6f42ea39db097f9cb99d94d8b38181ea"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: writes the chosen order to the URL: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ba64c401d7b1d398d7ffc258584af528841a780f97b1659bef626594bcc71f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: drops the param when returning to the default: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39571f5d3fdeaf06a48bdd718cee740ffa220597f99546e849b38478e4729a7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves the filters alone when the sort changes: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8aab0ab279c8464cd63646e6a98ee2f3c30d2d5d2f1c299db9e35406b68a316"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers all four to an administrator: 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":"apps/admin/src/posts/list/posts-list-filters.acceptance.test.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea8b6bfa7b73d4f4ccdfbc20ca2e2d970e5a4370d84828098007b3746773377"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens on right-click: 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":"apps/admin/src/posts/list/posts-list-context-menu.acceptance.test.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"731b87de9820ee7e68453e7f4f564e09c973297b398aa598604fe6ab32af7b75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers actions for the right-clicked row when nothing is selected: 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":"apps/admin/src/posts/list/posts-list-context-menu.acceptance.test.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"7adb7f290d425d19e0476768a60111dfdf9e2d30a4b99a627adc85ac28e5906b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: copies the public permalink for a published post: 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":"apps/admin/src/posts/list/posts-list-context-menu.acceptance.test.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1eb9f4cfa639cf8a52104a6ae6ccd01e7a8c8c1ae2db023a2f6cf2c95dda324"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers it for a gated published post: 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":"apps/admin/src/posts/list/posts-list-context-menu.acceptance.test.tsx"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"e631207919500946adc24bc325fb494f8c9d36441e23feed89e8853c120a70e7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the gift-link modal: 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":"apps/admin/src/posts/list/posts-list-context-menu.acceptance.test.tsx"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"060ca43734fa54529fd9737a85be251c3fd43b5b2de2fa48b658713b0302cc75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: celebrates a post the editor just published: 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":"apps/admin/src/posts/list/posts-list-celebration.acceptance.test.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"646a2398386ca86cdf2f63dbdd113463c7fe3cab64b170fa49131f44015d5fd7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: celebrates a page the editor just published: 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":"apps/admin/src/posts/list/posts-list-celebration.acceptance.test.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"9351748beee617a0d142fbff65364a34945d0eb4cfff9b7de2acf22a996ff915"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says All set! for a scheduled post rather than celebrating a publish: 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":"apps/admin/src/posts/list/posts-list-celebration.acceptance.test.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"d680e75d3c8e63d6b589524629be64fb85eeff8e785f84e70a5322270e8d99db"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not offer the tags a post already has: 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":"apps/admin/src/posts/list/posts-list-bulk-actions.acceptance.test.tsx"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde81053dc0db3b0d07ce55d1b586f8341500c8e8b34208c38cdc7b018bf90f0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: refetches tags after creating 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":"apps/admin/src/posts/list/posts-list-bulk-actions.acceptance.test.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"801731b39a2f8939d8ceb1000f93cda99995243f5701568b28576fcd8c19fd10"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the dialog open on Escape once a tag is picked: 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":"apps/admin/src/posts/list/posts-list-bulk-actions.acceptance.test.tsx"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"e831bcc2556dba9e1b8b1251d951d4e1909a1a50dc427ea7cc82eca8eec9f7a0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps a typed term through Escape: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/list/posts-list-bulk-actions.acceptance.test.tsx"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"54f7a192aa616978753091d7d44ab7fbaaa8fa1f1104dab713b2193c2cbeb418"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes on Escape while the field is still empty: 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":"apps/admin/src/posts/list/posts-list-bulk-actions.acceptance.test.tsx"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75d4a39e55b2ed649447e579ec0491b6de81e050313041c24d1764a1fa6fb74"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides and shows groups based on the search term: 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":"apps/admin/src/settings/search.acceptance.test.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b302b65872dbc98b7b93b2d7c161b269fdd0f973239db4c382fc724f14662f68"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the empty-search state without hiding the settings groups: 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":"apps/admin/src/settings/search.acceptance.test.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"8162196480ad721df0a67b79cf404eb88d52c1e8f24eac62804eb50510758cfc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the search in place when Escape blurs it and focuses it again with slash: 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":"apps/admin/src/settings/search.acceptance.test.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e706cb5e619fce5611f719679dd4fe5d82a9bde120db3b23cae2c6b51d560d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the search when navigating from a matching sidebar item: 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":"apps/admin/src/settings/search.acceptance.test.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"46fa46e35467f369d972e9a1bd6c5a88a4173f79030b4e25d136b6cfa29a92f7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens a modal from a direct route: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/routing.acceptance.test.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b10b19be19170f45a442667ebb0c9d713d49432b849b04f0fbdc16fa88a9a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: updates the route when opening a modal from a settings group: 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":"apps/admin/src/settings/routing.acceptance.test.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee1913fb326ea344263a1d5feec158fec47c46449d227afca1d620a00ce0d3a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects the retired lock-site route to access settings: 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":"apps/admin/src/settings/routing.acceptance.test.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6f5c740812905f070797c55b810c8ef4e661c715ea35014e57c0e1116dc7228"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the offers modal from the growth settings section: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"aca16f962664d9320ebe4dd270388b072e739aa2d4b2fa3cc9054f8ae4549276"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the add-offer modal from the offers list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd3ac1af0cc1404083220d856bbc8617f2f5a50f60f820f457512ca98acd298"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add a new offer: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d79204dcce2be50532b2b0522cb6f61c1aeb74f7eba3819d2130decb4427c2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: errors if required fields are missing: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"4084ef7fa5fd37d9e23adabb8fb785527e552ed56a77836cea95251c6a19f1c6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: errors if the offer code is already taken: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"909c0e769cc606603dcb0e8a4bcd9bc3493952e00f9a8793ef30d66a4d9962cb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows validation errors when publishing an empty offer: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6b1012ad1a06716066f59aeb3a81d7b3a65d98dfba9d4901b7d42f797d1f43"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can view active offers: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c2ae6175a372575b809a36140ce3d4a442ced08f3178e75b062a20f188c768b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can view archived offers: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"819156719aa803b0245a07b026e91b3c6196197efc6038dae342e32722d4957e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: supports updating an offer: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e540debbdd4169dec2d83da3de8c38da210b71d3e5eca809b2f7e3ead2996ef"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders existing retention offers in edit mode: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"4165e06771498dbf6a29c72cc0a426ff19b0377b3bc16dd6f122a11ff277bda5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows validation errors for invalid retention values on save: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"416a08d1aa4e64164e8fefb61fd40a5a15906c44452239b14527e96e0cc1ac8c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a save error toast when a retention save fails: 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":"apps/admin/src/settings/offers.acceptance.test.tsx"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36efb24cddba1dddd8b026f2daff8e0e1847b0434bf81fb16f145c4d7c403cc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes an open dialog with the browser back button: 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":"apps/admin/src/settings/navigation-history.acceptance.test.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f45ccba19628df6ef53d8dc6517ee948bf196d2335aa26e351e8c186eeb1e3f6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: confirms before the back button closes a dirty dialog when settings was entered from the sidebar: 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":"apps/admin/src/settings/navigation-history.acceptance.test.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"a33c60e3d255a8d2561d8440716149b32bd023936788b5d14c64460efc86500e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns to settings with the back button after exiting: 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":"apps/admin/src/settings/navigation-history.acceptance.test.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"07cd78602a845a374c9db0ca6d2a42ca15c365280e9ea7d130f182b95400f1ec"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the individual export buttons without the selfServeArchives flag: 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":"apps/admin/src/settings/advanced/migration-tools-export.acceptance.test.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2f8b590677fedc9a036a5dc34b159ac08073db77d711178250ca6dc7dfc56a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns to the selection and surfaces the error when the download fails: 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":"apps/admin/src/settings/advanced/migration-tools-export.acceptance.test.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"774100297976099dad362860bfb59b138e7e2329b67bf0371ba7f2d79713df52"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers media and email delivery when an archive host is configured: 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":"apps/admin/src/settings/advanced/migration-tools-export.acceptance.test.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b4c4c7134318ccdb1d99eba20f3cc081e0acb32e34b495a9835ce7bbce4a3bc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the dialog open while the export request is in flight: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/migration-tools-export.acceptance.test.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4809bb1045e067d6c58c0c45edfca069b0f08c026a8f7e5ada1cd1717c24d00"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends the selected components to the exports endpoint: 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":"apps/admin/src/settings/advanced/migration-tools-export.acceptance.test.tsx"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"e47bd0153a9c390b5d2c381207e775cbd1a9d86f7bcbf30a9a42ae2df66efa3e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays on the selection and surfaces an error when the export request fails: 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":"apps/admin/src/settings/advanced/migration-tools-export.acceptance.test.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d2d91057367cffd1784fecd9663a39617b2f13da701c680e7b6b3cf687f5a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blocks custom integration creation when the host limit is active: 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":"apps/admin/src/settings/advanced/integrations.acceptance.test.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"1326ec83cf207a81cc2e7473e26d270b2d515809eae4dc73c4b8d821f8236d83"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the Transistor integration in the built-in list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations.acceptance.test.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"c825c4096e1995ba38d0966c1f0b0419d8797168550acc372ba89ea95f9cbb79"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resets authentication after confirmation: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/advanced.acceptance.test.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f6f0c75393e7c961e8e53e6d7921c7899f64c5e578e1d95515dee05fdeee053"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resets all gift links and reports the affected count: 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":"apps/admin/src/settings/advanced/advanced.acceptance.test.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c92c5f51f7bf9bd529a22da9ef308105b4694eda2306823f30f9e8c6acc62a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: downloads the content and settings export: 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":"apps/admin/src/settings/advanced/advanced.acceptance.test.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6fcf7ec2d13db9c90ca4162aea6b7d1aa973ac446c31b09c3dea758a27d2357"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hydrates the staff filter from a history route: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/advanced.acceptance.test.tsx"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"219d3b5fb7de7bb745d37874e2f094acc45628e82360bcb4db416fb44b44adbb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hydrates an existing specific segment: 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":"apps/admin/src/settings/email/default-recipients.acceptance.test.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e53c79c37703b7a83ace3cece69d4ab295fb86410c6bd5a4013dc34d53233fc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restores the saved segment when cancelling changes: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email/default-recipients.acceptance.test.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"d238b99ccb584278356a4ce0c4164d0cc6093f8e7b536f45f6ea367e6e0ba3fc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restores the title and description on cancel: 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":"apps/admin/src/settings/general/title-and-description.acceptance.test.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"82e5038a8de7d264307aa031cc29d099f911a3432b15102746e625bf156b9a6e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows email 2FA controls to %ss: 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":"apps/admin/src/settings/general/staff-security.acceptance.test.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"18731b4b1586340e46b5ccab221d1859a64a152eddfd961c0931509d73506442"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects my-profile to the current user\u0027s own staff profile: 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":"apps/admin/src/settings/general/staff-profile.acceptance.test.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"94728280bdac07afef5ee42f97ed1f3e34365dc90151532dde457919cf8f8f5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blocks un-suspending when the staff plan limit is reached: 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":"apps/admin/src/settings/general/staff-actions.acceptance.test.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf193fd1bb8ce35d4001bf38cb0ec11737a3d1b7e6d73e114dbffc93a5a0ca9d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows all new platforms when any migrated key is present: 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":"apps/admin/src/settings/general/social-accounts.acceptance.test.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a0e48e3311217518110a294bafeaddeccce079a1ad6bd84c1b6b4f1eea59fb2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restores values on cancel: 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":"apps/admin/src/settings/general/social-accounts.acceptance.test.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"81af71b507890aaefc09c0368ee2481038a2d9df8f1a65c68df0849ab1693526"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: normalizes and validates social URLs: 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":"apps/admin/src/settings/general/social-accounts.acceptance.test.tsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"0da2e6b0852d18fa7897a19979aff37e27587e468d6232bf065cf5eafdb12ccd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps invalid input after a valid value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/social-accounts.acceptance.test.tsx"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eca3858b04bb45e986aa9b003a792737c547f2c3bb1aed5c8436db4b11976a7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not rewrite a Mastodon handle while typing: 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":"apps/admin/src/settings/general/social-accounts.acceptance.test.tsx"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb032e397015baaca89016be104bd32df50376d03bc7f50ee4cecad7cfd3fc4c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows a federated Mastodon URL: 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":"apps/admin/src/settings/general/social-accounts.acceptance.test.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ad8ec4fc4edb708fc4311109cd36ba04332b72e9ce34f6bfbafc839a095d22a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: switches back from a custom input to the dropdown: 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":"apps/admin/src/settings/general/publication-language.acceptance.test.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"080c63d775a0307bcff5ea0910aca9050eb53e563303e495a0aa6f7f9b61e3eb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restores the language dropdown when cancelling Other: 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":"apps/admin/src/settings/general/publication-language.acceptance.test.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c14b3ff39b2ddd451b5696686a2911dc44b911deba80d2fcb7cd55f4b98fa9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: displays a stored custom locale: 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":"apps/admin/src/settings/general/publication-language.acceptance.test.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c92aba11b8fe047d20b52ad15f98ac96180a755f8b4df296b63e04ad7539b55"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the suggested amount and shareable link when Stripe is enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/tips-and-donations.acceptance.test.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f866b0890cac4d1956401d61cc7ff66da8b1b87175582f9c4f39cdfaff89966"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: accepts a valid suggested amount from $source: 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":"apps/admin/src/settings/growth/tips-and-donations.acceptance.test.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"114fdb91736521276bb82787abec2dc00e74b1626bd382d54ad15245fc495fb7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a URL that is already recommended: 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":"apps/admin/src/settings/growth/recommendations.acceptance.test.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"7618675e3454586cec9a482b14989e02eccbe775543699745020a9d1d0aee6d8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: disables the toggle when the feature is disabled by config: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/network.acceptance.test.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"f50fcae79efdc0238987fd6705c52dc64fff9a2450d9976c57bc2d3be000ae4f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: disables the toggle when the site is private: 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":"apps/admin/src/settings/growth/network.acceptance.test.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a003182461afdeeeb5bf475ef9c3facff1741a8f11dba7f38bbc29e8e16d084"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders a preview with the member count: 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":"apps/admin/src/settings/growth/explore.acceptance.test.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccffe49b1e87f4b037371fe067692c2eceb9b734dda09dcdf6be07f022f82096"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can send a testimonial: 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":"apps/admin/src/settings/growth/explore.acceptance.test.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"998cf49b9205348f6ee560b1c1ca142e26e52fae36fdaad8f5af15f94ce527ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows agent payment controls when the lab is on and the backend has deployed them: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers.acceptance.test.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3169464335cbe0e7e8e68b10bf479071ca473fea129fd70d34fbd3e2aff0690"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a refused destination against the picker that named it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers-checkout.acceptance.test.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60f5a13a874397b0a5fb81490abd3772ecd3ce5cc7a2443acc43c1d3acbb35c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the free tier option when Stripe is disconnected: 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":"apps/admin/src/settings/membership/portal.acceptance.test.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"74053eca5e11e15ade2a3cc4c3bcd461e32296f9076db83fb73710b913b44f68"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the preview and settings tabs synchronized: 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":"apps/admin/src/settings/membership/portal.acceptance.test.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"e121dc8e8d2a8ce95a6e513062f0eaf23f4f91f830423185fed8f1f6c83353aa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the legacy welcome-email section and navigation when automations are off: 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":"apps/admin/src/settings/membership/membership-settings.acceptance.test.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46295c0cb5bc9091da6842161b3194d858cf239a869925548c1e03f9fd1ed96"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to newsletter sender details when automated overrides are blank: 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":"apps/admin/src/settings/membership/member-welcome-emails.acceptance.test.tsx"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"316d33d233d7de260a17e65658d96964206faa1589efc406c4b0eb30dab6b5f3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: uses an explicit newsletter reply-to address as the reply-to placeholder: 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":"apps/admin/src/settings/membership/member-welcome-emails.acceptance.test.tsx"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce3719fc1baf9522d0913d8f1e94669b671b705a05b9a2be795ce183c6564f69"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays visible when the host sets the limit but leaves it enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/custom-fields.acceptance.test.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"89dc0e430f18758952fd31c9725d0884109278016490c4a8cce0a8bf34ef528d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: warns that opening a closed field discloses what is already in it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/custom-fields.acceptance.test.tsx"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84adb1f3be2ea25e3b17006a2f6d1346292916cd7e3f5be6f6f1ea186253b78"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: says how many members will see a field opened to them, and where: 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":"apps/admin/src/settings/membership/custom-fields.acceptance.test.tsx"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b87d0790bf462be5615f101f384d322647dac89a817ef30f9629f0bcee0d23"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: marks a field open to members in the list, but not once archived: 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":"apps/admin/src/settings/membership/custom-fields.acceptance.test.tsx"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20b958c484d6e997d1658be5296b024424a892c10aabb0dcbd705adddb2bf7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not offer the access control on an archived field: 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":"apps/admin/src/settings/membership/custom-fields.acceptance.test.tsx"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"f168e45f85f8efc1a3d7d9f07a9676b8e03a853d9b57acad3b1d0401d9c83b0d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: warns when reactivating a field that is open to members: 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":"apps/admin/src/settings/membership/custom-fields.acceptance.test.tsx"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"62591ca7b48b7e58e6be7795c24bef9f5c4ada04f926e1f94fa9bd4b9d58b9ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: honors a read-only email-click tracking setting: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/analytics.acceptance.test.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cfcbd66ef35c3aa65350976e99be28b399eda8fe7d194e10e4362f6da7ad458"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the default pre-launch banner copy when public site access is disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/access.acceptance.test.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec92d25735bb81464c668f179a3602772574ea216e3f2712cb2bbe8409198c9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: surfaces server-side archive limit details: 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":"apps/admin/src/settings/site/theme.acceptance.test.tsx"},"region":{"startLine":697}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ed4b7f2a6c24b140b6915b9dc130cb2d46984b89256ad0045034270c8e7ed6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to the generic API error for malformed archive limit details: 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":"apps/admin/src/settings/site/theme.acceptance.test.tsx"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"42acd3bd4b4481bf3d1a0f4577c11be86896b6c2d2134572c8536dc15ec9befe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: requires built-in themes to be saved under a valid new name: 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":"apps/admin/src/settings/site/theme.acceptance.test.tsx"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b362ced1244bc10eae93794fd5594d4aeb410b9ef39ae0c3f37870ac35ea9da"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: saves a built-in theme under a valid new name: 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":"apps/admin/src/settings/site/theme.acceptance.test.tsx"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed6cf3dce5d52ec2afc73664762726c83458ebd8258ae38f9e6cd42606199c09"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: only honours allowlisted editor return routes: 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":"apps/admin/src/settings/site/theme.acceptance.test.tsx"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1a77cedd8b90cdf96c0f11cf939e63b9811e58c69d08dc264224760826c3f31"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows legacy theme font settings only when custom fonts are unsupported: 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":"apps/admin/src/settings/site/design.acceptance.test.tsx"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f2b808a19598cdbd6a39859f902536a3f3a9ab67dbf9758afca2a134c9505ee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: lists public tags with description and posts count: 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":"apps/admin/src/tags/tags.acceptance.test.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"2af82e01b57957f6a6bef830e430e0926caf537db8143e49b8eae5549fa35350"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the empty state with a call to action when there are no tags: 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":"apps/admin/src/tags/tags.acceptance.test.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"703f77ded8209c22bd12e91a4f696446eb521e55735e3de6aa611970af8a6f94"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: navigates to the new tag editor from the header button: 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":"apps/admin/src/tags/tags.acceptance.test.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3354cfe27348aabc73ef7085bdbc14f75ad98b08a4ba0c265797b75be13344e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the seeded tag: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"34249f119086ea66ab9caf6b502679d1adbc899ca16f062ea35bca982c256a40"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows an internal badge after the name for internal tags: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2c3861b68e986f09558e98f8c4c72bdf0a380a166f8a0fd952dc8b7d6abf95b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens code injection when only the footer contains code: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc4ab05af2a3f776330905fc83325abf785f54a9a7ea28a78a1470e46fa5d67"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps CodeMirror autocomplete visible in the code injection accordion: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b230966671bb03d5effcb8bf9244cf58368f7b45400de94386a1711b3e8c441"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects to billing during a force upgrade: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b4506d6c7f40818434b83074c4df0556ef43d9aa0917aaeaeb7a3e7ade5ccc6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers Unsplash for an empty tag image: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bb2e35ff8aba65d454a267b3aba896c723c4ca947018e586a454f7c4cf900d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: guards edits made after a same-slug save: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"0107bfd8b6ef0271277aef824427cca526f58ea732d37b983b81535997762627"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects image formats that the legacy uploader does not support: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"52e1e71bb8eb989d93e0ff0f871894c30db37b4ba885baed14328f2e651fe822"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the legacy message when an image exceeds the server limit: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ca16ef2b289c8eade56265182eee31cbe671a0137a144098236913c3c66ae2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears save state when navigating to another tag: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39be30dcdebe909a79a40fa7c26c7c152f141f1cbb520d0ff085c3e382aa01a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not allow deletion while a tag save is pending: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"19d326075aefb9850764715a192d90cc4e4417aa8b3232dba7de27d840b11f5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: waits for a pending save before continuing navigation: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3da975782ddc21d086b87191665971ab1c3fbeabf2899c27e90c02bcb2b9495"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the requested destination when a pending create resolves: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd7f76a6f39737e88c6d38f7cda21caaab39fc869003c226468fc2b2202609a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the corrective API context when saving fails validation: 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":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"182dad4d5073d62cb53b7f5c56efe5050b3678f6ac51ab8611e21198d1986b3b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: uses the current draft name in the delete confirmation: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d0c1650583027781f337924f5e08e8ceb6515fd6f065f4b1025d136b1ae8d61"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the not-found page when the tag does not exist: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"7218a94cf6d13ddaa535a8fc2011685a445369a413c041b43efeeaeb08cc4de4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the Tags nav item active on the new tag route: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e3a5b9e20e05928fa87bd8dfd563c36d8815bd6454f0593dab3fc65560b6c4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the Tags nav item active while editing a tag from the list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail.acceptance.test.tsx"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e42bea76766a8e108feda1a041f5642241f86339f93f1ba72d9a72a32db3b1a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows no banner when the changelog feed is empty: 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":"apps/admin/src/whats-new/whats-new.acceptance.test.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"898bbc37c0a7e89a846a8296d555c91c18329d772f47d42316e459b90717a96e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the banner when an entry is newer than the user\u0027s last seen date: 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":"apps/admin/src/whats-new/whats-new.acceptance.test.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"645521489c72eb2487d79eabdf7a7efcadef6484e33098c0a71cd6d7b2789459"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: dismissing the banner persists the entry\u0027s date as last seen: 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":"apps/admin/src/whats-new/whats-new.acceptance.test.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"0001eaaf1ac6acb3de98b02735bed13fec493944704df9cdf025dca0d6f0a709"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows badges when an entry is newer than the user\u0027s last seen date: 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":"apps/admin/src/whats-new/whats-new.acceptance.test.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"d08f640bad811a6d78db984f64d82f478f79c65e884b8d8fffcf6124038f73c8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows no banner or badges for entries from before the user joined: 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":"apps/admin/src/whats-new/whats-new.acceptance.test.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbbf7fc0c0713e0860787f1ebec5a37df0ffeb687883791a95d66482ff6264c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the banner and badges when the What\u0027s new modal is opened: 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":"apps/admin/src/whats-new/whats-new.acceptance.test.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec07b4d5a861dcd2b143e061361acd840cfc868b3fd4a7c55cc4ffbd7900a839"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can use C to focus editor: 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":"apps/comments-ui/test/e2e/editor.test.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6617a8ebe491d4f9237c4f5d2ea57e7c82edc456e641597a86ec6569c35cbab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders blank avator if member is deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/test/unit/components/content/avatar.test.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d71576d6ea710503b8af668f82b5892b0b613d485c6d4749fb61883e3ea3f24"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes search modal with Escape key: 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":"apps/ember-admin/tests/acceptance/search-test.js"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"68c6cdc0d3acefa51268a54fbb2845ee08f37b57c45fc36d8d8b54ba14bc94c5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes search modal when clicking outside: 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":"apps/ember-admin/tests/acceptance/search-test.js"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa04dc4d7c239ec336948db865d2e863fcc794173ee06e36f84d6a525bfd0e71"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes search modal with Escape key: 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":"apps/ember-admin/tests/acceptance/search-test.js"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a585db12b8e16644b764a3a3c0fb264c775e56d8de8df85c4c752446aa06d37"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes search modal when clicking outside: 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":"apps/ember-admin/tests/acceptance/search-test.js"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e7fded422d9a75204225b9a084c46839d343e9118bb26e42ce79f7053512e1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can handle many tags in PSM tags input: 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":"apps/ember-admin/tests/acceptance/editor-test.js"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff7fce53932c2b57d5c85f59133351fc6ac411967190778e769641d711a7f3d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can publish with members disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/acceptance/editor/publish-flow-test.js"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2bc52b008bc9369bb23ea60410d6e1bbffeb27a1f061286dfd2bf7b469a9e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can publish with newsletters disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/acceptance/editor/publish-flow-test.js"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"834a7cdc3783c6619fe88705674cf36bb5f861608f5c6744174a10c934d2f62c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows spinner whilst running: 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":"apps/ember-admin/tests/integration/components/gh-task-button-test.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"61f07dccb00e5ad90db247ba997e28cacb01609f5c82c77a2c808da5d67bda58"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows idle on canceled response: 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":"apps/ember-admin/tests/integration/components/gh-task-button-test.js"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d794a4fda0686383a02714a439352814e605b411d6c3feb7ef88ee5308ea58f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: uses server-side search for labels when not all loaded: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/integration/components/gh-members-recipient-select-test.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"647260d6a350ef88447ae3db5a50b14e228b2cb06df6485258fcd9ce89823271"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is using correct provider: 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":"apps/ember-admin/tests/integration/services/search-test.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"02cef42bb9bc24bccd7e72e86ad87a7d950b7948f66830701405d468e7b576db"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns a resolving promise: 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":"apps/ember-admin/tests/unit/authenticators/cookie-test.js"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"55417461099bc19f016e6ef8a6e17f9f50c51452fd5ee34ae413ab5f3d637a28"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: editing the member name - persists to the server: 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":"e2e/tests/admin/members/member-detail.test.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8486a2c914e20826967726ee438f57dffe4fe43b3af928a7a6c9ef27601c581"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cancelling a subscription - asks the server to cancel at period end: 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":"e2e/tests/admin/members/member-detail.test.ts"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a43d029e9d263c4d652de254dd06e8f20aa2445fe6484bc8dab1e34a30c1fd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: continuing a cancelled subscription - asks the server to resume it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/tests/admin/members/member-detail.test.ts"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0220d291b604d19b75010383aa83056aeb8f7d2470acf6999312a83d85ceabb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6701818a682394da82700e54837e7964a0784d73dba06c0cb6fc64a195e49f2c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Fails nicely when adding a duplicate webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"1408b62cfaf56533c173dd987fe8531c3838bb5cd34ea11f7217af0eedb2d7e4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Fails nicely when creating an orphaned webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbff8510e0b5fa6f35a7bae95ac826ed878a5e4156aed3040f07a565bc20cf9c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit a webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"764453472280ba8beb6ee33806c276ea4bb5509434c7b444bc36aa528f5a75f9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot edit a non-existent webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bcb85bc03c39e6184f83c9481ef4024b302a30ac2651d84badf83e30827bfa7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can delete a webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"05eab0705035cca8bc6eaaea3272482b436ba7592935e3f2388cc1767c86dda6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot delete a non-existent webhook: 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":"ghost/core/test/e2e-api/admin/webhooks.test.js"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"04a11e1b1fa195d30c14aa054284bc79366f80beade3ed6fd7681c82c3934b3d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can transfer ownership to admin user: 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":"ghost/core/test/e2e-api/admin/users.test.js"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"a090b43c8d5dfb9af1733170561fb77f311e8673e012a39be2bbbb9b80ae82f8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can\u0027t read another user\u0027s Personal Token: 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":"ghost/core/test/e2e-api/admin/users.test.js"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7408f392ceccbc5a5e946314120fab3d62efe093934c4bb7464557a6d9950b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot fetch the tinybird-token endpoint: 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":"ghost/core/test/e2e-api/admin/tinybird.test.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"818a8fb9a68e91030b9d6bc502d29454c8d2a4d0a5c3272b75165a9c329efa99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot get a Tinybird JWT token: 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":"ghost/core/test/e2e-api/admin/tinybird.test.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89411a8cd7ef988b7f478ee411a2193b41948b818f8ecb4048ff2c7c7a2f948"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse Tiers: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"627db84fac79cc5aa44bdc5f9d4395491c5c3a09a02b041c4fdeba1988af4d9e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when price is non-integer: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"852d980ff84a9ae010bda6d9357db65aaae25c4b859012e17c12428313553cb5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when price is negative: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc495cb7dcf5917005fa197facf82a15882f3477b10a8d156a7c0f120dfdb2d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when price is too large: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e6942fb711d74eed28efab7eb868d1522f9a88ca02a9fef728677461f0d27c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read Tiers: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b01b2ca0222ccc8e73fe32ca6122317ba0a3b8ea7ee0e1fdf8d210759317fc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit tier properties and relations: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"535c6e993a8a8d26ffc6faadc75c96324c264c37a067ac60cd76f1a73f3329bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a new tier: 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":"ghost/core/test/e2e-api/admin/tiers.test.js"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"1584a1cbf0010b4909941078291d39005effc91d072e3c3b9c5aa005350429da"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: refuses a kind of thing nothing can collect: 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":"ghost/core/test/e2e-api/admin/tiers-checkout-config.test.ts"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ddc4cb5b0e04e0b567d6006f86e057d16205af068b4985350b2fd30f8ebd83"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: names nowhere to keep a tax number: 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":"ghost/core/test/e2e-api/admin/tiers-checkout-config.test.ts"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"3145c7b8003135ee87bc0de597aa2d397252d42c9f491c0e1a14d9c020fd891c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s rather than reading as unconfigured: 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":"ghost/core/test/e2e-api/admin/tiers-checkout-config.test.ts"},"region":{"startLine":1065}}}],"partialFingerprints":{"codehealthFindingId/v1":"265376aec4519706e1d22026be2ba32fc845eb1783a9a60d6bfec57ed8651025"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s a write, rather than failing against a foreign key: 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":"ghost/core/test/e2e-api/admin/tiers-checkout-config.test.ts"},"region":{"startLine":1072}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5d691da61a42d36f5b717e544fa043724c0a18585bb1ee16c83195e3080d74c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot be configured with the flag off: 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":"ghost/core/test/e2e-api/admin/tiers-checkout-config.test.ts"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"8151db3e4e9ebe485f6181a5616a1259eaf424e3394571b2d3b62dbc40664cc8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch member count history: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7297bd3071e5363f3e7ea7d3d9e3b115641ab58b20b96e755eec98bb2e947aa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch MRR history: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"c42baaa5f671dc740f575e464507e49c3f0d3b6a027658065d4417fa257c7bf2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch subscriptions history: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd54ee573218036cff87787fa9895c26f81dbe6bbbf6663b4333d017bffcd84d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch attribution stats: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"5107d667822a60982f9a3fe93a1064bed961326fbfee0e88b8e39d6cd2ab00a9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty results when postUuids parameter is missing: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"98189b45c5bfbe49db42d05bf7518cafab9b10431914b4bf407a5d2a845a7d6f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty results when postUuids is not an array: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"25ed5f75c71ec6bbf510e68618e0793a244fc15f1c63dd94651670a88afabc91"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty results when postIds parameter is missing: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8394cf7a99d525798903382effc1735e38cf9c01f5fe1cd0fe34fffc3bf1bd0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty results when postIds is not an array: 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":"ghost/core/test/e2e-api/admin/stats.test.js"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"569043649d7eb6d0b510d67bc2f4d0d33017627c884010680e6c200e3ca2207e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can sign in with SSO when 2FA is enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/sso.test.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce7d3a8117c7805cb114773af76408fa655d64942e4f69b2ed37653ae9d20bfb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"86510592d394d75e2d9e9a24e898e033f4d11cdc5fec7885bf91053d0d9ce06a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e80508d4d6b90dbd0a43438e0d35578848ba067e9db55adc707441fa8d43ef4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"06355418deb8ca6cb8ae7f34f4d48359b88666b1d287210be6a984840fdb236d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read lexical: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"825b1c865f2b1aff090bf1116cd08dc9c1b5570e6b562cb2509b90afb19d53d9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"27de714d3556817f0a7876592e83f8360cd2e7113e03d6061e06244db916cc18"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can destroy: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"61a102e5c98e980f81a8814ee0efe351130a2b22ab48a3ab2cca1c6bc7b83fb6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot destroy non-existent snippet: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac9304b022614222892ddaab250e35521c521cad806b56c71f73958f64d5d3a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add lexical: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cbff8cbe1be384d4deb952a2606949bd0530d6727c656b8cec8acfefe0e1df6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse lexical: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a9b4232c689ef0e4e1935235d8da6d1204367e31816544d16ae89759b876184"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit lexical: 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":"ghost/core/test/e2e-api/admin/snippets.test.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ee1ae73d06bba71e106e5a2f60e000334d50c1d6d6bc76dea484431c44bfb1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can generate a slug: 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":"ghost/core/test/e2e-api/admin/slugs.test.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c0b1e1e3ff377f12cab49443311ceafeff9ef2ed3e1eb444622a13cd4be51b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will increment the slug if there is a collision: 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":"ghost/core/test/e2e-api/admin/slugs.test.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c5e09b914fc786ba9a39d5676d882c7c6b8684c68a077c9fd2bd7e6490a6e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can handle collisions of the same resource if an id is provided: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/slugs.test.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c4fbb45f98b2b3d62bcbfefd01359276d54a4c030db1b81c4758cc94dd9397"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can handle collisions of a different resource if an id is provided: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/slugs.test.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d6d32a287d1819726116f2830e9e2452f9d84f7ca570419e22e710b592b8d1b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can retrieve config and all expected properties: 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":"ghost/core/test/e2e-api/admin/site.test.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e2c8de8591a2ded2c02e19fddfce50857af5f157bb36ec85f27461d4f3ddb79"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request all settings: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"92aa4f223008ceae8daa3af044d641b9b2497d2332d34095921fca4d95d47406"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request settings by group: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"05df52d4630307816e241d01ad121504778ca753e22f4e8393bec3454f11a416"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Requesting core settings by group ignores the parameter and returns no settings: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f38dee85a4841902bd2a227ffc9b54b02551a5c1a800c797ffa573b899eb6d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit a setting: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"77874996f854c0bbcd9cff86294f30b8e5b04016e67907a668278f3051b6c4d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can edit Stripe settings when Stripe Connect limit is not enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"94a2d4d17e94027ff9ee591a699c3eb6f22faea0c4ce9b823ea999ee31a09b2a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot edit Stripe settings when Stripe Connect limit is enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"8379732998bced8fb114ccad6ca5af9a9a54bd6fd23897a94a2348bf56dc626b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can attempt to connect to stripe: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f244709d614bf6effe09608406ef4ef1e4323bb48148ba0664782f349089e11"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: editing members_support_address equaling default does not trigger verification flow: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"c69e196ade4584b1ed3e24ac231e93c77462a85ed0aeb46706588906839683b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: editing members_support_address equaling default does not trigger verification flow: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f916e855ebf5a5431e28a02c9f3ba5c471ceb2e1c11b570c5524544a73bedb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: editing members_support_address equaling default does not trigger verification flow: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":897}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f8be39a8047cab1ca299328747860cc73887f9263b73f24a42d846b65c1e30e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects external attempts to set is_private = false: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece5ce47827f0eb208733d88567ef32cc5b7106962c2743a6b0531bdacf7b03c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects external attempts to change the access code: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":956}}}],"partialFingerprints":{"codehealthFindingId/v1":"a16522201aa370dbccf2ac9d84dbfb63af1a82f389c6359a8d2e30ba198d558d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: respects settings overrides defined in hostSettings:settingsOverrides: 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":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":1024}}}],"partialFingerprints":{"codehealthFindingId/v1":"16c395ee1d10ca27f245c47f4e5e55d4cc37e9794ef2234d7f5f0ef5a77de66d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: prevents modification of overridden settings via API: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/settings.test.js"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"211e6cca85678004c556365f5530ded1595a5a66c32ba82fa2b966df2d44ffe1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can download routes.yaml: 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":"ghost/core/test/e2e-api/admin/settings-files.test.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbd2e0a377d174a3ebbeb55c0147bd91fbf330d45bf50c670d9926854c62759f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can upload routes.yaml: 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":"ghost/core/test/e2e-api/admin/settings-files.test.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"4998c82ec93cf22543c86aff1fb1087817056b64de6fce55a2e242ef16899c6f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create session (log in) and access user data: 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":"ghost/core/test/e2e-api/admin/session.test.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca9f4c9ce8ecd74c272d772a6d89e33bcbb87eb9f875e170d7d086e74881c819"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can delete session (log out) and requests will fail: 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":"ghost/core/test/e2e-api/admin/session.test.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ca831aa90db90a4c020632af704053663c16294a29b24081585f9b0d888d02"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends verification email if staffDeviceVerification is enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/session.test.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd30dd7cdb652bf21e870ee6e4f2af73a4711824d37fe0a471049c81e0b0871"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Changing password invalidates other concurrent sessions for the same user: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"238ba87bc74ccc97061771772a5037d44690e8f589dd832b947eb36db98ed5b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Stolen-cookie scenario: a cloned session cookie is invalidated by password change: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f88a9aa54856e610d119928627d05f783f63e012875fc54d7ffc8489553a7d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Owner changing another user\u0027s password invalidates all of that user\u0027s sessions: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"96139cdf9b947829cdf35b464204cc349b85522cdbc79d03d36f427ca9c9d19b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Password reset invalidates all prior sessions including stolen cookies: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4424b1c6c72faca7dacb098887d8578e67b3edc85ff98d6c8700f376a3dd7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: PUT /users/:id strips password from the request body and does not affect sessions: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ec11d9a713c3f2b82ee0cb4ae0acf4c0158a0bf4d3b5fc51133dce7d8b7245e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Wrong old password: sessions are not destroyed: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e7f38ae96da7655ae62db61d2b9e74966fd7d6a3fc9a548cb62f0994e2a1374"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Unauthorized caller (author changing owner): sessions are not destroyed: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"0154c628592fad01ca8ffd34b36a3028120565d007ea6faaa50217f21e195b2a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Invalid password reset token: sessions are not destroyed: 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":"ghost/core/test/e2e-api/admin/session-invalidation.test.js"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"7224b72a46052985751837b8d703fe4f8a0794bc94c93cde7340fc5daefc2c6d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return a list of tags: 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":"ghost/core/test/e2e-api/admin/search-index.test.js"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"17c2a9f72b7b8f00c600187dc9e0318df46c5612e211d193f00924a9229479ea"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return a list of users: 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":"ghost/core/test/e2e-api/admin/search-index.test.js"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"de6d9af001b06a788e1e9c2845783ebd0e1882007b7283ebe0ea8a042522b69d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request all roles: 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":"ghost/core/test/e2e-api/admin/roles.test.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ffda49c68dbaf35884b6065cdc1cc336da0ef0ef308acbf4d149385ea23088d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request roles which i am able to assign to other users: 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":"ghost/core/test/e2e-api/admin/roles.test.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"167facef965a6f25ac189b6762b0616aa208a83fb0dea0c5760c91e0b0bcaf9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse: 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":"ghost/core/test/e2e-api/admin/recommendations.test.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"6464984665e5a69fb95ea08060221219ec9dde9156a191b3acee8b0cff17aa4c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot use invalid protocols when editing: 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":"ghost/core/test/e2e-api/admin/recommendations.test.js"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d162b00045d589ac90c061397f075f70148fd632ddd6ed60e1ef0a3597fa58f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a recommendation with the same hostname but different paths: 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":"ghost/core/test/e2e-api/admin/recommendations.test.js"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0b937f387b71f0670350669f18d094910f27a4d8e587e508435153b75d88d74"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot add the same recommendation URL twice (exact URL match): 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":"ghost/core/test/e2e-api/admin/recommendations.test.js"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a50903da7d61cdc671e75a2164b041a011213f5bee92c0a497ec17496fec33a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot add the same recommendation twice (partial URL match): 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":"ghost/core/test/e2e-api/admin/recommendations.test.js"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"04fd581fad15341960a122a826619b7841da1c5faba83cad3340cb882417ceb1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can delete recommendation: 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":"ghost/core/test/e2e-api/admin/recommendations.test.js"},"region":{"startLine":806}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4d6bcf24b8e4d4b6b61c30bfa8f58cef1c359cc8353de73eba028fae9ea493"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Is rate limited to protect against brute forcing a users password: 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":"ghost/core/test/e2e-api/admin/rate-limiting.test.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"23cd016aa8dbbbc9c0ef1b4b2e2b9ae94534c93e7585884fb74f0ec97094036b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Is rate limited to protect against brute forcing whether a user exists: 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":"ghost/core/test/e2e-api/admin/rate-limiting.test.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cd1e1e14de4437db52a6632536a791c397efc9986764e60e8bd460dc2f1151d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d6bf1c0c3dbcfe3d859fe9f0596dec85cdd5f2b9c36f89030c9c0b46c7577ac"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with formats: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1949ec638b6a8753f9494cb717f8f5808b813080422261247f77751fb1ab13"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with restricted filter fields: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dceefd61df27ac92e31fe08cf1f6969366cb08c124f9cc5a23423f23c38fb2b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can export: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"d263a72f52a26f31ef6f6e0bf9ddfa43db47049e36113de18c664a7c87162394"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can export with order: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc698614060123def26574b4d1a12d199c6ad135f59797e7c5a60e0d6078cac8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can export with limit: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"359c015aa4f878848f0b3798a6db729ff324a7269f605762d2df23b905d394c8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can export with filter: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc4175803557f08bab01be81f7492dd87db91d9b9cb6c09a6f48bf4cf1dfdaa0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can export with restricted filter fields: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c589e09081511aa56bf3d05c2526bc5ae215dda128aed23848c6c4a99cddb3a9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a post with mobiledoc: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea6406aed304fdec5878b0767ad1d6265940e4c1d10791f91adae0257ea81b1e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a post with html: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a701d775fe2340b29e993cf28ac4ae307231c6fd92d07ef897eaff242e530f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors if both mobiledoc and lexical are present: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"22db31c29f51d2fa403ff05f2d0bd9981c068264e58459b1bc1abe304e3858bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors with an invalid lexical state object: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e97932385f39e3b89cc9a8d5b1b4f7971de94b0ccc33bfa818784b5a576bad9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors if feature_image_alt is too long: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f1b1f6e101b643365f1a5d4c536cb92919860e0953ea1fe8f028d9bdbb264e2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invalidates preview cache when updating a draft post: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cf7f229b293ef773892acce854f1a2194a825030af72cfbfd77c784ea790d45"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Saves only paid tiers: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":788}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79da8714338564bee7bd66a3ea1aff478a8384e7e869a987d0f5868f4fc152a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can destroy a post: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c57e4c7124dde0c9f82ef0bf5bc06d5d47d9e438931ac294000e9482ea6411d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot delete a non-existent posts: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c2fb17428bfeade880b74ba482b777411e530f07abde388fd34554eb01b979"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can copy a post: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"a378ee2b302b03f8c2a363a36d94d76841a0e1ed05ced0894eb2de6006916946"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can convert a mobiledoc post to lexical: 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":"ghost/core/test/e2e-api/admin/posts.test.js"},"region":{"startLine":964}}}],"partialFingerprints":{"codehealthFindingId/v1":"4660556250daca41ddfe247a5415c8cbe5d6fe414d23ef8187bfbadcae601be8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload a posts CSV as Editor: 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":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":962}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae956e5fb27283256703b0a915c957b7d0ba7e8ce37c64c9e3b7e4ec1f90ecd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload a posts CSV as Author: 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":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":968}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55ab8e7cf6b8d58a71106d4c8977c45aba336d9301867f49b9a84e6c9a93a0c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload a posts CSV as a regular Admin Integration: 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":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da55a643d887ba30ec134ec5239a52b8e473ef04460879488d5b30d577329a0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload a posts CSV as Contributor: 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":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":990}}}],"partialFingerprints":{"codehealthFindingId/v1":"2171b2b47f031cf0f1508339a4954eb515c3825ec99f4c301acf004fbc18c310"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload a posts CSV when the csvContentImporter flag is disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":1707}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fc7f28d7307bc7fe48456c967ab16ca49df45ce4dc5d3438c06d74f32f62ceb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload a file that is not a CSV: 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":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":1714}}}],"partialFingerprints":{"codehealthFindingId/v1":"d366fc1b6fdcd9ce4f5fa0e5e70f6cd00b9ad8299cff0248e697aac7d030d499"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot upload without a file: 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":"ghost/core/test/e2e-api/admin/posts-importer.test.js"},"region":{"startLine":1723}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60cafe0b0b72699595f16748f3e28cf7c8d0981bd55e8b384e50bb66347d29a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects tags that are not usable objects: 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":"ghost/core/test/e2e-api/admin/posts-bulk.test.js"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb56dee5c344e2d6dcd62c50c52f365ed962ea391c412c61c75064f3ee370a9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Exports CSV with full analytics data: 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":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6fe163b80d63620e79bfee08747cc1f86f61bf061e2e04104ce963e4eba5084"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Hides email columns when members disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"de66e826428612a5255e7aa78cda7b9404c8a7a20f1a41b757107a1df4df4379"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Hides clicks column when email_track_clicks disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bea30b8702a03bcd8c930f2b7f03be65649641e21a45f98da6378a5806e189d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Hides opens column when email_track_opens disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"1505adab0eedc42fc1769ab18e7bccdcddd2a47328bfd0a7bcbff00a3d0b0266"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Hides feedback columns when no newsletter has feedback enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aec9e086c07ed14b67b9b7f08675358122f3f1e937ddcd341dd07da6c60c71d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Hides paid_conversions when paid members disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"8970d614f4e7400ddbb3a82bbf173cc2aeb6636b546c00c9b98b0620261a733c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Hides signups and paid_conversions when members_track_sources disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/post-analytics-export.test.js"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"26cfca9b1d87b550f2592281f0eace21b572cb2d5f560249c30c5af576f4a7d3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with restricted filter fields: 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":"ghost/core/test/e2e-api/admin/pages.test.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"35efd2fe4f0b8cf79eaad5928e0cfd6e1175617e313642a7caf77b6f70d851b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a page with html: 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":"ghost/core/test/e2e-api/admin/pages.test.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3caf37f32d9eec93ae764c8d80e28319d1ab180d27febe6237e18f1942b4789"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can modify show_title_and_feature_image property: 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":"ghost/core/test/e2e-api/admin/pages.test.js"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a174e986b304d169412ccc7a74a18b9cfa813faef8652e757c060e879e1956"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Saves only paid tiers: 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":"ghost/core/test/e2e-api/admin/pages.test.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f1f4045109b7c0bc5c6df6eb9d55aa00fc8dd4efa54088401e42a7954ff8ba"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can copy a page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/pages.test.js"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54859b86e1db05094dde259a1263197696ad0b169af993c8730c5094f0b7f60"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can convert a mobiledoc page to lexical: 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":"ghost/core/test/e2e-api/admin/pages.test.js"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"822351ad2865b897b48c034f7eaf075d3926943a830aba0c16f538ee769b5bc3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Has no initial offers: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7108ad5f26dc36b001623057b02a4db25bac61c9861538ea9a76a31a2820edf3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a new offer: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f55cb00cd6b4aba730b1821825cef80da7b26675daa07b2c0fe9b29bdbf9e57"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a new offer with minimal fields: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eca656899248873408cad830337540d76035afaf19c910003af0dd90f356e34"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a fixed offer: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"b88f6c517c3b57927beb5d4e0b156b9217030a0f359074cf6db8982f826737e8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a trial offer: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4bb6968de31f1ca0b3a8b27b16e0a02b290b940f85d47ef1521c6a594cba3f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create a signup offer without a tier: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"dceefbfea8905cec7160429a991902365169330e581c4d8c96094b08ba688734"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create a retention offer with a tier: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab619f7d96cd27250819b098fd00bd9b8b7bf65536a0c88a183e7c7e7e43416"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create offer with same code: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"d36c031c38caae809b6cd80c91d7e2d1df7bc661e252289c9695d2f5b9d2362b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create offer with same slugified code: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a749c035146bed28ab5582924f15e2eb6ffdaab607c5983c9e9f865324c479e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create offer with same name: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f85aa3d34609dd2b182dc48773141f34f8eec858044c53b640a752e3a9191d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"485eef4f0f8df1fd66f701dd89e104062c64b8863e498f8958558a19a963e46c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can get a single offer: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e935dd084c3384ad72d5cb0bfce50eb4e1209ae8fe1c135cac5cac4229bdee8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can get a trial offer: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6d4a8b2810bb3102501e44d4cad45515e44f886e2d78ae1d178c6f263b780d0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot update offer code to one that exists: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"1512ca959651560cbd226e7caf53a2b423baa03f7955544318c8d8aa734c87cb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot update offer code to one that exists after it is slugified: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc876540ca05c8cfc0939353ac98fa4d79e4dccdc245f3c990cd337cdd5806ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot update offer name to one that exists: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2176c165002ac2a4e1d78a0fc9c4e5e84a1c88d48528958bad30f07a21f261d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse archived: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc6ea27cd7ef6103a61efca3ef831c6be86470103551470dd796357cc281be3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by status: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0a077fb40dd0dd76a43bc3179b8b61c336018966a54fc7788fe043f51fd3ee9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by status and redemption type: 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":"ghost/core/test/e2e-api/admin/offers.test.js"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4f16f9adac057a554d434db72cd150f9d9b322fe4cbab9c8b065d29abff6dd1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add notification: 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":"ghost/core/test/e2e-api/admin/notifications.test.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c8c8b8af86790064fe7170d02db4a436e6890e86d46d19757dff4f332bfd79"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot add notification: 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":"ghost/core/test/e2e-api/admin/notifications.test.js"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"398c436b0911510d7dcf397d52df642dc5a3636451f1d5fdd7f71e9bfa9cc24f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot add notification: 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":"ghost/core/test/e2e-api/admin/notifications.test.js"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"1163e88899d9ba5308ee8cb212091689eed72f690114a21163d5a71ebb25dc83"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Add notification: 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":"ghost/core/test/e2e-api/admin/notifications.test.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e9f04eb0685444f85356fb6b59b5220e6e7b8f6aa2ee8ab8e6192c3535b4fcb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Read notifications: 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":"ghost/core/test/e2e-api/admin/notifications.test.js"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"904ec5e4c8f9820ae44000e992d74d655066146bc03f9fa3d633b4427ceb52e6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse newsletters: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd91eb8e1680f010950f12de16a9185fe0b0e2f7f29688849d59f57ddd6a7f0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read a newsletter: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"077c231635f68b2ea6f0e0f80717bf80066b78ec6842bc1a932a050a8b304bce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can include members, active members \u0026 posts counts when browsing newsletters: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"820c65bbb94c78cb068afae844f48d00a0b302b270c1b292a6b3f3d965d4fe88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can include members, active members \u0026 posts counts when reading a newsletter: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c9a9266d884ad06fe0e11f25384a4475c00ab0e2718d11c80aeaccb8744e667"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can include members, active members \u0026 posts counts when adding a newsletter: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c4d616bfb1dfe0ad0ba90788f1877f04ef34daec20eccd61faed1bb3501a24"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add multiple newsletters: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"891914474a7d16b74acd6c7bcb803000d142b8e053b728ad23335e1122a835a5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit newsletters: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"c256b03336dec7911917240dffbc9ef38f580951116922551635d4004b1a7744"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can include members, active members \u0026 posts counts when editing newsletters: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a9c4bff787801b9a0da374edf85010513b5d266fc42415047148832a750b2a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can\u0027t add multiple newsletters with same name: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"01fe91c4c805743c13fda233ee4f1b50591be71259719c21687fb49518d7d9cd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a newsletter and subscribe existing members: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"5921e5f6dcadbb1bf0bc1a5e7f494871c1f2b6cfd70998d0d17d5914aaee263c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can\u0027t edit multiple newsletters to existing name: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"b75a25e9c465d7d67cc11602ccc715b6e5c3c3424240a46e76759114ccf07b14"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Request fails when newsletter limit is 0: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d03e28c875edbb6c563bbf911048693fd26d751b8f00c7e4edf5f358972ef25"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can set newsletter reply-to to newsletter or support: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":732}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc34bb73f11344f328f7d64336c6c60b0a774a9284dde63c0fb241ec1a4edd58"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot clear newsletter reply-to: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":772}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c6e3165369a7d8e94e9f1724ac8d12bdbd98a2683a5e154a9b8cfafdff2fbc2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot set newsletter reply-to to invalid email address: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":798}}}],"partialFingerprints":{"codehealthFindingId/v1":"7de1505c7d7ba6994afab620664110489906bf08ce11100f1032bb3b68afef47"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot change sender_email: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b179797079bf5588da58dfa324a869fa60d6b50436ba45012ffa963bdccd211"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot set newsletter sender_email to invalid email address: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"60ee2f0698fed70bf0f137a973c8d0ab594152187d8a1b08bd9d2e7ad95ff765"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can set newsletter reply-to to newsletter or support: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1249}}}],"partialFingerprints":{"codehealthFindingId/v1":"94e8bec949749efc9ce82aa2e0c213cf82433d3325966b15947917b00fc5a42a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot clear newsletter reply-to: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1289}}}],"partialFingerprints":{"codehealthFindingId/v1":"855b1b43d73fac042539d75c1bb7fb662b69c81bbaf7db987d038f0db27ba13b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot set newsletter reply-to to invalid email address: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1315}}}],"partialFingerprints":{"codehealthFindingId/v1":"be4dd160a991eb7cf8ed587a32832c042d3618b7518b588617384d135e28953a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot change sender_email to non matching domain: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1419}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5c5dea0b80cb527574961b8574d1b25632d44bdcb268b883afa40db0bdbeee1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot set newsletter sender_email to invalid email address: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1445}}}],"partialFingerprints":{"codehealthFindingId/v1":"44bee360f30364b82c4281e203aa52ce724ee3a923d8a0ee7f755fa608f65708"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can set newsletter reply-to to newsletter or support: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1668}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc3ffd38fb3ff6328e96985e45612535e8cfd6861f9727fc47d7c6e509895f10"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot clear newsletter reply-to: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1708}}}],"partialFingerprints":{"codehealthFindingId/v1":"71b70b0ca2eb26700d133d49b2abfa51f941c0319e7156a38aba5066a9c0a3bd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot set newsletter reply-to to invalid email address: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1734}}}],"partialFingerprints":{"codehealthFindingId/v1":"1258031c1965b3583ff6888e55f6b3611c53037fbba5612ca661e77b49419022"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot set newsletter sender_email to invalid email address: 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":"ghost/core/test/e2e-api/admin/newsletters.test.js"},"region":{"startLine":1814}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8e5761d3c02f866eb5c95e7d2f5f1ad2d0d5de7893d5d6c66c22712594bf2b0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with limits: 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":"ghost/core/test/e2e-api/admin/mentions.test.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"530cf9678d150855100b57d28f64788827000a1b1e037914d601ec5583fa10b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Add should fail when comped flag is passed in but Stripe is not enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c513d49e0ebddbcd4dfea083aeeb2244338dba6c90d44127efbe11cdadfeca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4a62407bcb6b25b902aecb711c1d9ae4c890d5019ee933fee17e88f41c27ed"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with limit: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c4b3756bc126f6c10cb31e0d8c39b837e51519b6578965c824d12a0b29ec9ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with more than maximum allowed limit: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":677}}}],"partialFingerprints":{"codehealthFindingId/v1":"a733d8fd98b3e52289a25a390ddc4285b5b7780e13050ca70774e3da05b844aa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with limit=all: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3eb4c98dcb0db4ef6a614e4433dc04c63f2989ea588c652bb1bc0c7155078d3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with filter: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":721}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eebd15dcdfd04c104c889094f44816b886862345d97d90e43ccd4e74d27f52f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns a bad request for non-numeric active Stripe customer count filters: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":934}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31c0e8e48959e81fa535c87037ffea5149255319c4f6ea1a47f1c08d669fb7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by signup attribution: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bf4dc923b2e191098e22b9e3a8ee3389b5992ba55659cfb1acf755403e750a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by conversion attribution: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6a152b7d4c5241d2bccb3eac8026d8370c773a470bb4fe88e7aef732042000"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with search: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":972}}}],"partialFingerprints":{"codehealthFindingId/v1":"33ea7f02d1660263e30ffbbf4c490da2aeb216c88a12dd01d4eb3d8b8692f6a5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by paid status: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":985}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b059c587a5665059bbb5ed27b4c02f99ac71b2b3dd47d486b45ebe623f4578d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by tier id: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1004}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ed64640435560033eba399c39ff3ffadd8f5b8833dc36f28bf1c00de93fd19"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter using contains operators: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1197}}}],"partialFingerprints":{"codehealthFindingId/v1":"1691e275da4f35dd077c1842006ef3216d464d53c42df21b8b04ce360d150831"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can ignore any unknown includes: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1210}}}],"partialFingerprints":{"codehealthFindingId/v1":"928bcb910fd68064e9249ed9159b8dc4af859c63f8a6078cd7894a0ade1eefde"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Search by case-insensitive name egg receives member with name Mr Egg: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1289}}}],"partialFingerprints":{"codehealthFindingId/v1":"5963c82de1ff0f7ba1361870e052afcbeb14968b64d91b4221502ea1f1ab6f77"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Search by case-insensitive email MEMBER2 receives member with email [e-mail redacted]: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1302}}}],"partialFingerprints":{"codehealthFindingId/v1":"f77fa5beb300a3d1526c9054ca4867eff49a8399df56f7d326f0b63da4a3e720"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Search for paid members retrieves member with email [e-mail redacted]: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1315}}}],"partialFingerprints":{"codehealthFindingId/v1":"60dad608c8d64b82e1bd56f650f847d0d9ccfaafab2d678880bb44d8dcc117c8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Search for non existing member returns empty result set: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1328}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcfeccbbb462db69a156aa057c838bb3e5c0a4e36881e4a069548873a34e2f4a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1343}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a3cc61ac30d83f279f28c12b7ea23b79af8308e1552d0f93ab622a2611a75e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read and include email_recipients: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1356}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e85ecd461094958e62e3251df01cbb1614046187d86984bd1aee03233703836"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read and include tiers: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1369}}}],"partialFingerprints":{"codehealthFindingId/v1":"94bf5723a7d8a1ded9402bebdaefeffee0cd8501a54b3c1dcee645008e4f68af"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add and send a signup confirmation email: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1499}}}],"partialFingerprints":{"codehealthFindingId/v1":"22382da59fabe1fc8d53337a64cb5cec9067007e68e604d73de65cbb5118b15d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not send a signup email when email verification is required: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1613}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ea6c7c8cc5fc3e9c8e4ddfedbdfd0e34b8a8aab653ac9df2c75dcee750b264"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add complimentary subscription (out of date): 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":1723}}}],"partialFingerprints":{"codehealthFindingId/v1":"1735e104dfa14a413a158090fc56a678a6bf5def33519ef473f946e1ef905b1a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot add unknown tiers to a member: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2435}}}],"partialFingerprints":{"codehealthFindingId/v1":"af024fe87bb1d203f20dc8ff45cae68d7ffc7aab55cca003a103ca38cb7dabda"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot add complimentary subscriptions to a member with an active subscription: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2464}}}],"partialFingerprints":{"codehealthFindingId/v1":"0240f5aa3d71552835ea477dd7d9c848d37d86e55c1d068cf6fb39aa8aec0d54"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot remove non complimentary subscriptions directly from a member: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2484}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bef48d66163c7fee50f8d6a3f1631dae34d6addbfb23f54b1b6a3858aabf290"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can keep tiers unchanged when modifying a paid member: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2560}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed23a24198d315b08a665f9610888b9a023e23c0710d60685b9cb506e09ffd4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit by id: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2573}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d60d6975a830bc109c4f2af32f6a8683e0020bec84715fff28a5550382f090"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot edit a non-existing id with newsletters: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2658}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffdd19221591d5be1241ef7658e1deaf16c5db6271b3be7ba19587af1b4dfaaf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot edit a non-existing id: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2683}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a4b4a5fa558d5639d6344706d58b6175b2070053c76d56fbe2d8a67199f57c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can subscribe to a newsletter: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2707}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c96eae8db2dedfeb5dcd076b41ed19abcbf232acc9ce144b53409d6320e484d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add a subscription: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2866}}}],"partialFingerprints":{"codehealthFindingId/v1":"03c3df9d70f6cb37470b5c13705db98487a1eee15e46dbbe632d7536839a4d97"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can change the email address: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":2919}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdfd37f4126a0fa628faba5dcdc1038f0b8ce626767aaffee302000545640483"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 404 for non-existent member: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3079}}}],"partialFingerprints":{"codehealthFindingId/v1":"b728ee316f6428df859c1bbe04742c65975d418546e908c7b928a8fe6a638d15"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can destroy: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3160}}}],"partialFingerprints":{"codehealthFindingId/v1":"de8e6084a8ff7ae7438269cb46b2d78021196f733450328ac04a7f23656b913a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot delete a non-existent member: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3198}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b33a9b9c74bc22f279745bef95dc752a6f6c662dfb596d150de51939010d0b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch member counts stats: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3356}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce880ce918fb385502225c54072761e8cbe381b204c5038afb85b0e015ed400"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when fetching stats with unknown days param value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3375}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff3d6d7005bb72d5c7fdc26bdee63af6d598010a9b2a2e5415bc8a58913fa23"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter on newsletter slug: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3393}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad027b0d913fa0839fc04cf56351d7fbaf9f8ed0be9c928885c6acff6a1e7637"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter on tier slug: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3410}}}],"partialFingerprints":{"codehealthFindingId/v1":"84789f81340bcd4a331c9825281a79a0fa3d79a20e7ec6236315c21fe080b85e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add and edit with custom newsletters: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3434}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24c99c94594bb85a26a39788f466f161c02a0c16217aa9c49e7cef54866258f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can unsubscribe by setting (old) subscribed property to false: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":3960}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c067241d45e84ce2e049e38353e43d11d617f08a2e4c82bc3c994d9b4293f45"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can bulk unsubscribe members with deprecated subscribed filter: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":4532}}}],"partialFingerprints":{"codehealthFindingId/v1":"5392f188c50f639b1e2210d507adaf8dd4528f66d61555b568e1bb63059808e3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can bulk delete a label from members: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":4601}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2bdce52bd172bcd84eada200e9213b6d098d8dd9fcc53dc57bdebcf8edb556"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can bulk delete members: 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":"ghost/core/test/e2e-api/admin/members.test.js"},"region":{"startLine":4945}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe4cbfbec91bc73de5ea0b0a0e95e25a52dcf378cfc80e4732aea655631cb0b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can do auth: 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":"ghost/core/test/e2e-api/admin/members-stripe-connect.test.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7fb545853a8eb5f4bf18b3b82f1ffc6d826912320e6bf0dddf3b13ae3dbd4d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch members who are subscribed: 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":"ghost/core/test/e2e-api/admin/members-newsletters.test.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"69834df3d44241fd0e034dd322d39df5feda07daa7f4560c0ce3e0ac89fe12f2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch members who are NOT subscribed: 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":"ghost/core/test/e2e-api/admin/members-newsletters.test.js"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6ae19eb34cf0a0fa2f23f71adf8db116c16079abb314eb14bcf0c38680580c6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch members who are subscribed: 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":"ghost/core/test/e2e-api/admin/members-newsletters.test.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc63e724a2245c1cdb94f8f7882fd6712f0de45efb8e4b75c2d00e39cfccc72"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch members who are NOT subscribed: 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":"ghost/core/test/e2e-api/admin/members-newsletters.test.js"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"170105581f1fd7d276b38c5fbdc277cae01c8fc18d8b89d3c988428dfc941d95"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a value clause with no field key: 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":"ghost/core/test/e2e-api/admin/members-filter-custom-fields.test.ts"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"167288af15ca7234e56c07e942a15ca4fd7ea8d480e6ab4924ed823b4d5219c4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a clause naming an attribute the grammar does not have: 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":"ghost/core/test/e2e-api/admin/members-filter-custom-fields.test.ts"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"340c556ae41b543738a69addbf297fe8403f3249fe42a11caef8c49eab3aabc5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects an unsupported clause inside a field compound: 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":"ghost/core/test/e2e-api/admin/members-filter-custom-fields.test.ts"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba72699050c3bc9eb762f41bfc37828023531a1d0cf51941982901e02674272e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a bare key with no namespace segment: 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":"ghost/core/test/e2e-api/admin/members-filter-custom-fields.test.ts"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ba547186e37faaa424d3fd364537b1df24c3d110250ad55dd2bb3df2d9d62e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a duplicate name, case-insensitively: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d7617edb5e6a49ff0bd8e9c76654ed606c16eeb6aef195f51e0970073c2807d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a name with no usable characters: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"c53e63abf21e57073c88f143aaea09b98c6bb3a8f4df64ff262b675ca1e9edf3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a name that exceeds the maximum length: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"a492be0e9b95b9ce8198e0dc38c61b7bae03b44cbb8abb7b8a1cc199dbac93ce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects an unsupported type: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"719a4f15e9eff8c29017589c349c6132c5c9bd3bc87b43d1bd84e8be2bd05d77"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a create with no root key: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"669bb631374763cc1a2c744459300b4e2bac16caae7ed943cb9a8cb4984184e2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects renaming a field to another field\u0027s name: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9fdd5b0a0e6fa24e64abca99f6c804062e40feb58a3a3f6d15c543fd449ad75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s reading, editing or deleting a non-existent field: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c73191d9f261a62094e5f5de4ecc81c3bfdcdbb47ab818d268405c6487d4d98"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a malformed filter with a 400 rather than a 500: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"c78798d8b736cf474e7c6f4198d08fc590a47c10283aff38c7c455268dce982c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: honours a numeric limit supplied as a string: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"411289421d71b585b4476724e093745b11237d2ba78b398583b8777e8d22b781"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects an empty string for a non-text field rather than clearing it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1299}}}],"partialFingerprints":{"codehealthFindingId/v1":"aae9103e68e29134c9d65c57748f6d03531eefacbd3cae8ddebd55c897ccd159"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects metafields when creating a member: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1403}}}],"partialFingerprints":{"codehealthFindingId/v1":"231930a4e251e694afee3cce4e5edd26d2e3487e486591fb26fa71f951509bf3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: accepts an empty metafields when creating a member: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1511}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fe3899959c423334384fc23ff1516adddf3e1dd11b6e7094ca2d7a56fdaecfd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a value for an archived field: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1539}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bff8eafcca4ace2d5fb6bffaee0c7013f83d996ba7837246daa692dda703f88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a long_text value over the byte limit: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1881}}}],"partialFingerprints":{"codehealthFindingId/v1":"314093dc48b9653bff40a3cab1fbd90326afff2cdbec853bb42a1301ea9dfef4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects an over-long postal code: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":1921}}}],"partialFingerprints":{"codehealthFindingId/v1":"9354215b27bef76e39e735fdf8ec78e16c952657222c45c2acb142a3562b4b0c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: lets a role without permission read what the site collects: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2397}}}],"partialFingerprints":{"codehealthFindingId/v1":"61f649d2eb8a84188d1572432b1413fe958f95d7fe1ebb446059f73c9807915e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: forbids a role without permission from creating: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2402}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d5ad43215f81298a69973626dcea430aedde2ebc86538016bcc50795378688"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: forbids a role without permission from reordering: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2409}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad38ccdb1fc51ed4e30d265d7acfcf4d3c09e1115d58c7178c0be01dc8f85c1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s a read of a field that does not exist, rather than hiding the route: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2443}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe2cc3dc1bd2a3671fc4d580b6cf1aaeb6fb0cf6ce3d9d334d243e158f3b210"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s the create endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2447}}}],"partialFingerprints":{"codehealthFindingId/v1":"304e3d0bd46a88a3941dcae9596d9e3c071740d2ad477f6dda834e30deb005ec"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s the reorder endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2454}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d035948c750eff1514a4421da00e97df3e777f92f3171065620a3a1c8ec5223"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s the edit endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2461}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dc4fea244d8d44161e9bb249767f987b21ac5ee307bf3d799923f02dc2c8163"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s the delete endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2468}}}],"partialFingerprints":{"codehealthFindingId/v1":"099b59e40a4e41f40d3883cc557a6afcd1a980af1d02ac5ab7455bdfb2559411"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves every route alone when the limit is unset: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2484}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc6e4dfca122e93f4dbbfa58f8619b262b11ab78997c2c5bf8b1d3c733573d0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves every route alone when the limit is present but not disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2498}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a42b25ffada43ea238be2049cd23d2c13c234c9ad2abee4a18adadcff1e829"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: still reads a single field: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2529}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd00f286459abeb9f567a1976ea539d7874afac8c580946ff855d2b9a88a6890"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 403s the reorder endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2551}}}],"partialFingerprints":{"codehealthFindingId/v1":"bddc9997f0093f07e4b14a063dc0f5f6604990447968562ef0fb1689dd37ec22"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 403s the edit endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2558}}}],"partialFingerprints":{"codehealthFindingId/v1":"0399005c631c8d09ae3049c9dbd12441c2e3f9d354586efeba9d556cb268689e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 403s the delete endpoint: 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":"ghost/core/test/e2e-api/admin/member-custom-fields.test.ts"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e12aa296ed2e4b6ade82a9229536ed99093d04a4a7d7307a33d7bc8b7b29ef8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 422 when reason is missing: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"11b6ae1cad76f0b22206a80ee87b3d1382c2cd0abea7070054c0312fd6be9a4d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 422 when expires_at is invalid date format: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"ded119b442d6ac63c0be6c95d7599fe9a73adbec5789596d600eed2e41c1b1ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 404 for non-existent member: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb7981527e64ceda7a2372f0b5bc9a53c3fd61b2d5879ed80db78bbd383d6dab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can disable commenting and hide comments with hide_comments: true: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b5d9c15d2bf90a6240a436ceec55963604453c9044807b815a9185994838ca6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 404 for non-existent member: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"6616c726a9c8a3cf3b132d49b2b2641ccf5611db646acc8ce3df583247b08a23"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting disabled cannot post a comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8d004e058ae40eb6bed45826755707201d74819cee207c860749ca6d734f59"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting disabled cannot reply to a comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ef26e623fb1b1405ba0abaf2f2a1ef54592471d2a04f2ffebd8e1214ac7ba27"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting disabled cannot like a comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57bed9514f9df345c4b0a97523d57cc4bc38309912e3f121e9689105551224a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting disabled cannot edit their own comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"c628fcfd7652686dbc45e9aeb15f1380392d018aaceb60710fee39585a75a33f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting disabled cannot delete their own comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31a147e37f78f566edc91057c78f85a31b7f9a5b62fb33c860d7281103eeac8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting disabled cannot unlike a comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4769de16aeebec1bb3000c97f6ac9489f2520dd265768df3d20c57cc12156b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with expired disable can comment: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b946646ea2300989f64a91a9779de8898a56b180cffac546f389e5b8f90cd29"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Member with commenting re-enabled can comment again: 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":"ghost/core/test/e2e-api/admin/member-commenting.test.js"},"region":{"startLine":850}}}],"partialFingerprints":{"codehealthFindingId/v1":"240ebc6cb107737291f754bb6b5049a43c64ae418f85912017bbebb00d346ff9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all links: 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":"ghost/core/test/e2e-api/admin/links.test.js"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f18db9f2c53f00498b5876b9799a4622f8411a285a907882259659de1b63f75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can bulk update multiple links with same site redirect: 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":"ghost/core/test/e2e-api/admin/links.test.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a2ae562829bd0bd37d3665cb4620f10056c0e839a81a5eded99c4bf92d95e2e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can bulk update links with external redirect: 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":"ghost/core/test/e2e-api/admin/links.test.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c9c776c13631d1311bcbc85ec0598cadcb018ff72553547e9cc32c57e43330"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can call bulk update link with 0 matches: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/links.test.js"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"de00d815b319772c549da89c7e6ac848c9b294a251a62b2bc51416f59489d946"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with no labels: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8a6ec97f9acc76434bded05ba3b8dc740cf22217b9cf75f00017658eb94f1f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5375c43110a53d1bbce584e1c4f3432f466c050ee6e98adc8649fef28041125b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with member count: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cbae8848cd5d8ac1dbab2e73b2a40e82317a39eeeec633fc5dd5d1c3f92729"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read by slug and edit: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"595e34ebef8b7f1a342a937181b8d09225d871f9dfc1982f4d548528cfc4fd06"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when editing non-existent label: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"caf33d5f19ad81de9cbc79670243a3269832a269d41ed4ba0a2d7a202afd53e8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can destroy: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"80e6a348160909d957238126a1719d9d16cc1de97e4c650d941b7f4f3efa74ce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot destroy non-existent label: 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":"ghost/core/test/e2e-api/admin/labels.test.js"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d18752a0cdf2ab2007a60e3c9e82eda76344597f8150cef6e00efd7cad1b83"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can\u0027t see Self-Serve or any other integration: 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":"ghost/core/test/e2e-api/admin/integrations.test.js"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"236344b51213fc49efa2a78ba89697c2a41ae4d8a34c6dcc34c7e81735fc8e68"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when uploading a non-SVG with an SVG content type: 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":"ghost/core/test/e2e-api/admin/images.test.js"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"592e07acdab508ffe54cfd88444a4796d7cfeb020bd7105c65f9f397ada2f3e8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when uploading an invalid SVG: 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":"ghost/core/test/e2e-api/admin/images.test.js"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"62b7b9ac4ee3105fcdf884efec8bb093c2aa8df91873445c80e2acd8cc4265b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when uploading an invalid zipped SVG: 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":"ghost/core/test/e2e-api/admin/images.test.js"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3be0dcc2ef8976f6718212d66ac53642cb65beea8be62d4a3dbfb11f6e2571"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when trying to upload invalid form body: 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":"ghost/core/test/e2e-api/admin/images.test.js"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a4276f8fcab4c86af6858e20873a1191c2067841e1e71d11318e8241fb1fc73"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when image request body is broken: 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":"ghost/core/test/e2e-api/admin/images.test.js"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"38367c52abbdfb78ec95cc67561508adb9c6f019bce2656d295e47643a20d036"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when image request body is broken #2: 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":"ghost/core/test/e2e-api/admin/images.test.js"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d7aecd60ee7dc7285f9c0dc257e43d17c9770d731b07fd96bcbd048e3e528bc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: lets the site do a thing that is limited elsewhere: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76e6e53f59fa18304ad7f94cb1e025ae379d1dbd526e96b86d1c8bcf092a9b0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves the feature alone when the flag is present but not set: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b8b7ff9874c26e9d4ea5df7dab7a1d9e11e2448e6c9873d93c82817f8c39670"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: refuses when the flag arrives as the string a host sends: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f45e6805f076c97228fcf1d8194db1edab912578dd6201b43ade0b0fa40391a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: also refuses when that string is the word false: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ca0d6d67284682b45934c996a837be470b9bcf2bfcc9b5672313917ba5058d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows the action while there is room: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"b614ede3282b30cb2b8076d42ce69cb3056ffa6b3c0aedf8a92c2551ae93c91f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: compares against a maximum sent as a string, as a host sends it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba70494a152b378b02b9353e015ef7a1c6484e1a5ad32787b4e7811d451b844"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: counts what the site actually has, not what the request says: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"357d1b1ce7b742f064b0c1ff7b2d3d5e261569c8b0248afbb20cd3925a54e579"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows a value that is on it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"c005c56a7e5e0eae0d0af2b9b273ea8ed3ca1c3b378b162551d613a780f1170f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps a site serving rather than failing to start: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"979bf0bc32d76c80f5eca230a51089ceff8471d3a7f5f7b2545cf3f85aca0ccd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: drops a known limit written in another case, leaving the site unlimited: 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":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9cd36b931cfd48f472c24e8939f344e1db03dc2e7cacb60be585a1fa741db87"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: accepts a file inside it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"8609959dd320e6dc62bd89edcd0747995e2baab080a6e52eb5576636e5b378de"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: publishes while the site is inside it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/host-limits.test.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee71f78352850cb1a064a29d4fa8e2d81263e84952244a6af7d067d82157b1b5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 403s for an Author: 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":"ghost/core/test/e2e-api/admin/gift-links.test.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"de63ae5bf818d953d9d6cb049d291a13ff89b8fe6066b800cde402aa872e7a32"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 403s for a Contributor: 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":"ghost/core/test/e2e-api/admin/gift-links.test.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdfa818902a88ff0a165fc0496cdf78a94e8d2c321803955af0b6b5a852bd2dc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: 404s on GET, PUT and POST: 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":"ghost/core/test/e2e-api/admin/gift-links.test.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"682004e740ae75fb900b05287e91d2c013c641bab891805ecdfee20356822c61"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot fetch the featurebase token endpoint: 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":"ghost/core/test/e2e-api/admin/featurebase.test.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff694cd6fcfcf861532640a2785086e32358a054ac1f332e715dd921f57e59ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns error when not configured: 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":"ghost/core/test/e2e-api/admin/featurebase.test.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4bcea185f8240d09fa513d9c1ea76e717c8050faffa2eb92bc41438c54c8c1b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns error when disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/featurebase.test.js"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"449fba720b1535fdcfecfe93fb9575b81a45b5d83ab2455b47db902d6de59722"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns error when secret is missing: 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":"ghost/core/test/e2e-api/admin/featurebase.test.js"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec21910b887acad0e34c1bbb7c5d10aafc3e02a08f50feda5d090d208e88d117"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Accepts a repeated components query param: 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":"ghost/core/test/e2e-api/admin/exports.test.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae72987b06f2f7f91de231f0aec6ddf4deda2d570a709af97e17afa78da38273"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects an export with no components selected: 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":"ghost/core/test/e2e-api/admin/exports.test.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"70af5c34788a78a6bbe38c8b79bf9e40134556fdfd0265f6e0b36b2adf6fabd7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request the media component: 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":"ghost/core/test/e2e-api/admin/exports.test.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"059b71e6320ac1088258c8a98736944f0a8acd78381c643bfcf91d7a64486f05"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request an unknown component: 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":"ghost/core/test/e2e-api/admin/exports.test.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4633779ceeb6a9cc5a7ef3124a4f31e7f4f7f8ddb3fa21d4777214e7f5ffc6d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot download an export without the selfServeArchives flag: 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":"ghost/core/test/e2e-api/admin/exports.test.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0750d6c4a33c69402bf3a2177c2edbe480f2c96a1f6ce1d38c21c89e9ba17d0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot download an export as an editor: 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":"ghost/core/test/e2e-api/admin/exports.test.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9835c1c301d552307357de46c58f585de0f52ceb930c7e2b6183581cb38c0340"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request an export: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"415c06dda3c3167ae2a2672657f9c0b0a1c9ea21637050df08f601ee27eebc07"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 404 when no archive host is configured: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a11556cd59848146fc8f635c443e14a9e2bcd39f5336219d30b49b5b89e56d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Refuses to send an unsigned request when the secret is missing while the archive host is configured: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d7c3181529e736c39b77ca03bddb58cb149016b432d7b3a4329cf2348c853b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 502 when the archive host rejects the request: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"a695c37e90fc1681da627d0a9dac59b6b3bc0dfb147397bbd4779185061a4676"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 400 when components is missing: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e8b70d6f44544e3e8633abf103c660202c60d13821cdd833ce84f250a169e99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 400 when components contains unknown keys: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"e753a914e0beb90735e19cc849edf404d02855f7baf71b9cedc3d3c0ff0392fb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 400 when component values are not booleans: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ddf3870b84fd0c6aa886aa2716c2b5de396c906220df412cc5de289752dc0c9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 400 when no component is selected: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"a77fcafa7b9ce23037ad70c520c8207ee8e82e6657a7d98b9a9cdc3e97322fbc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request an export: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ab6347f28eaefcf40b535879c75222c929a457f4d840b066ced5f9d1c8cc5c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request an export: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"9241fc945b1711641d7be1cc2b4af6e639760b725c0c9385c657f1d3bdf12ce8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request an export: 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":"ghost/core/test/e2e-api/admin/exports-request.test.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b954496b35790d08503ad5630a884ef2dab5ff98061388ca4054753aa2406d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse emails: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3cc090a34182c56e549e1874fb0b19515bf1a210300950e158a7881fef51d6b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read an email: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"102eef7e5170529b9ba6fa3ea0c5425ce146631273cb3278a8d2c3eac4c4fbb2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot read the sending status of a missing email: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e36a82d145156289ad8055096489ea8283869f7c39f24aa9669d9863ef8ee8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read the analytics status: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6e6cbfc8fee0cae39a63880e30dc64766a9c4a6614fc41c098cb7af8a2a599"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse email batches: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"56215ead60eb811e3e95cb90f4adf249b06aa53b350603feb8fc4cc047de9917"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all email failures: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb4e175c757648be15dccf1fd417d620301c6a0d6099c1422743f708f219aef4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse permanent email failures: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"37edd3b61e89e460e18284cc1f9dc3bf7415eaa1498412b0d0d168857a52e20e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse temporary email failures: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac2eec39d3df2a8c58fef27afe485d9d9bb7ac6c1fbaf0b3f3027da134074a4c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse email failures with includes: 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":"ghost/core/test/e2e-api/admin/emails.test.js"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a375a94dcc59a122b1719a70634aa447b74d04d75ff168119fd2df176c2e0e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can\u0027t retrieve for non existent post: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c350de2cd2ce21d8e2bce02abaacb1f2359c9b3939b0a5e92cbc2062127dc33"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects an invalid member_status: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"b780b5a41a547fc444845c6498c3e203bae92cc3653fe95ab9736ed5625bb3ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects a repeated member_tier param: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"7592918be4475bc1875f3ea91b3ae9b3d7b2ba39438eec7459554db08bddbb51"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects an unknown legacy memberSegment: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"09abafde580f0936020d1bd0d1ed1dc80882cad46d537065b856a891ec70ee73"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can send test email: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb786fcc2949745d4fab8232b729468d0ad5adb1be80badb4098dc23d3e3c9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can send test email: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b7dee853ed85885abba478b16c526de8a0c54326c2b6420d6fa3dd7265b843d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can send test email: 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":"ghost/core/test/e2e-api/admin/email-previews.test.js"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4489a656a25ca30814a29e7845472e4e04ea993c9ef950f289df34e7307b20"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is rate limited against spammmer requests: 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":"ghost/core/test/e2e-api/admin/email-preview-rate-limiter.test.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"90464b595797bc425e04845e33f40e92a1f59fb1c5f44fea25a82421ff26ca1b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: enforces limit globally across all IP addresses: 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":"ghost/core/test/e2e-api/admin/email-preview-rate-limiter.test.js"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bc71b8554cd3744329969fac808b53d21069ecd9f833f154d5faada662fdbd1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can trigger external media inliner: 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":"ghost/core/test/e2e-api/admin/db.test.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"6015dd2b0b57d0f9342fc512e54c7504d9da9c495815912c4a9a05ba8700e7db"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles invalid zip file uploads (central directory): 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":"ghost/core/test/e2e-api/admin/db.test.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0ec9b03fda8ffce8a337a6c00a3ccead008a63ea8f1bc3ce000d7e379e884c4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles invalid zip file uploads (malformed comments): 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":"ghost/core/test/e2e-api/admin/db.test.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6fc4cdd154c4d3e7d0af12f99085df19e9e27744d412cfe752c151026f17e4e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects CSV file uploads: 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":"ghost/core/test/e2e-api/admin/db.test.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3eafee8e5c344f1cece15937441380b90377d710658b7055ed6b99341dcf727"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can fetch settings for current theme: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/custom-theme-settings.test.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"626010242ae5baba9fe5f6db1ab4ae20617f4c946235b5cfd561b84f68d55582"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can update all settings for current theme: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/custom-theme-settings.test.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f6768479415a700d17d434c0b6e389be9057f54169da3f1de442339e0e03b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can update some settings: 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":"ghost/core/test/e2e-api/admin/custom-theme-settings.test.js"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef4099c4e2d164449be08d45b9738bca947e1005c5cf32d6b4d05fd85117ff7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot fetch the config endpoint: 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":"ghost/core/test/e2e-api/admin/config.test.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5cfde56062b50eebc0e95c57caf2f79ce0cd0129dd2d68b10f422119146f669"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot pin replies: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9c7d16c0f06231cd2e6be5fb54c5ddea4f13f7a4ea34fef82bbd34cde6a3a12"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot pin deleted comments: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"e58324e9f3a15f46e086a5b9eeb48d6600e52ff5eb78b81fff3934566df8f7ac"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does return published replies: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1896f1d2b01fb295b9140db9f1e5a516840c0e2a79170083361cc4b2b4f3c4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return deleted comments: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4bcd02afe2e0df2c450ee29dea19bee1b0eacee308e424faa630f410984ee58"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: excludes deleted comments when all replies are also deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":783}}}],"partialFingerprints":{"codehealthFindingId/v1":"909075db3eab21ab3946808ceaa7e2bfb31972eea76ca99ffd551c625918309a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns deleted comments if they have published replies: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":805}}}],"partialFingerprints":{"codehealthFindingId/v1":"34f50a37dd2993128daea3d7d24f68ff6fdd4a4f76bdc28626f3a32ecae9f488"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return deleted replies: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d1da6f6b44347e7742a28866173419e9efe74ebc773d5772ceb5cf157fcee6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes hidden replies but not deleted replies in count: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1082}}}],"partialFingerprints":{"codehealthFindingId/v1":"368de53091a9afc1214a0e1becb37bd1c67b8e558ce936afef409a49756f4e30"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not include deleted replies: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1302}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79ca2097e8a276406a2dc5404c0492259c62628d2a7c93343f842bb6d6c57c8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns validation error for missing required fields: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1523}}}],"partialFingerprints":{"codehealthFindingId/v1":"893c7ea5a0596461c727fc2b38930f2caaadce273f3006d28b6c3698bf02c0cd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns validation error when neither post_id nor parent_id is provided: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1534}}}],"partialFingerprints":{"codehealthFindingId/v1":"c117b8d947a26f9b6a7dd20bfe15b8d8d9f3823c34371f8e5605267f7b19f03b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all comments across posts: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1907}}}],"partialFingerprints":{"codehealthFindingId/v1":"076e2af3b87b0d2d89ab411b3d951059ffc1900a229f54a8d756e641544b9942"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns flat list including replies by default: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1929}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c9c5194b3ae8133dda9701b6786390cceb9168bb672012e6d671ef7781b0a1e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns only top-level with include_nested=false: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1953}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a13fa4388d3b68f17a97660e110c9e2954489b4a90a0132a486f9538fa75f78"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Includes hidden comments with full html for admin: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1969}}}],"partialFingerprints":{"codehealthFindingId/v1":"992877ed9168e44277877542e93d3ffb7b10b42004eeb9e2bb3ba9df4403bf76"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Excludes deleted comments: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":1984}}}],"partialFingerprints":{"codehealthFindingId/v1":"945deb666828d628a0b72ec616f7d3561a6f728108ab887f15caffab440efab1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Excludes deleted comments even when they have published replies: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2005}}}],"partialFingerprints":{"codehealthFindingId/v1":"878130cbd992ae965613b2c3a486c2e9a94a2dab671353a926dcb82d969d4890"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by status: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2028}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb343a4f17393c9cb0b03ea205fe924bb4501024173e791a15a73a06e67895e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter by member_id: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2043}}}],"partialFingerprints":{"codehealthFindingId/v1":"c538bdb245002e64859979dd65341172dc9a14ca0848505a931dc85e1dfde81f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Supports pagination: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2058}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f8db8e76b7513342c34537eb6de742106c8d591c61ec3d1aefaa94cf1cc22f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Orders by created_at desc by default: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2071}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d57d96f6debf7eebc5382deab956577b4f45afe615662ca2142d064c08c499"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can order by created_at asc: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2129}}}],"partialFingerprints":{"codehealthFindingId/v1":"0438bcdfed9509c7c263040dab8455967f6e55c44308c98b650935305835098a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Always includes member and post relations: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2149}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8d878ac5543ee3fc201a12295746140285cf70b51dc4cccdc247a7c56e81083"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse reporters for a comment: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2312}}}],"partialFingerprints":{"codehealthFindingId/v1":"1194f1b90d7968939fdcce47e8c45719a1634b769c016662119bd6ea7d72d1ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty list for comment with no reports: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2338}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ec401210488fab49e944b8c96e5bf0910da8032f59dfff88eaf986725174cf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 404 for non-existent comment: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2407}}}],"partialFingerprints":{"codehealthFindingId/v1":"727eda82deb8f2ffa37637139ccca9080e66d5d48519fda55bf80864abeb6d50"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse comment likes: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2441}}}],"partialFingerprints":{"codehealthFindingId/v1":"730e26929a270ee5da80813afced79929a03a086ac865a0cca8f697969bdda5d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty list for comment with no likes: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2473}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78667786bae4a709d1541ee92826c521373c058b843b8fac655c815f1a58d80"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 404 for non-existent comment: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2542}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01c1c07282f07a3315f599d2ffcb18260958bec19e75b879281a593f493d696"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: API key without comment permissions cannot hide comments: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2602}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b29c6f0e5509738f0ee927a5c128625549521c7051ee6c61e4406d65a0683e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: API key without comment permissions cannot browse comments: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2631}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca4f1018bf18b45c6ad6cdebaa296f63bf2c9399475fcda26c15703ad97542d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse comment dislikes: 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":"ghost/core/test/e2e-api/admin/comments.test.js"},"region":{"startLine":2670}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6fac34dbb10eca95e2b8febd8ae044722df81b40d6e002f5f4df2859cdcf585"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create a DB backup: 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":"ghost/core/test/e2e-api/admin/backup.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0cd7b06daaf20b71008dd796c5a651c2a8b183b079d0f89c70136395fee37f5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot do a DB export: 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":"ghost/core/test/e2e-api/admin/backup.test.js"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1c5610bfa14e801367b15156370320a71bb7826fb6127ac411706ff75edfdd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot create a DB backup: 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":"ghost/core/test/e2e-api/admin/backup.test.js"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"00e5021315ca4cfe4ed616b0933183facf2a654582798cc7705c031106cd9cd3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot do a DB export: 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":"ghost/core/test/e2e-api/admin/backup.test.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"1547c884eca54a2d93d93569d3500df7487c325c17983238a21c5f52544dd820"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot export members CSV: 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":"ghost/core/test/e2e-api/admin/backup.test.js"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f70cbfafb49897fbcc3d9f29d99c442c0569ea99bd23cd44c790caa5393dde"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: requires an authenticated admin: 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":"ghost/core/test/e2e-api/admin/automations.test.js"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"5362411eab108fcc7bded226729bc614f67f5a7204b7e1a2d603de61c284743f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse with no automated emails: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e90ce16965246a5479e8bbe0bb526e089d16dae1dc72c80fbfe5669ada5b940"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse automated emails: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"782d670ee1c5a88fa4697e7d641682595ac1f462919f2d551b13d4d7d4c7d610"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read an automated email by id: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e72167c36815ed9c534dbec399989086a09b0fd558ca1d569810d03a7dd9a1d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add an automated email: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"afa23f488083b31667bc48259c9e5b44a2ddfaa5f534e742548c5bf7f52f03f6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates status on add: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdcf6f6c871efd295575349372c4ca24db5c0dbd84f8dd3a4521cd3195da26b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Requires slug on add: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a2d04e81cbc969f268bf3e35ccf93dd1e364121b13d45bd562f7d3f827fa58"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates slug on add: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ec3fdc3e677ab181edc8da993958a7554f0972bafcb27a8d7f24ab79f6404e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates name on add: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"559c6323e10721d0a16fdc45422d651e5dbb2007d9a8226cd3e8573e489fa911"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates lexical is valid JSON on add: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"4feadb5602d40a8498fe46751310100022d366b56d22819cfe510f2123827ad0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit an automated email: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"897d1698cb4204abe72eb811d8a373cdc591349daa131e882751852b654e24b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates status on edit: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":857}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda81f834eb741f31e1a6912c1e0270ce0415c1d0f7106d0da092aecfa1cbfda"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates slug on edit: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":886}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7b5cc96af44ebbad613551244a0061d50be49a5525295071905c3e53073f05"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates name is required on edit: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":913}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7a297466f8525d0b17b4b154ab2991228453d49cf73aada92c56e7df2eff6a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates name value on edit: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":941}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c6b2eb200bfedaa0c4d35affb19f20738900a02d1d5cd78872c5a12bd73d88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates lexical is valid JSON on edit: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a99d9e22392cb41b7c0522f5b9d01583edd63bd6d1ab9eea6cfd7dbb5856449"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can render preview: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1327}}}],"partialFingerprints":{"codehealthFindingId/v1":"8060c0a5b0874bdc43309ca3d1063965b20c177fb75bcdab9ee1c10354168707"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can send test email: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"d196d1406eaa6541e587ecba4004aa58ec325a9e02d2dacf521602ef7c4346ea"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot send test email for non-existent automated email: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1598}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b8be0e716e503237109c41936a85b84586ef8cc3e8258cac0c8600c21a16bb8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot send test email without email in body: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1620}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ae98053a7c8691cb54ed922356970632f1a970f431f9498fa2ac9bd0f9bd1d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot send test email with invalid email format: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1638}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b74cbcfb6cee23ace7216bb9cea31f08b9d34ffca2d6ece32241675609703c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot send test email without subject: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1660}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff65d75590e4bc69a1f161679a667963495aa69fe4527f9f4efbd173efcfca33"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot send test email without lexical: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1681}}}],"partialFingerprints":{"codehealthFindingId/v1":"8949aa1082e06b6aa96ebfea9e2d3dbb3fa0736aa64ebf96b6f5c13d27c96725"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot access automated emails as editor: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1715}}}],"partialFingerprints":{"codehealthFindingId/v1":"d75a01e7b96991a602fa03324a38e661971a95b2f5204c05dcdf0819fe19daf7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot preview automated emails as editor: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1734}}}],"partialFingerprints":{"codehealthFindingId/v1":"930134a925c406ff8c231c0b94979e8a2d0e4f4800695bf95b52a1ffe290a38c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot access automated emails as author: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1757}}}],"partialFingerprints":{"codehealthFindingId/v1":"120075df67b5c0037dcc60a768806b1ba5206dd1990431f0bee51b679176d713"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot preview automated emails as author: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1776}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c38c8987a7def04a0a910dd9a09d3ab2aa3e5478eb752cc448acee4cbbe4e2a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot access automated emails as contributor: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1799}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0cfd4df00ab3533cdf52314594d9bd4b86835cb0e41dbe9b7de9f5a5156b50a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot preview automated emails as contributor: 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":"ghost/core/test/e2e-api/admin/automated-emails.test.ts"},"region":{"startLine":1818}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5760648562cf6010c269d9a7bf6b4af7708f4fc0c0b231ae8d3d620495668a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read the default automated email design: 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":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4848a5ea0abb57d834c130e6e62f139c058387b733e0989f736219de7c36e646"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can edit the automated email design: 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":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"664861c44b9138294a158207d07440fbd2962d61e89ab1c38c34e48b297d39f1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects slug modification: 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":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"1adfc7614e592989f5394b5389072ccfe51f27e3b1e86bff8c1d8d8706206a26"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Validates button_corners value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c5abe1d70a63585fc92ac947e58e1877772415723519ae0d7246070d9670c3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot access automated email design as editor: 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":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"b43a5607d2f946114bf06ae4af8f375b26401ca8a772c4a105ff6de2db288dfb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot access automated email design as author: 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":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"79daf893ff84526e111ae67d63b4466f72a9bda118aebbd4d06b56a0fbe89a46"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot edit automated email design as contributor: 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":"ghost/core/test/e2e-api/admin/automated-email-design.test.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"407f4cec5416fbc8d205b2693a309cdb2c4247815d536d5c410d9c5682d1b84c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot generate reset token without required info: 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":"ghost/core/test/e2e-api/admin/authentication.test.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a037f7faf6f3f90120a0534ce6837f01aabef79dcfecbd9d6c87fe39753034f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot generate a reset token for a suspended user: 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":"ghost/core/test/e2e-api/admin/authentication.test.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"884444dbad3c51f06003c4cdc903846d2b9f593de076006f98f11ba788deb7a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: creates a verified session after password reset: 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":"ghost/core/test/e2e-api/admin/authentication.test.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3d24ef056af5abbd065efaf1719c2824cd60cd45565356cda2f8bcfa754d029"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can use a restricted cookie session, then switch to a token: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"49a9dd6547778072adb25cb508ba1b82da0e9f745bdd8ba53b875dc30ae0e246"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can use a restricted token, then switch to a cookie session: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdce31c4e5754362af328804d6fa9bbf1d81e19544318050b6ba9e5f47a3ac72"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Request to user/me will 404 as there is no user associated with the token: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"51ea23aacfdb0553f6b1ca568b2ded31ec0e444ed80c9220e1f62e2e88606b18"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Request to list users will succeed: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6982346a6ada2ffe9ba33389e88692307652a940367a57f9dcfd19a654345d3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Request to user/me will 403 because the backup integration has restricted permissions: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad2e3a2cf9d66b81b13dd83802b0e349b8cea41b5f95c48c765fa8dcc5d88340"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Request to list users will also 403 due to restricted permissions: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"7907ec0238074f5a92dac4397e5ed5901f255c48dbf770fa16f250b3fde56f34"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Request to list members should succeed: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d89c8110578681736eeb9b5ea7f2c0ebe3a4ee178ddeb2327338cf8eda6339f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows staff token on a non-blocked endpoint: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f9420da0c3caf379eef8ae88d6a98cf03e6bfb4aba248b3dc9ef4ae4884ef4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Owner staff tokens can access GET /db: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"46c0cd07da3ec93b2b9f47bbcc88ded9597c7fe37b31d794b6e394e0c98bb1d2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Owner staff tokens can access GET /invites: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65280cbacc7e9bc3a4fc65422ee55bd8869a7e3bc2653996334494eac117d4f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Admin staff tokens can access GET /db: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d88e832188032d433401f2c0857e5a8ae9e2037bda337565dd38f4649b05312"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Admin staff tokens can access GET /invites: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f29421a2cb7ec584f8d3bc240baefd70ac59a65f2a035501809539edbdcb2c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Editor staff tokens cannot access GET /db: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f113d0574c9c077f3054ed2bae5dc50630b0ac478a4814788a6460451b60f92"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Editor staff tokens can access GET /invites: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e72a7dc0639c4801373bde1670639f3bb9fef057bfbfa6c6c3b638bb69a74e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Author staff tokens cannot access GET /db: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"71456db597e696cb8b3acda972fa048212170b4a32a35a8de95a3e7f56daaad1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Author staff tokens cannot access GET /invites: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"d668ba767b116323fad391f48f18c6fcf01ea460fe70bb08c2eece76aea5e257"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Contributor staff tokens cannot access GET /db: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"e864add1ce0e13bc9044fb9fe69b83e997798df6e0a7fd2fa66456e982b2bea5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Contributor staff tokens cannot access GET /invites: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"b21ba74fd76d7c3003e09d3d62478c7ab183328fff98c95c50d8277bb0a52b4d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Integrations cannot access GET /db: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"12007808b3ee3cccf0642bd4c680cb9827e5863d1da93c844372908248d09d37"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Integrations cannot access GET /invites: 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":"ghost/core/test/e2e-api/admin/api-tokens.test.js"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"811dda58be43ce4032e6ed356cc1e9b9f7e0d4b7a06feea1d83648e93b3622ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects ordering by password for a low-privilege staff role: 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":"ghost/core/test/e2e-api/admin/admin-query-security.test.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9fa61c317477bab1ab23671a1adbb574901bcd8de1ca090299c5c5ec3f47955"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request only active tiers: 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":"ghost/core/test/e2e-api/content/tiers.test.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3152a7fb593d87d4e34e3acea1c85d62c598426af00ec5ee1100e28d89599ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can filter on visibility: 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":"ghost/core/test/e2e-api/content/tiers.test.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd0d75cb23965415f6f00983d27df06c2ad06d7bdd26611bab036112e432b58b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request settings: 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":"ghost/core/test/e2e-api/content/settings.test.js"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6498c8ecb1387bf6b87ac5b5a8bac1998bc5ca97bf097bc02ffc0ba73375eb9c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return a list of authors: 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":"ghost/core/test/e2e-api/content/search-index.test.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8a4b5661e7b3b344e8315cb9125b3688eb7884b7430d320f3723230bc0fce58"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return a list of tags: 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":"ghost/core/test/e2e-api/content/search-index.test.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"a81811cd79340fa13d5b26d588e9f8a9f7a97c5ffa543227dd0ef3de0497258a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can paginate recommendations: 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":"ghost/core/test/e2e-api/content/recommendations.test.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"13ca6613eb5c6a4589a3dfd29eba0d6ab31674aa8625abdb98d6fa37ceac4b46"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request mobiledoc or lexical formats: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5246bb9d763e79cf877f2ad7d482280c87135caa0928177ae898d0ae18a99a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request mobiledoc or lexical fields: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1be0a02613765265e8c672e6df59ddea41eb73b3436d33c03f41852119c1147"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors upon invalid filter value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"87497706a3ebc152aa0518276336c2c023f84da2cd2c6b7a08ed40328f7a5f6d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects post read bodies without a public identifier: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab4e97c1ad8c9179bdf4895384a51bd4886da0a293b8e6c4b315e46b9f3cc5d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request fields of posts: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ea2a1ff428cd3ffc64ccdbbe3af69d2477708680b2520c76483ee18b2badb2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can include relations: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"6292a5219ac29dc73416dd76159c5bbe01929eee6e75e6ed1dda8ffd6194625d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request posts from different origin: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"029b4a37493e7b417c5f18ef71962994c83a1a73b53d47d9eda3661c6752cd4c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request a single post: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"675f1c425bef1e917309d7fde3fe51a3ebb71da420c5158b44559705a9df8174"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can use post excerpt as field: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"390afd87bf739d3f170025229324c012f7cbc01817fcdcf061dd09bd16317748"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can use post plaintext as field: 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":"ghost/core/test/e2e-api/content/posts.test.js"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"23a7d1ad3e86d5d203be9f1969c851c9ca318791b8f55cdb3574dd1fa7c0704b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects page read bodies without a public identifier: 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":"ghost/core/test/e2e-api/content/pages.test.js"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6d14cca6ac4247ad78e6ea147f1f08ea8be5718f2f1dff3f88bc03003d4b970"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request pages with mobiledoc or lexical formats: 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":"ghost/core/test/e2e-api/content/pages.test.js"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e2a9e4aa0253e43a21ea67791cad7009787be18d88b42ca0c4182ca7a7eb8c0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot request pages with mobiledoc or lexical fields: 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":"ghost/core/test/e2e-api/content/pages.test.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23c04ad67cdb853e21bea971e620d3d327e06c35dc0b136c46d06458029b34d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read offer details from id: 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":"ghost/core/test/e2e-api/content/offers.test.js"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"288211c22e3b4a61449716d4b2a48e16fdec33dc6d3e3aa01b9361c030028619"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can request only active newsletters: 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":"ghost/core/test/e2e-api/content/newsletters.test.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc6e19c5f7db995e928b0c38654e1d1f0dcb0ebf25a78f2b643592ae16bb7b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot override filters to fetch archived newsletters: 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":"ghost/core/test/e2e-api/content/newsletters.test.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"be503e230322d5f3398dd98dbe45ca8a056c6d1804e6c470121d2f061978bfbc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects author read bodies without a public identifier: 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":"ghost/core/test/e2e-api/content/authors.test.js"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"de1e94166cd2f65e5965d2445a1f2b4bb217fb96bcb07b08f4079a970cce4e11"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all comments of a post (legacy): 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a681194b00a51b3d76e8f481008280327797581caa6f7471b8cf48d0e6485a3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all comments of a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f288b86fcefa96feaf32dac7ca0b3d3a7f112cf4d8fe22e0233558ef7635831"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot comment on a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b96af97826352ea906535f9dfacfe1b1038b4af7fd060f7410f66712a62939"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot reply on a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"12d0797bb4a65053146ffd04c1ca5136c5c599948c404444bb7b4a641d9787b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot report a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e54cc69771a0571020e3d0d2b9c2f42455298fb2242acac2047438c7685364"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot like a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5563e90e1525b7378e34b5554b287d90b5e1fdd9352f47112345974d3da1e1d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot unlike a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c39c4689299f3c8352ccce264bf886cf6f43aa6c50d4fa360b8754cff592fde"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot dislike a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b496baff0aac33b86b1c7fdc58897dae7cb6168aada30210b08e42361c8ac5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cannot undislike a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a6a8c2ed0fd1856847f48f424d14a48b9e504afde83d69e15bc331312b3113"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all comments of a post (legacy): 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"8012e484e56431c93a0e42920722623ec11dd9bc06b10d4ceaeee03ca14ee460"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all comments of a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"145dd323c19a462085332e90502a0b6a68bef5c6dcfc69c6aaac5d36313d68b3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can browse all comments of a post with default order: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"15943f4b090b8211ae38f488c6284632d4f0d914f6b7db30b4967a01db39a9b0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes deleted comments if they have published replies: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":760}}}],"partialFingerprints":{"codehealthFindingId/v1":"d348f873824522ff3cfb3100cfefc3ce0d44108985cd2536731f3795eb31d8bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot like a comment multiple times: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":1781}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d418f82170d1ac40b585280844676c83f18b23276d341f02e483fe56dcdc4e1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Cannot unlike a comment if it has not been liked: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":1895}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c00778664a9f1c8e09f1bf64641052633abb9bd4fd75975baa9b383cc9e4410"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not edit a comment which does not belong to you: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2031}}}],"partialFingerprints":{"codehealthFindingId/v1":"6734f4a676e60caedebf65002d105abe570176b6d2a920ab5cc3d68db43a1777"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not delete a comment which does not belong to you: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2059}}}],"partialFingerprints":{"codehealthFindingId/v1":"580a141b34126a41abf404430b4874a0a8933b940f8b0e23e0ae3e84a52930f3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not reply to a reply: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b34ccbe75ea887da1d1e0f667aa6240efc7520260fbb62caaa16edd07d24189b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can fetch counts: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2195}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcd90e8c23c5991318c842d9deaa83eaa2fbf641f40ab7e35d75744c096c1d0b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can browse comments with replies to replies: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2270}}}],"partialFingerprints":{"codehealthFindingId/v1":"644602fe174d0ace52b1e68e5b7b74e3af103948de3382accdb19451715eb59b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does NOT notify post author when they comment on their own post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2574}}}],"partialFingerprints":{"codehealthFindingId/v1":"d62e610860813b2910fbae75a97ef2de8d87693f3ede288aa73ae2f79db73f93"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not comment on a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2622}}}],"partialFingerprints":{"codehealthFindingId/v1":"08043ead0f62e1c6b61a4e5f6cf29582a2ba29c5e10370d6a28159fd7edc3a31"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${desc} is allowed: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2705}}}],"partialFingerprints":{"codehealthFindingId/v1":"f044439fdbe7fefa63b78aed4cd5594a04f52aecb5b411e7355937915889b0f9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not comment on a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2811}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce2c4619d51380b9c9169bd625ecd565c813878de160bb679679b6caa18ef953"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not reply to a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2815}}}],"partialFingerprints":{"codehealthFindingId/v1":"df01234b78d93f5ccccef1b494615c3534b9f853e6f9666fb2af340680588992"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not comment on a post: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2895}}}],"partialFingerprints":{"codehealthFindingId/v1":"0073afeedd2c1dc722e73abb323db00a72f09cfe7a83ee900f9cf6f172fd1a87"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can not reply to a comment: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2899}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fb373b3c27e4a6c76070adc1a911a6a47f2d56b1cbba3339c94defe56f1016a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects anonymous visitors without private-site access: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2971}}}],"partialFingerprints":{"codehealthFindingId/v1":"8733014b5a06a80781463ab952d6d564a3f2a697a219b2f67a0da5b32b0ba179"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not treat a member session as private-site access: 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":"ghost/core/test/e2e-api/members-comments/comments.test.js"},"region":{"startLine":2975}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a26f455281acef3ba008d2bfea348eb31aefaa0874923b0b0be39c9b075b3a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return a JWKS: 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":"ghost/core/test/e2e-api/members/well-known.test.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"63e71fb5c81f42a91afe2a4c36a0c04c089807bedf3d52abdd9eb376a4025411"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Responds with a 401 when the signature is invalid: 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":"ghost/core/test/e2e-api/members/webhooks.test.js"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"2233d3d16d578a8ebbb7d59fc0d15c22982ee67dc3120f497b258eea256bb812"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Responds with a 200 to unknown events with valid signature: 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":"ghost/core/test/e2e-api/members/webhooks.test.js"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d2b94cfdb14a9858903626c886acaefa06d46ba0c98677bd1b6c11e226e6b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not 500 if the member is unknown: 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":"ghost/core/test/e2e-api/members/webhooks.test.js"},"region":{"startLine":1923}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f698e5620d1d69ff61b0f1bc4b90c2e233725849e0190cfe44c94a4445e618a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: empty initial activity feed: 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":"ghost/core/test/e2e-api/members/webhooks.test.js"},"region":{"startLine":3615}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c54f61d6aaf9c79c046e5f2f237f4c4b8c722c69779f62c6346c2933858c876"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will not set a cookie if the token is invalid: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"541c800059fad4ec893934a5d72b5548466ee81cd588d814842a5fb32000052f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will set a cookie if the token is valid: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab3b262d7b7bb62460922f8fc09b19c9af6d0f8a2f7af72b58405910ba1de0d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will redirect to the free welcome page for signup: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"00271e72dc9263895c2830cf19335af81d375816278fbdeb0a70005a73e05796"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will redirect to the paid welcome page for signup-paid: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf75d02acffd3fecd4737e61b660fe6e28a5aaf5104c0d7b976615c48a153bf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will redirect to the free welcome page for subscribe: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"f95eb011d1399aeb18c46bd93a68476abe671107f4d0b6883303196ffae349e3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will redirect to an external welcome page for subscribe: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"781f28f890cc42719fa5f1986aa26362fc3a4946d678e945c95150149cf5f0ba"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will create a new member on signup: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"0921793ccbe40b3761c423559e1c9cba77fa84820d4f6d9b92801cebab6f4ff2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Allows a signin via a signup link: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"243da897470b4c8c0cf35de7311391890363ccfe6a9f520bef2fa3e56ce9093c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Stores UTM parameters in MemberCreatedEvent: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"cad360a95f4f1f8f14f4e58cb82a2f53258129a0988c6b6be2d91d0f720d394c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will create a member attribution if magic link contains an attribution source: 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":"ghost/core/test/e2e-api/members/signin.test.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b59d9f601ae3d284167ed2a142f928573bd6c17df3d2a2dd240863117dc691"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when the integrity token is missing: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f70d745b37e1d74e3119e41e685dec7352164336c612139fb525e007931b4fa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when the integrity token is invalid: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb2718794b889edffa0de5f6b373f98e3d34a2bc11e35273ec65e31c337c1ac"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Errors when passed multiple emails: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4875a85fbdc60274c8d973e0963e62e68324bfdce513ec86f4482555de174b7d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws an error when trying to sign up on an invite-only site: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"850d14777034798b100eb3974d6215e9bd4ca280c303670c5615c97c866e9d33"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws an error when trying to sign up on a paid-members only site: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48ec2083626c2d5037937edc63a79f34db1c99d9576dc5f7d4d4471be511e1e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws an error when trying to sign up on a none-members site: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ef5689ef4c5cad1127508163fe1f52339cb04c02b90d48c1165963e9f80e39"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blocks signups from email domains blocked in config: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"6add7296faf10be8b144a3eec8f685bc93a4c3497c3f9abb2f321eb10ea93324"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blocks signups from email domains blocked in settings: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"097c4446787c6019591901f30c1fa4efdaa21c62393203ecfcdf4d4941d17bba"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows signups from non-blocked email domains: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d7dc858b6d984eaa93f2b8efc8e85517ef2d2bc26097fd042e3cc7ca005eb6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blocks changing email to a blocked domain: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdfdd807e290b0819083b438cd2fecb318d90623b839b6ff06f8cbd56de4a7cf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows changing email to a non-blocked domain: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d514af5581b2859b5156e974a82cc8be29de279936f086943d9309e42af8e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should prevent homograph attacks by normalizing unicode domains: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6775ce66d753ba163db7f1f9e23f03d151f36d260557fe27dfbabd1fca06ce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Should return empty body for signin magic link requests: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":866}}}],"partialFingerprints":{"codehealthFindingId/v1":"e191349b1d2ea2a4e54401d22e4e7ddfc8dd57f3094899925cc1b1b23c531ff7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Should allow normal magic link authentication flow: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":908}}}],"partialFingerprints":{"codehealthFindingId/v1":"22149a38775d47d12a9729079b1526fccdea380ae4aa7cd1e101367a846c6930"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will rate limit OTC verification enumeration (IP-based): 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"478464c50fb489a2b927b4e79773220d4918ebbe797afa638bbd123e7839ff1e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will rate limit OTC verification for specific otcRef: 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":"ghost/core/test/e2e-api/members/send-magic-link.test.js"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"e238986fe715f1c43fdba08c932da68753a364456f18987faf09901cfcb67a2f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can not get member data: 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":"ghost/core/test/e2e-api/members/middleware.test.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5bb551bb2229c7b1d072cc5a8684b95e711bb84042305be12a276b52deaff83"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: projects a free member: 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":"ghost/core/test/e2e-api/members/member-projection.test.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd82b7f2cf95bea5042b67439f4194366699774ca59b5660fe374438eb07d6dc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 401 when not authenticated: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"7defe2d6f3e9ac2fc3c528cd0c2d8f5d0d71397c18bc0a874e8444bc3c71c999"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 401 with invalid identity token: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe3ed95ed2aef6066f0084501ec66cfe7927afc657b2b6396cf3d5594cad4d15"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 with invalid redemption_type: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb9e29ab787e87216891084037834196aae712c23b1d1666334754cd773e698b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 401 when not authenticated: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"de36b9c0a758bc3a482039a329fae6de91ca0a1b557ae68b8546e8bfbfd58fcc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 401 with invalid identity token: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"687674b67bff5b5144afd687febd31e12e829081c529414ced9c816afc87289f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when offer_id is missing: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"91e6c3f175de9aaf9dd96b99475023c586e52941457f312ee5882eaefc12d982"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 404 when subscription not found: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e23a1a560376522663090777e137922d479fb6a18bc1392ed6e30d50eab0f8a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 404 when offer not found: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"2464c18ddd2aa52e285814d50942f51273441096377902417d512f18120ea69c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when subscription has an active discount: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"9042ac87915ed34b8da52b0e840c982858841a88a122bdefbea6f4398438035a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when offer cadence does not match subscription: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"3000a0fc003c6d140af551e13512fd0ed45dbbb9505687da765fffa1daefb6bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when offer is inactive: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"449a0b72de542f2c92e6737507f12f88171d7ea654c3f8541226d551fd40a6b9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when offer is a signup offer: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"09eb64ca847474c725a2f6c6cf6d91af429c869db41e3211e7f86d54c7a33a3e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when subscription is canceled: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":949}}}],"partialFingerprints":{"codehealthFindingId/v1":"e43eb46bc2faca2ef5657505a21850fad5787ed146af46b367780d24001715fe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when applying retention offer to subscription that is already cancelling: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5b0b717b2abdcfa29dc8cd06a6cde29f14e23f1ca9999233750bc48767bc4b5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns 400 when subscription is in a trial period: 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":"ghost/core/test/e2e-api/members/member-offers.test.js"},"region":{"startLine":1028}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb778fa6ca4a1bfb66d83e3ff5eac837ca9d1324dc449a5f11e5e15d0deaf8b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rejects unsupported, malformed, conflicting and non-paid customized gift offers: 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":"ghost/core/test/e2e-api/members/gift-subscriptions.test.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd62044d27a727c0b17b299eb589e81037161180836fce99b6f11f5b1457cbe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Rejects purchase with an offer: 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":"ghost/core/test/e2e-api/members/gift-subscriptions.test.js"},"region":{"startLine":690}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7edf9b5928aaeb7527fd1a9971d8769922d4097ed8c2771a7bf437c1335eb02"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 401 for unauthenticated members: 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":"ghost/core/test/e2e-api/members/gift-subscriptions.test.js"},"region":{"startLine":1717}}}],"partialFingerprints":{"codehealthFindingId/v1":"1163722cd0a3bfbc2664d2e81fa9b1e56d00c2d93a1e42774746122d049e9655"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 400 when member is not a gift member: 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":"ghost/core/test/e2e-api/members/gift-subscriptions.test.js"},"region":{"startLine":1730}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe18e26b9e3fa6041f1ff107ffb1cf9206b0a6dfd4f64034fa7a460fa61dfd5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns 403 when gift tier is archived: 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":"ghost/core/test/e2e-api/members/gift-subscriptions.test.js"},"region":{"startLine":1772}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d3e4add94a92648efae11daca120ef2adb4a508d073982ba176bd026b9d8f17"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Allows authentication via session: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2031cc1054de26e0dfe4b6a144a0274ff317795178ebe160c4d12e378353f00"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Allows authentication via uuid (\u002B key): 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c94fca02d67a6491af4f91b57634809cd848634fe31d4ead6be541a56e8544"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws for missing key: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"aafce0ab0b9b9ab07e65b1d959f2ea9beb98dd16aab942421c238fe8aaff90b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Thorws for invalid key: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e94edfa3435f5b1f10efd527d7e9006c384b25cebc02130ba23b5e52949891"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws for invalid uuid: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"97464a1953f3710a7eab9b4e1e8280501d53d625f8a91142e88cbd3403fc20a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws for nonexisting uuid: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb78f6b175a7fc3c3aa65b7789c59927baf9ce4ada1fa7f328d86706de5e3c4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws for invalid score: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"e27da78deea082c670ffb68172431862ce57a8ac4c15d621f3e6c7c9a4d4babc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws for invalid score type: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c669c5ffe62474e58ba937235315be1d32862b828d14ca13fe4ad42fd171024"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Throws for nonexisting post: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"9250a58e615f226234c62dd07c56b24d9eee0f5ea0247e312102f8dc574de3d9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can add positive feedback: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"f945d88a043d2cbb6844ef86e39b5bd9893d9e3ec7afe130660ddaf6eb1df891"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects to the post url with the feedback fragment: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"5551844b1acf52941a8c42fdd3a6926aa7cb3369de65267224ed76dceef20c5e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: redirects to the home page when the post no longer exists: 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":"ghost/core/test/e2e-api/members/feedback.test.js"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"f04a91e34a64c83bbe9f45315a7ee26404a372e396540b2a93ea3283211e745f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a checkout session with a personal note included: 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":"ghost/core/test/e2e-api/members/donation-checkout-session.test.js"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"69da6de3c9d996170efe7551beee726d56e27ffed428389b46747054fd1affbd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not allow an unauthenticated request to create a checkout session for an existing paid member: 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":"ghost/core/test/e2e-api/members/create-stripe-checkout-session.test.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa25e8a9f21bf48b04f146da4dd16996f6cebf5859c340db3a53e1ed0f9ab94d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not allow an unauthenticated request to create a checkout session for an existing free member: 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":"ghost/core/test/e2e-api/members/create-stripe-checkout-session.test.js"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"638a01626ce74e0b6a3b4e9378fc4d23e30772e20d8b67c70079175c3deb310d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a checkout session when using offers: 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":"ghost/core/test/e2e-api/members/create-stripe-checkout-session.test.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f6748c3ad321075ce7d0c79fc8ef797977350e575c1ee3a6b8fb6c86d0d668"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can create a checkout session without passing a customerEmail: 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":"ghost/core/test/e2e-api/members/create-stripe-checkout-session.test.js"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb9345c34d1bad44249434b43d05d059df415aa14fbea6d543c409a151a1753"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does allow to create a checkout session if the customerEmail is not associated with an existing member: 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":"ghost/core/test/e2e-api/members/create-stripe-checkout-session.test.js"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"0892996668ae4f61880832a06832e52e5c10dc945d9b0b6522c829c89fbd1790"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read announcement endpoint: 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":"ghost/core/test/e2e-api/members/announcement.test.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0995ae9a67f3d555f97d84853eb9a576cfb7c780256b1989e8b3ccecddd387c7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can read announcement when it is present in announcement data: 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":"ghost/core/test/e2e-api/members/announcement.test.js"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"df4b9d0f114a7a131f463b0c203c953f8b59a83140e45a0dfb8e32d9fa188b07"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is rate limited against spamming mention requests: 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":"ghost/core/test/e2e-api/webmentions/webmentions.test.js"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"6417c6e8ba69617dc571fc99b866d759e48e1795b225876256b4fab4064c5d35"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return free: 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":"ghost/core/test/e2e-frontend/member-stats.test.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae7d6728a9a981272aa4fe4647447d1fe569e7df6486e0daeb0705e5b000cf85"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return paid: 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":"ghost/core/test/e2e-frontend/member-stats.test.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d6b04a2572719868325237a726a8ed91bf1e9f4dabb5babd91b850036c0478"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return comped: 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":"ghost/core/test/e2e-frontend/member-stats.test.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"efd797bd09a77c48becef28c75edbf7676c9bc698629924fbb1068a57600c551"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return total: 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":"ghost/core/test/e2e-frontend/member-stats.test.js"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f5e5e9a480c5c6ecbfe803730cb8239f8c9f849606456024ddf43663d4da6a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return a JWKS: 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":"ghost/core/test/e2e-server/well-known.test.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3fffeaf3290f34540539e01e2edbc5ea4844b8c9e810c6674c33446756a1ec8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles same origin request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"832c530a91b396d665e884e40b77a3d180661c258385aea9c741b0c10a5bbf20"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles no origin header request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b19d564ec00ad13f876c7f7c2db9f7b12fd8c13696c69dae75b095ae7fa607"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles cross-domain origin header request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"313eb248e029a19bf1b6619c8ec074836f6255446977cb7066d09a299bb3a4e6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles same origin request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"238a75ede63efac3957ade68da5fc396ffba9949c814ce1d5bf73c106bf7230c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles no origin header request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"15888f77b930ba60ed0f19c285812f371579ceb9de60834bf8f61a84c90e5df8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles cross-domain origin header request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbb47c51fa32941eb0f219981ab94a87982b95967a0103c3c9903df3b98a7db0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles same origin request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"78a36e8c01b9e2c1e03a586d745e28f21f046f88f1e634f569784778933753cc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles no origin header request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"310941c817aecb2bd2bf62c9cdc8df9d0566b58bdd1f208b4e8bb3acd82f2b51"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles cross-domain origin header request: 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":"ghost/core/test/e2e-server/1-options-requests.test.js"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"9185968b3101c7d48820850199678b244256687d9b4b09a1c1a1aa09feae3dd9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves urls: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c64b2c05aa25042589a0065b713d0d43c1e3ed6e284de5b884a5664ae689480"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves posts: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b677161cd35b3542f49579cb75ead69117d6a2902df57f9ed81b07e0d969786"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves removed resources: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd6e2367d108050a666b8f5286080633153e996cea33d18d3c4e35c5073df2e3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves tags: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ef6c062573aaba26ad4800bbbd018b6400820f610c940b1a4fdae91f68dcb75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves authors: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"0654a595b40f58599c0f01fb4f37bc65a5a9b38802bf35a58d9b0864622d85a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves email-only posts via id and type: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef56a06f22e4920d2c2275eee618531053ad93f8aa46354463d8ed48bc5ea05"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not resolve draft posts via id and type: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"754a1c99bb04b78b6c817617328ccd51623266fb32d3a934c4b8a3dd5daa797a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves urls: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"8298cfaa1ee084cc179e20c5d5926ad40d515a4c4b4972a97b52625e70e39c10"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves tags: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77ea11e27030966f3cc127c3bdb6a43a7fb9f67f3358332bad54fb5eb3c1a51"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves authors: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc6971191e8ac737f3da716769a99f9487c5008bfe4ce3b01a908e530a11705"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves urls: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"e663975e9e639a4e8c50bded03c73581ebad70a1da0e2a7a6a381f6036b05397"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resolves Portal signup URLs: 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":"ghost/core/test/e2e-server/services/member-attribution.test.js"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"e558c1cb55d6f61c906112063a6d1c5e728f4468a9816a9cb28c57e8947f2dd7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: tag.added event is triggered: 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":"ghost/core/test/e2e-webhooks/tags.test.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8f7be93d6e55483556b805fbea772f0c47a5e30e8a5735341c7da4dda747d95"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: tag.deleted event is triggered: 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":"ghost/core/test/e2e-webhooks/tags.test.js"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7f328f6b0f3380d348613fedf77740e3f0981e5e8294f40919a7ca60ae5880"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: tag.edited event is triggered: 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":"ghost/core/test/e2e-webhooks/tags.test.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"336953073000de4be620666bf6b405696625233ed0381e2b1a1ae054c5ca52d7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is triggered: 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":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f1356f2c6d757da495f13806383b3be589cc26f43559ed8e7e77566a10878e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is triggered but the custom integrations are limited: 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":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2392c911154aff55b61e705f194adf3af99addfa279ade60d9d317c0ac1ec8cb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is triggered, custom integrations are limited but we have an internal webhook: 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":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"4caafb382590f741b410d6e535fee3a5eaef0a0bf3a14b1ebdae793f9d68c8e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is NOT triggered when draft posts are deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"af135ac7713eecf97bd79ee2e49e91b09865b679d71b5766c51f575b006ee975"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is NOT triggered when only draft posts are bulk deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e1dc03266f51cddc5347589e0c5f810bff3de5690941f5272939213793a8b5f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invalidates the cache when a published post is deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"1729e361a5b6d2807f45bc029617beb4a8a7d8b9ebd6d41b103aa3b1740575bf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is NOT triggered when a draft page is deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"c27cea1826d7a51beb93f3b80c5cf9cd750b78bd209f6ec65add5693cdb648ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: site.changed event is NOT triggered when only draft pages are bulk deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"56357612ff2e73d40fcb69b2f6545283a759fb208e61f2e9787356d715b3225e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invalidates the cache when a published page is deleted: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/e2e-webhooks/site.test.js"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3c851d83eaf79aa7ccccc499e6f18114bcab2d8f0bc67abbb12525dcbb07b0f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.published event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"23eced9e4998ac61ff363e39169145113255082dd201fff03c63c4319570c966"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.unpublished event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"4955d407c6556b85ff087c9edeb443bb99ed43314776431d11741aa4361d69a0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.added event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4d59bf61fa8bc22e35e035b7ca0e398b3d42537ecc46240480ccbb464de0662"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.deleted event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b5dbc3fed1764646ef23598ebe029d66d8797e7edd4dbdb2406230c6a24019c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.scheduled event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"2932b10c9e02a2e936e518188e42291631e0b59172433df9365cbb281b59bf98"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.unscheduled event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"0966096db527444891b93971f637ecd989124330b3ccc8fd71373aabca80e368"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.tag.attached event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b8fa470d15454622fadb63b88fc7c97bf1ec1960cc716fe823463c56362270"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.tag.detached event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"9803ed54bab2cb3c7da0a2fa7f3f6f6eb67b99610afcfd7e0c4227bc784db1c5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.edited event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb19f48895f48f8894ae541c76e8f98ddc79d4fa956983f62ac9ae8671fe6e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.published.edited event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69017fc68d788fd7c036fa7abe615bea35469e6c1671d9da2c880812cabdf42"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: post.rescheduled event is triggered: 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":"ghost/core/test/e2e-webhooks/posts.test.js"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"6317a24b0b9bca851a9c6e1e0416d7502dc747810de94fccdd3cd77c28416f9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.published event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a500d591ed1f627f0f95ee7e2ebf2d711f1af82818a09f6bee050ce2a7cf27e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.added event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9acee8ac22905677fafe4e2f10f927e42f56bdae9c0e0022f130c3b3e7d37a5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.deleted event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"293630e3facfac771a281ad9f0fc194c8068bfc56e3201d077e40800323c991b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.edited event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df894ed079f45cd847da92aeb3dbbe703d394ba4ddae8d98afef3d3b79f7753"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.scheduled event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"21df4cdf7a8892283f59d93914f7a7e50d8eb1d45c2a87d8f51fd60e1d8b329b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.published.edited event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"94fac4089239391be4565717616a52c50357d447eaf56b7d96034914dcd68b97"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.unpublished event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"924d28dfb80af67ec2cd0a91496093bce8bf90db0c73910b04b3f91c7d069179"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.tag.detached event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc88adab9f20b3a96f75a3118cb905b3a1eac1cae56e73f630c47c3bd6f41d5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.tag.attached event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":522}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd72f937c035b9f84561f599786d8ca646604303b104b30c9bf683175b78f1f6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.rescheduled event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d0a533d9c3f861dd3c56aadce205ec736751b3b3064cc441547eecd8a3e3ae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: page.unscheduled event is triggered: 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":"ghost/core/test/e2e-webhooks/pages.test.js"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"c85fcd088327b27491ede59a7e3d5189eca5669fae6c6c135fdbda9b34a2b1de"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: member.added event is triggered: 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":"ghost/core/test/e2e-webhooks/members.test.js"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f123063f6d506630f7191ad5595414c889e76e2cb8440bb2e498510feb3f3d52"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: member.deleted event is triggered: 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":"ghost/core/test/e2e-webhooks/members.test.js"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"921a32317a5257e5022aa0ddd40c9bdab19e7a0d5279c4f5ea2d7534f9db397f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: member.edited event is triggered: 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":"ghost/core/test/e2e-webhooks/members.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe82dac0e1d00fcb897d89aaf23f72dd0e6e4732a594a6890dfb69813715baec"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import user with missing allowed fields: 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":"ghost/core/test/integration/importer/v2.test.js"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"86c8210ec48720d0c50032e68b66bef343684497c661c49a9ffdfbfcd4d9d313"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can import stripe plans with an \u0022amount\u0022 of 0: 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":"ghost/core/test/integration/importer/v2.test.js"},"region":{"startLine":1491}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68c92ba25cc42d3750a4dd5e9d8e77d8ed6cc5bd3b4de598ba79f3863daf096"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can rollback to the previous minor version: 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":"ghost/core/test/integration/migrations/migration.test.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd1686c3990043c9d1f1e9bc97f4d8bdb023248501552231856eb0499acf2b7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can rollback to the previous minor version and then forwards again: 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":"ghost/core/test/integration/migrations/migration.test.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4258242975b1a4fbd5a01887832d2848e5c23a516c338ad84f01ed0afd6dd6eb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should have idempotent migrations: 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":"ghost/core/test/integration/migrations/migration.test.js"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"083eeacf6562771872e433011b03dbd0cb7b528f4a34e404b4bd2c5981ca9650"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders a simple paragraph welcome email: 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":"ghost/core/test/integration/services/member-welcome-emails-snapshot.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"17dc32bdbff1aacde64ac6664e0cbfe3e773790e08ab52bd1439293d19378c5e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders template variable replacements: 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":"ghost/core/test/integration/services/member-welcome-emails-snapshot.test.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeba7d134dbfce960c8108a21317ef82d1b650d66cf579d2e243c12cbfb7a795"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders fallback values when member has no name: 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":"ghost/core/test/integration/services/member-welcome-emails-snapshot.test.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cae56eaf188cb386ccba40fff1baca83a63298fdb7ad1a1abf830a257523900"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with a custom accent color: 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":"ghost/core/test/integration/services/member-welcome-emails-snapshot.test.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeadd1283afc2cfb7a0feaa9b520c4d57ed0d5cbb35ad8ef170112c03a4ba9ae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the golden post correctly (${status}): 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":"ghost/core/test/integration/services/email-service/cards.test.js"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ae65056251e4484aae8e47fe1cf348f258320ff7e26209e06811e8b16264b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: only sends one email across consecutive runs: 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":"ghost/core/test/integration/services/members/send-gift-reminders.test.js"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7597718a6ade0b666d7635784e3a1b2e020bd57b12bd3f5ddedf6d11d0f53c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is setup? no: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"46cd68a9e7715f2c96b77ebdd7cb3d181d89881eb3572f88a5741cce4af55ea6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is setup? yes: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"49efdf1889f1e6283826649e4d7f391596a6375ff3bc47889ee29d3d82ed9e0f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: complete setup again: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ce42f25f7447f6fd44166446fcd1ced3efb6dd700265b3053b6891a34ab5b5e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: update setup: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"995228f1c70616572d7b2d066d9dbbe6a029717866668270ba637b94d13c0008"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: check invite with invalid email: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc5f5c2f548b554dbe489e5fba9543cb94202c37cdb92bec79bbe089a18f9178"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: check valid invite: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f41845995b3089a1c8170197afd6e73e12864a809cf7532f44337f82faaf163"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: check invalid invite: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f3c746594cab185e1f8de344814e324a1c1dafbf6395c5411892ba976b2ff3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: try to accept without invite: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ef6ba8275851f8186e5fb956c2fc89828c3e5d4f1617fbd4966f3df6f9b6705"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: try to accept with invite and existing email address: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"6698227da95b9729296a15671ac5ca6df6a9a869dd28470bb80b26eaf0fcca83"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: try to accept with invite: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"2261f9028f40ad459940c3dc9044576dbacc59ce3df484ec17977f86337fa2e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reset password: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"027cf2e42bf2ed1ed74fd9412fc25325239cc51299eb30664fb10d19b31f522b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reset password: invalid token: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec048983c230827276d79d96d3e3545131d61b0951a0f7d6eaefa1e84ec765b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reset password: expired token: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c96d1634c59958f6b65958f95e5a380997802208fc9b546aff856a8212faa6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reset password: unmatched token: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"b233e9843b030182ad1ca4f915f8452e8282d5fb13786d092f50afae2ddd75b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reset password: generate reset token: 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":"ghost/core/test/legacy/api/admin/authentication.test.js"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"f68466b19f3785373e94999c0b03cd22897eb1ab9bc4b1732ce35b4b455687ed"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets last login time on successful login: 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":"ghost/core/test/legacy/models/model-users.test.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84c9909c80dd84ff062c3e640d41475f828d034b7a913ed9058607f5dbf4b4d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: update post tags and updated_at is NOT out of sync: 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":"ghost/core/test/legacy/models/model-posts.test.js"},"region":{"startLine":1809}}}],"partialFingerprints":{"codehealthFindingId/v1":"d39c3b82c65e8bd9289168f5da0a9c8fa2c8e658c31db0aa7e30f33aa3a742ef"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: update post with no changes, but updated_at is out of sync: 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":"ghost/core/test/legacy/models/model-posts.test.js"},"region":{"startLine":1820}}}],"partialFingerprints":{"codehealthFindingId/v1":"5333474a1fcadaa6a2fdfe1cc28c01527f4b726f000c46bd87d97071c648b237"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: update post with old post title, but updated_at is out of sync: 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":"ghost/core/test/legacy/models/model-posts.test.js"},"region":{"startLine":1831}}}],"partialFingerprints":{"codehealthFindingId/v1":"331d094dc504ea20f009fa88e1a2584e657727e9beb3036bc1eeb020ec65b9a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: It is correctly mapped to all a members subscriptions, regardless of customer: 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":"ghost/core/test/legacy/models/model-members.test.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0165d0ca23d83c21574fe2a3196adc405847a34ca518e3b4b3cf5d02f16d3f3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Products can be added to members by the product array: 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":"ghost/core/test/legacy/models/model-members.test.js"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"a355e2d2b8ac22189eb34a00f75a57763fd1dd0461aa680b6805241daa97914a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Should allow filtering on name: 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":"ghost/core/test/legacy/models/model-members.test.js"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9559be8baed6ca9edd5bb6ec333a9e87862a59701922807ce9dcc2c440de8b5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Should allow filtering on email: 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":"ghost/core/test/legacy/models/model-members.test.js"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"826c34c7cbc91aba43eed15882444daa3b6afdc64f945d449803da52cfc1cd0c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: timezone changes from London to Los Angeles: 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":"ghost/core/test/legacy/models/base/listeners.test.js"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"82fffee09d4237771f25b129a3b08e9ef1cb01b41639b71c1cff665f4009dd51"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: timezone changes from Baghdad to UTC: 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":"ghost/core/test/legacy/models/base/listeners.test.js"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"b145044584abae311c909f4b7138c64d1b2dc470f1bf8658fe42d4388939507c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: timezone changes from Amsterdam to Seoul: 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":"ghost/core/test/legacy/models/base/listeners.test.js"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5e2986f7dcbfa4dc31f9703b78eca24aaf2cc49b5f65c56f23a599e0303370"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: browse: includes newsletter data: 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":"ghost/core/test/unit/api/canary/utils/serializers/output/members.test.js"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68ee333f8ffeda747057dc64a72d62db7af85bef3f1ee0dbeeb1f7d726ddfdc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: browse: includes tiers data: 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":"ghost/core/test/unit/api/canary/utils/serializers/output/members.test.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"946d0de05651fca20f1c7fe5815c0db3464df0c9e594c20687a47201f873ab22"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: read: includes newsletter data: 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":"ghost/core/test/unit/api/canary/utils/serializers/output/members.test.js"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"afc9463c53e03c412e9645fd0289aaf1d199cdd609dc859f6b0566c8b8cb748f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: read: includes tiers data: 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":"ghost/core/test/unit/api/canary/utils/serializers/output/members.test.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb193f0d443a75d23cc624b4b450a6ce359236c4c5c7d60e2eeb6685f06a197a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with required fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/webhooks.test.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"db71a2f757e995113ec792baa839ba43ee6580881d242ed64ad89bbd3390609b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with required fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/webhooks.test.js"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"946ace78997d3a8f27e932f5f39777871c6c43d7f2b211ef0b65156caa6e5aa7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with required fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/tags.test.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46cb775d6e5816f7deba60a7e66b388e8db34a44b48995b8955572a628b035c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with some fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/tags.test.js"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"18e93763b0c8e24a27c37f93109c90300b6b816bee6aba3e55dab629961aa33d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with required fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b93ca86ac00ab38f3d77275091c54138774eb2ae4541b32c87b535cbf13b808"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass for valid NQL visibility: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"be371184cecf8a0c6602a679b9201f48559c3b7f069ccd707df443f93d4d9877"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b21b0c2ae0b1f5323095cd9b18c3cabe52f073545b1a7f519d9d9db26292db8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with some fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"f332a4084bf4d397c87fae93bd4ff47ece670a0dd1bc9e11d6f8c04ec69dc592"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with valid authors: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cca42da99b612d6ff8085d1da5ccd11d04fe2387d3fa55c0364e08ac1664498"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass without authors: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e88170bee2ced1b18c084a70526bd56a34b435fc3c12e48ae6ba24899c8a59"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with authors as array with strings: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacf89fd7d380bb70f2f1129c3f6254626e0677e43f1b9eb918a190b36cc8289"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with authors as array with strings \u0026 objects: 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":"ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"1279c5acd4793feebedfbf4206245ba4b9f719287f093e901ae37ded023c9847"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with required fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d5ec40dcc4171c0a27232bc1c9be94f0c7d0477c9361e04e0304bb7702577cb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass for valid NQL visibility: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"94b4cb00c90a83c052a53d9decd5cef94173b450795f98ac36232800c3f1be7a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"db75d06e7e787e306f1d24616b76e102ee00e1b2af1afc24110591e5a9266123"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with some fields: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7161c5a5a8e0aa59a05029dcc92a8e5284da956bf6227568f1d19179a7d7193"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with valid authors: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f79e546a4c2dbb8b3ff609927bf593c4676d96b44ccf4c34b1d6ca30e3e850"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass without authors: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a2e851981c0770eaeebb4e5b62682c84f613226fdb396426873b6ba3b4b0a3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with authors as array with strings: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"c89981f8060c87029d44f849270aa29cbd287bffaa7b4b6f85668af66e0655ee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass with authors as array with strings \u0026 objects: 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":"ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"2745e1da1a3f8d0e8513bc4161052b2bb430214017b489f4bac8c5e3129f0cfb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has input_password helper: 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":"ghost/core/test/unit/frontend/apps/private-blogging/input-password.test.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e59bb27ba8691919203213eec6c5bb9ad8724b0488d8cc4158c0e94884fbfb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits strings correctly with the default separator (not specified - a comma) : 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"31d40f63dea15b1491602698f91321a7581b8a182ce4b170768c5c2310892dc1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can split strings when the separator is an empty string: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"51cbe576c2738f3ecb7954777bbc700ac895ac3c6763cb31e50b213a02176d12"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns an empty array if the string is empty: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e6abcd5c9dc7def45fd0cc0eaa3efb9191bb1e18ab7115f7c3714266223c06d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits strings with a custom separator correctly: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"54e405abd5a8ae9455a493d021d8590380b31a3037e580bb21e4413e2a79de7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits strings when the default separator is specified: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ba630f00a5ae3b91773726c302d54455a593e386342357a243e06ac4cb19ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits safe strings correctly: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"48886e5bdc673c30805f059e6ffe013d3b27ea5f111aa1fef0a3611cadde9deb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: escapes unsafe strings: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"227368f0e256a94f5515c0747d6fb0a4284eddd3f8db77ff79b18bdbcdf48c72"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not need a block definition: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b1b9f4c5d35aad3a9226f10e02f6310da756c29f0cc2b2a2f89ae9117e3b89b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can be counted: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c7aeaa32de7d85dded4d22ff98954e86a3f700b8350ee77b08d08f782de6b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can be used with match helper: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"7327df67901861605488639d04497d61cfc46c9060831e964fe900b960abf544"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles undefined input gracefully: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d795d28aa3635280e4510eaa9e90bca98d7393826eff7a910521e6689dc7fd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles null input gracefully: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0b1f1fd5c072b96f9f317b6d5e8a03da6b50a16e376073584e68417a0fa231"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles number input by converting to string: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"f47b7405fdc7da4a9c8f8831f801c2af782f53f7a5c26d5160b929dd14e64084"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits strings correctly with the default separator (not specified - a comma) : 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"929180854c795eaf5c53ac5171c11b1c88e4fe321dc60b8f2b3d505875352540"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits strings correctly with a custom separator: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ebf2e0382fce1477cc182dede061193de8264ce228e64c48d600beeaf2b13f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can be used to remove a suffix from a string: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"3517cc00c2c570695c6f7c6d7ea3c214b83280bb76b44a0e6bc0be9d67fab8d4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can be used with match helper: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca20e9d18be9ebccbcabff1fc3898757c555e035cb66579db2b11a804c1e263"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: splits safe strings correctly: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d4b9386bec6859a3757b9ed4cff4937a44a255334b7a9ad71ac9ccd0b7139c0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: escapes unsafe strings: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cf5bd784418fae8c57768189eef4c15d68f1f25dbfe0bcf10f0ea3064c61abb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return empty strings with a leading separator: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"c92d437f76aa1f0f2c35a7751c18c74c1c1f10c3343ee89e71c373042803a4aa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return empty strings with a trailing separator: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f7cf9290f20f16f38a874d3d98cd478da86cf48797eac99ad08829d06258c37"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can be used to cleanly remove a suffix from a string: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"476ae2edebee958780ed1291b6720e4bab2ee3dec25d131ffb4bd590f2d2106c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not make extra elements in the middle if the separator is repeated: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e4fe961a28ac3f6b3436f38e0936d15f959e884209407960e12228a5cda3f6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns an empty array if the string is only separators: 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":"ghost/core/test/unit/frontend/helpers/split.test.js"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"757008fad721ef3f482ad589cf4dcb0d4735601a608f209018789433deb76b21"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: outputs the exact svg string for the search icon: 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":"ghost/core/test/unit/frontend/helpers/search.test.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b971322cfba30ecdc6a8608c5b8055128e4a641faa5615750d920c3da0a4668"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: will format decimal adjusted amount: 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":"ghost/core/test/unit/frontend/helpers/price.test.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bdf0a927ab728ab8163edfd2b41ac704c2e18b210d1822989061ce966fd8605"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${templateString} resolves to \u0027${expectedString}\u0027: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/match.test.js"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e99192a9dfb80a68815981a3b9fa6272cba2429ca9914bbf2188c1958ab824a2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Executes the first block when match is true: 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":"ghost/core/test/unit/frontend/helpers/match.test.js"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"02b02b611e34638f55ee04df8cad818cb7592de7de8af78e429d6c8e65bab8fc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Executes secondary blocks correctly: 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":"ghost/core/test/unit/frontend/helpers/match.test.js"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"31b6f0fed9a65de34e83a59caeb3a6fc30c1e7043b933d93bad3fa39694926e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Executes the else block when match is false: 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":"ghost/core/test/unit/frontend/helpers/match.test.js"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b73dd52a0f0cc46bbcfe04d9948cd799586e229f264732dfbcdd4e94cc65c4f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data on first index page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"79cd56a6049062780172628c7609b6069be3e7ae143ef2002c10b828d41eb284"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not inject count script if comments off: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"1599581fec572066a68736ae6a96e1ec5aa12bdf9ba76f6811590c62a46ce074"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: injects comment count script if comments paid: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f47ca3c38b6b2ddd843806fd4cd9a205432ed07bf10beabc5a79c135f678058"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: injects comment count script if comments all: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6ec7916c06d79d8ce0973c7ed7bf8891954330690120aba8c658368dfbd9bd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns meta structured data on homepage with site metadata defined: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0f1a5dd9e7b479b8a8405eb0bc62c69091c2ab6f612bb1dd7cdc93e2f88aa4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data on static page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"a817c45d6c66d733b3db59c04d4b7c4e102d109c919bce1dcd8cc604e0906307"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data on static page with custom post structured data: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc32e2e8c0fc1448d46145f558b6b283847040d643007b59177fe6644701df92"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data if metaTitle and metaDescription have double quotes: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"7430f72f0b4fc3cb9e6295297160be8afae43ccc53de02b9c3b217b51047606a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data without tags if there are no tags: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"a649f1ba6f092fccf83edd381b32df24bfe412b8d47b1863b0f541368fb25fa9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data on post page with null author image and post cover image: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a45e4315233aef1bf680ec7b855b60a1238b0d88a0d55f19905c6017de6fa98"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns twitter and facebook descriptions even if no meta description available: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd4a503f7eb540a7399471f48ba6d4ff1b4ce97e201087b55787fcb8d9418e6e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns canonical URL: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"78991eb88b9866a192509801fc55b02f5736b17c083ffc3429a56e5bdbb320bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns next \u0026 prev URL correctly for middle page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"e26f15e5cbc19096e444701a594d6990eecd6a10fe046a524ab46a2278c194c3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns next \u0026 prev URL correctly for second page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":795}}}],"partialFingerprints":{"codehealthFindingId/v1":"b50a57482b6ab0f895a707878946e61ccc3d7f3332bce0269224272920e33616"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data and schema first tag page with meta description and meta title: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":810}}}],"partialFingerprints":{"codehealthFindingId/v1":"49ac0d090bcbeab9b080ce50e0f46eacb0850bead863daec1b269081b3e7ff86"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: tag first page without meta data if no meta title and meta description, but model description provided: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f6344773447733d101cb21efd60a0b175a87270176cf759faa6119c5fca3b3d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: tag first page without meta and model description returns no description fields: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"8345093ad0f139708f3201480ce781edb84d86dccde72da95eee08f63565f8a7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return structured data on paginated tag pages: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"9788044dfa268ca963b9ee790f0766b1567fe31dd4ed75351cce0f382e7b2b5d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns structured data and schema on first author page with cover image: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":878}}}],"partialFingerprints":{"codehealthFindingId/v1":"66e81fdb72f20de703dacca6761b0a186e1d9bf7405e5e91fc89831ed3e7e2f4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return structured data on paginated author pages: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":892}}}],"partialFingerprints":{"codehealthFindingId/v1":"8084b835df239a10d018316156e55d2c112765aced6959b43658e9c9a00fbe04"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns meta tag string even if safeVersion is invalid: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"a05edc41c981f27ad47cb5fba95bc75d887cf26cc0f492f68df023786bc83563"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: outputs structured data but not schema for custom collection: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"2178afafb9eb4e1b973ec1b5cd3015b39eb9ae8ab78c6c44830776509546dfc2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns correct rss url with subdirectory: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36c14d57e5aff13acfc5d6b19e10cdc20c9c1bab49a8b274786d7ddeab73b4f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: contains the changed origin: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aa261619aa6ef46fda83e440bcae8e2cddcba048a62c9fc5c78a1ff155b7406"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not return structured data: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1015}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e50dd2feed7ffadda9c0d76e69c8ab82421c98f6db67f2b3ee07438ed9c2d33"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns meta tag plus injected code: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1041}}}],"partialFingerprints":{"codehealthFindingId/v1":"553473ef7a3e90aae19e464a51d34c7a9e1e9cdd2ee619d64057d5185cfe27be"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: outputs post codeinjection as well: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1055}}}],"partialFingerprints":{"codehealthFindingId/v1":"aafb87a12fb7af654ccb1e5744483fc50cbaa3f3192109ea1d88c054799239d6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles post codeinjection being empty: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1071}}}],"partialFingerprints":{"codehealthFindingId/v1":"398bbd5455be0f59d58ab0fb0875f9f35f3145342f1c0804f6b713931c2f7cd9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles post codeinjection being null: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1087}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ebb7f3adcc33d1815f2c2a568b7596281db4466e49735efa990b19ece0aa1d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes style tag when set: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1105}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cb7ce3131a8b5bc3ba89cbf34a0ffbd2d5d6b21d35a84449046e1c82b4ae66"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not include style tag when not set: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1129}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3ef2dc980733e865117a064cea776a41137313666d09fadd6f588aed1817e8d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: attaches style tag to existing script/style tag: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1153}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f67f60a696c63c4cd792ac4f26c3404c3251bc454a3de33a960f9394cf1c220"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes style tag on templates with no context: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1179}}}],"partialFingerprints":{"codehealthFindingId/v1":"09ba5c339946c0449462cbf16e09acec783a3d27d0696206887116a9aa45d2d6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not override code injection: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1230}}}],"partialFingerprints":{"codehealthFindingId/v1":"f98f7c554eff529e70cdc0558f036825bae9870d6121c702ae36d30e49fd42b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes custom font when set in options data object and preview is set: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1262}}}],"partialFingerprints":{"codehealthFindingId/v1":"43eabbafaffa6114869abfd6eea6d99bfc4895972bd5a6f0074cb31f4e47f869"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes custom font when set in settings cache and no preview: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"e87ba6f522c79a1691cd40475b24f15a0ab18808ec1ff7f94cf66d7ec506c58e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not include custom font when not set: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1309}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f85175cf158d5b78ca89a662865f4a12712235772c98fb475bb10400b61cd6e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not include custom font when invalid: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"24be9c40194804bb6fd057f91aea447cff26d7731841993595a4e54e43203620"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not inject custom fonts when preview is set and default font was selected (empty string): 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1358}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2cf642d1cbefe3257b9f40936dee17dce4c93898c5178886eaf4f43c79abfe8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can handle preview being set and custom font keys missing: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1386}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ebd9f418c9e8a4ac9ad94adf3f4bc32a202b791868e011751bb9ee3e943c81a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes portal when members enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"118685cd7d09ca96863a8fd6923f7bde0a0fc33c107e8fd826cddf64bed4cc7f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes portal when recommendations enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1429}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ab2452e59242ec731cc928542e6fe4271e86823a7a15d8e8180bca02a796d2d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes portal when donations enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1443}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31cdb68efe9e02d80f462ddf354d629a81e281f42e7daaf6add03dd68cec980"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes stripe when connected: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1457}}}],"partialFingerprints":{"codehealthFindingId/v1":"f515abd75d3ae1484749e5852a16c7abb3712f345fe7a2450a63a9bda77ab709"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: skips portal and stripe when members are disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1472}}}],"partialFingerprints":{"codehealthFindingId/v1":"5095671a5c65a27b0cfeffe72349ecc5d958a0cc093f73c6490351280cb1855c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: skips stripe if not set up: 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":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b9774dbac74b8d7c2486a934b30805b5010c32a70880157bed156d7dee3aa3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is included when tracking setting is enabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1554}}}],"partialFingerprints":{"codehealthFindingId/v1":"d92098c16940c008aed4ce8adedaa4fd7d8b81379968d1271dc0ef84c7118c72"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is not included when tracking setting is disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1569}}}],"partialFingerprints":{"codehealthFindingId/v1":"46edf3163983beea155dbe8f5071bd319a81d2412a16d976362ee2187c04e52a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with all tb_variables set to undefined on logged out home page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1662}}}],"partialFingerprints":{"codehealthFindingId/v1":"106adfed0efc30dcb526559b20930b7d548a7d163dc4a1331141f91b0963a8b3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Sets tb_post_uuid on post page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1674}}}],"partialFingerprints":{"codehealthFindingId/v1":"49081c9345786c54fd0c408613e4bf71133c0efccad9b41819e9a7154a1c2e01"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets tb_member_x variables on logged in home page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1691}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eaf740ddef446e16621d42f864af1fe47e15359605ebb8afa30529c2c824d56"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets both tb_member_x variables and tb_post_uuid on logged in post page: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/ghost-head.test.js"},"region":{"startLine":1711}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c71368df2c5d621c5a867fadb7495f4b9b79c8dc03ad8dd349fa403cf4ece50"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: object and @key: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"2975ec06d7f634ea32a195b7555bcfd1505348b3c1f594b2fa2e7ffce4d388e6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @index: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ef8135da4b048dde9f568200d6190429084bd3913cf093b148868ad186634c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @number: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a635b035d5f4cafbb5792430705a58e6e5ec08f1cb75fa7ebddd5ff9c569f2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: nested @index: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"55d5defd9ca4642ce46da49b91ad9d2facc73b224151519c03c901501e4a0645"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: array block params: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"78b34dd876bb1b730d1b23953eee6b0c91a2323eeecfb1d5aa28a1e717c91539"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: object block params: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"008cc8dab6a72a337885cfd20e68c78b3da224309a8d93c30617f4f021733e51"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @first: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbeef5beec71d0583995fe9be07581f667bfae63529bb1f823f2ab1c63ae75c2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: nested @first: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"970d493d0ee610a31077db7af840d8d2a1b9ca7ebd7c425638a7a0934504437a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3726c0137e91f5960509bbf2afe2ae2989577039e5e7e4974189eb03318f798"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: nested @last: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"322a2590623b0cd0bf2b797d688c49b96ad9617be54be50dcbefaaa1d2b3fdc2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last in foreach with limit: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"52306b76500e73e78b26b70b4d7ecc3b426cb6a4374bb1bcf10ebe1fff85f962"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with limit 1: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c174d6def8bfe55ffffd20936dbf509122965a7ba1a6d36ec09091a57d50d73"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with limit 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f455d8c8dd56ed507d8b87679a2300c1f4b49c7a5de38b6004cbd5a7f8b19a7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with limit 3 and post with members visibility: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"11525779fdb84d029c9bf8722fc1f55f0da3007618f34d094d1780357920f38e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with newsletters with members visibility: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba56f2c39bf3d4c9d8d10c6de3a8eb48092b7087e29df9c150cc0044180435b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with from 2: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c005ab765b409a70cf796db31fa819037915c4aef1174f940b5c0e6dcf406b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with to 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee1083a53fe703dcf4bcd11080d60b60c8f5ee752a2801b72caa55cd380b26a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with from 2 and to 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7ded108ce7a36513427c41c40420f70ac25a6567665f661834f80cf6a1afc02"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with from 3 and limit 2: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d1c1cc1c2cf26b40c413370c7ba6186670f11aebcd85e7aa2769d9a1b2e562"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: foreach with from 2, to 5 and limit 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc1b9575d0cd8979b40523e285406b712b54b14e6ab0c26a2a08f7d3fc224fe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @first in foreach with from 2 and to 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd5c0a296f6a4206e76536ef2baeb065a47cba64fee814f5b3a690c922883f8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last in foreach with from 2 and to 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"de3a6c23f297fdb4b238816d474092bb6cfc3f88c8d09a0a7702fbae49a78ff1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last in foreach with from 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5280392d18419e987437ef386d3b194204d71bd1e51064a3dede25164d5b3a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @first in foreach with from 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad1da0acf6710f8feeaa6186292b4681381a2a41a94533763c910da34a914959"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last in foreach with to 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"a17f003672c1fadb0506dd182a987bcfdc21cf7203e713228c30211d989f6610"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @first in foreach with to 4: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a1b305919601c0ac835e7201bbcf34f7545f3664152bc34074a10e277d89530"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last in foreach with from 4 and limit 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c22a779d92e8391afe7d12be147a1f28da150c2b5210059250c7a28c9932b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @first in foreach with from 4 and limit 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6d46aad0152a979b478647ac70af74a96907d105dff0e08dbb5b4b060f21db"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @last in foreach with to 4 and limit 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"0082a3f41357009a01810092f3d8f74b6a433175e197a698e99ec7d698db312c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: @first in foreach with to 4 and limit 3: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"a810fcdb3cc3f8be54c1e8ea483540aab700dd057734c433ddc9e484aa43d59c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: will not output internal tags: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"30681fca5bb433ce25cd1401893f9a818ae43d4b670f9327888dcf528417d99b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should still correctly apply from \u0026 limit tags: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cea6b3e96e5f4c6c7e0310d9deca0f11f006b1bfeda125626e46877866998b0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should output all tags with visibility=\u0022all\u0022: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"68be40945c77ada968ef49178d9821a8462f6bb26624d13a12a1f4408457cbb4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should output all tags with visibility property set with visibility=\u0022public,internal\u0022: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0eb54648a5f717684d56a8658cd64e8dfd361663b04b570437eaefcc8a5c868"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should output all tags with visibility=\u0022internal\u0022: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"b036407e059bc9288aca08e2e30a7e37f91edeb2193d6e9cc24b64378f6a73d1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should output nothing if all tags are internal: 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":"ghost/core/test/unit/frontend/helpers/foreach.test.js"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c04b366151b532134fefcf47fc97efbbb1a967a778c6d1ac1541d87f526508f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has contrast_text_color helper: 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":"ghost/core/test/unit/frontend/helpers/contrast-text-color.test.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5198c2482be9b4c627b5f301ebd98d7a61266d22c6306efb13b2aeae75b8301d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can correctly concat nothing: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ac5bb268ee74953493babef8811161eb970c19180c6ce669641537c347ec99e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can correctly concat things that resolve to empty: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a9cbe4490b659562b8d6a631e49880f245cb58f391f011ba35d0bbc3b29ab95"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat simple strings: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeadf58675963a5505f85868b646b59bc8b94b5b0a944779ffa93d29e8079475"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat simple strings with a custom separator: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b224a4322bc2fa3c09fb2045e158737d419a51daebddf1d3e6a4eb767167d361"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat strings and numbers: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"21288394788e7265bdfb9306b66637cfb67d9496c29580191dea38a30ed40109"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat strings and global variables: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae19dffe70728eafb341bf84b6e6d2274bc036e42daa1b37be91b5c2679b5f4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat strings and local variables: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"578951ad639f0bbc36fe36ff2226d7e312683b3cc38af5ed9b822c9128180a97"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat strings from custom helpers (SafeStrings): 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"70b721455d19339c9b0c3972ac715a3b5a9d4bebb35da0c5bce04ff568004da1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat mixed args: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"373d3464419e49efad488b069eabf2c83c1ad5c223e05bd1f29ad3f8866c508a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: will output object Object for sill args: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c85aac449f4add4c6379797e4617f1093e94090ca830d05fba85f6fb4c94b98"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat empty safestrings: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdf3ac6e435f1b897afc450d70e67e026a3c170cd6f7e969f047796c2e3874bf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat arrays with default separator: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c2500cad646e7ba5ba077643f8aa8c9ac1fbe31e9b7d54d18bd0339bd0fd050"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat arrays with custom separator: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"60bb40d5e44896dc8af86a5d6ef4bf6dbb4b28c46e48a0b9ea7e184e08188836"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat arrays with empty strings: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"a915bb9c99cf67ace234e5a201776123e05d532b2612aa3286196bd7880c3c75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat mixed arrays and strings: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b1d6aa90eb9981644943dd01190f8055d7b5ecf52a2b017d151b012a898ed0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat multiple arrays: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad1a33b7b106526fb3abb81d35fe0b49fb49308111ee2aa63b3d6810c7c6c8a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concat arrays with trailing empty strings: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e2ca1ddc6ecb6ae93e8dff3ed928167a97c41c2b36aa9fb65a6163718abc68"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concatenate an array produced by the split helper: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"d78038b4edafa017792b6faa0bcdbd66b0e8395a4a1bbb44520fbbb4cee4d734"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can concatenate an array produced by the split helper with a custom separator: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"0490a2e0580e5df40c306de9a4d7568f69ca3893d87d368d6cdf305070bdb6ab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not handle objects, returning [object Object]: 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":"ghost/core/test/unit/frontend/helpers/concat.test.js"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"220cfffcf2ebe34abd15940e8e42542bbe79d6990e7218766d253a94d90acc74"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns a script with the post id when autowrap is disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/frontend/helpers/comment-count.test.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d999f67f9e9019d4fb9a56269eeda5f2aeabf0dbf7a717cb6c44a68b792da5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: applies all the hash params as data attributes: 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":"ghost/core/test/unit/frontend/helpers/comment-count.test.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c4d614514daf51ae55c112214cb118e05a6251b474710370653fb1a6f139b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: correctly sets the defaults: 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":"ghost/core/test/unit/frontend/helpers/comment-count.test.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92f7cd98ab7a892cb4862256d574354e90d709d6ed91996638ccc9e0ab0481f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has color_to_rgba helper: 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":"ghost/core/test/unit/frontend/helpers/color-to-rgba.test.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d871c418506c663ac1c4feb02265e69bbd2e744ce5d0a894198fb57b2282e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should be a function: 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":"ghost/core/test/unit/frontend/meta/paginated-url.test.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be018a8e054de194b36156df547f747cfcbfa2ac744df3df4f3531ea3fbad7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should be a function: 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":"ghost/core/test/unit/frontend/meta/context-object.test.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2a8ec827ee04f764fd134f68f02445998d69e7c27d4f982062894af708b31b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return author url if context contains primary author: 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":"ghost/core/test/unit/frontend/meta/author-url.test.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d12149b42a375b4805f7b95ecd7f9b9055162c21e501b3e67e871fd3f3560c4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return absolute author url if context contains primary author: 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":"ghost/core/test/unit/frontend/meta/author-url.test.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"8183117f8d46223433dc0a9138be97466df1d6b9904726e02a4018147707485b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should return author url if data contains author: 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":"ghost/core/test/unit/frontend/meta/author-url.test.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7db450813da3f2a12a0c05d1f645044dce7548fd7273cdfc13226f5973de00e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: creates a ghost proxy: 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":"ghost/core/test/unit/frontend/services/apps/proxy.test.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"e96ddb18f1565ad7392b3e1820e28d2f17df5b6b825e4ac57072fc413a2fccfc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: find site router: 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":"ghost/core/test/unit/frontend/services/routing/parent-router.test.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7723119e0f700899ad79b67ade0b63a0d8ba030823ab0bb273771186b302b594"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: resource found: 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":"ghost/core/test/unit/frontend/services/routing/controllers/entry.test.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"b286164f3b440790d45eb70708a418d49f3049159fc3eeeacedc7d2c6420bc6a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: it resolves a promise: 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":"ghost/core/test/unit/server/notify.test.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"5edfb85b2269b799c135e89321cbfec3d5ac342a42b46864241a24212d944eff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: create good adapter: 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":"ghost/core/test/unit/server/adapters/scheduling/utils.test.js"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"77bbf4a90d8e433edbd25cb5b91acbe3d939f3ba917cdad44eef5a23f2ace663"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: create good adapter from custom file: 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":"ghost/core/test/unit/server/adapters/scheduling/utils.test.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"07b212514ea415645266826b77e601e66cebe0b016da4717c2f65d104d99d74a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: name contains a .d as extension: 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":"ghost/core/test/unit/server/adapters/storage/local-images-storage.test.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3622d91e937742fcbef21ca87cdf2af3be40ae96bc37e881fd977164026afc8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: name contains a .zip as extension: 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":"ghost/core/test/unit/server/adapters/storage/local-images-storage.test.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"8caed7fd07ee8f12862dc1c3e042280b3fcf7c97ecf00a8af993a7d9ea6d36dd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: name contains a .jpeg as extension: 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":"ghost/core/test/unit/server/adapters/storage/local-images-storage.test.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c410d5bdec0f5c81d7b364fa1b6bcecbfb7c6e90482267c16e726af571f1dd8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Adds a problem if the existing data is_private is false, and new data is_private is true: 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":"ghost/core/test/unit/server/data/importer/importers/data/settings.test.js"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dcbe3abb00566a7fae7c34f155fbb7e0e55e7f94b82855dcc11149e9754af29"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Adds a problem if unable to parse data from slack configuration: 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":"ghost/core/test/unit/server/data/importer/importers/data/settings.test.js"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f1def0f9e568fb1976224b5dd7f0e77f64b7e594cc96259453b9d56af475584"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not remove the newsletter_id column: 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":"ghost/core/test/unit/server/data/importer/importers/data/posts.test.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c47f7cb3bdf67b512f380eee20bbaf4b433025a46a1fcff5780c4e0aa6f44a49"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not throw when permission cannot be found in down migration: 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":"ghost/core/test/unit/server/data/migrations/utils.test.ts"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3ce465dfecc1e0d97e6fb809a0c8a31df27a4930e534353e425e7a14ef8979"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not throw when role cannot be found in down migration: 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":"ghost/core/test/unit/server/data/migrations/utils.test.ts"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6e2bf7d88ca841dd7ba32cc4ea12aaa924e4c9b762042a884a4a34908383f2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass: 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":"ghost/core/test/unit/server/data/schema/validator.test.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea226b217a4fd57fa72a8a509866c8409003e45cc47dd2507465e0fb3df2f56b"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): Can import the whole dataset without error: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/data/seeders/data-generator.test.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0ee886543636984eabd2ebce0a1cc43586a6937852bc3a7e2926eb77a8f544f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Works for a set of shapes: 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":"ghost/core/test/unit/server/data/seeders/data-generator.test.js"},"region":{"startLine":599}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b53a7a05de119e4f26dba9cfbe50bf540b2f490420cd94b4e4c65dcbc131ef4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Resolves a promise for a bad call: 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":"ghost/core/test/unit/server/lib/bootstrap-socket.test.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"822f1afcc7c927965a2f91bd138015ebbb76878a5a48e25efe0c11372d095ab9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: [success] should have an image size function: 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":"ghost/core/test/unit/server/lib/image/image-size.test.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a644a7c29ee3fd8d04602c0d4829a819f3814ffeac93eb995d01ad229d470708"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: user status is warn: 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":"ghost/core/test/unit/server/models/user.test.js"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"24caee9749a1b7a1232b8a8787423226fbce4cdf32820c2bf2ebc81ab3628f5b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: user status is active: 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":"ghost/core/test/unit/server/models/user.test.js"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"61c3318531c6d81335c8da09f7acddcae40df826b85be88ee9105319f0f41554"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns subscription trial start and end details: 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":"ghost/core/test/unit/server/models/stripe-customer-subscription.test.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"aabdbaa374c8f6b29c55f0bec176e83f81f113ef470e25866e49fa0799751e1a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not throw when stripe_secret_key is valid: 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":"ghost/core/test/unit/server/models/settings.test.js"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7363c0857e9d0701f30b17c78d270a2c55939cbc7f2cbc90fb660df2c277a3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not throw when stripe_publishable_key is valid: 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":"ghost/core/test/unit/server/models/settings.test.js"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d6295ae82c3cb2c8876dd52117d151664ebbbca8cd5cbba23b4ec9eab2c1cc2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not throw when stripe_connect_secret_key is valid: 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":"ghost/core/test/unit/server/models/settings.test.js"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"b10b9fbb13dee2da868cd21e35bc3ccf8a3eb31bee413e24ca9d218692d115ca"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not throw when stripe_connect_publishable_key is valid: 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":"ghost/core/test/unit/server/models/settings.test.js"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff848ae4b9849acc41df215bcdb25194262dab37995028162ff06c396856effc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not throw when stripe_plans is valid: 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":"ghost/core/test/unit/server/models/settings.test.js"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18376e6135c1b64da426925e71169a5df0c468dd390fad687547cb3adf7a4db"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ensure post revisions are exposed: 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":"ghost/core/test/unit/server/models/post.test.js"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bd9e01d87f9575ce240c0832661235ab059568dd7f9977e906aa445a41fc091"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can include all count relations: 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":"ghost/core/test/unit/server/models/post.test.js"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"46db3f00236a16517e4f471f1cd5835eb3ee9f5f84fca82e1d6a3887cf27ac7d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Has member and subscriptionCreatedEvent relations: 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":"ghost/core/test/unit/server/models/member-paid-subscription-event.test.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6876d0193831a46fe007ea5e90229ef18a9a5697adb5b5cd604347ec243aaee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Has filter relations: 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":"ghost/core/test/unit/server/models/member-paid-subscription-event.test.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"db39c9c04a1672cbaa4e6a9a28cd91d918c8252bc4cd2ef99e7eafb9d1b6f527"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Has post and member relations: 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":"ghost/core/test/unit/server/models/member-feedback.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa680611002d8c3a3c8e4f8811964768d8c5a182947f0ba7cfa439d2195ddb1d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Has link and member relations: 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":"ghost/core/test/unit/server/models/member-click-event.test.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"457970b28401b32c8bcc655f61fa2720918b04be34ea89f2682d1c3d399ecc88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Has filter relations: 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":"ghost/core/test/unit/server/models/member-click-event.test.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9de4916c34ff88fe1d7822e3254c3e8970ed3fbf57a92b743d5376233668bced"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite administrator: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df9bfbb60162061055009c32badd55d869bc375b8eba5bb18801a2ced6b6ecd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite editor: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"caeace1b16e4d057246231cc818931282312ef9528f80e2071250f69516be0da"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite author: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"e718cfc9ea2f16c6298ac83ff88644d3378b8dc34649114e06ab9514cfc017d3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite contributor: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"9500cedebc69db84486e4eeee463078d34c6501c998498abedaddfcdfdd3de32"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite administrator: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b83faec44ac3f7fd12148fd513e0fe573563cc2a53a68dfe371a8ffa3b9fbb6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite editor: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2e2910c8e6b031cba23fb02d2caec8be976beb3a0575c6a4319a2ac26ac061"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite author: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a8ca9381f6f013c5bfc4ed02bcc359ba27fae2cc1159ae771b130cc73760e5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite contributor: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92a8ff251c9b537749ee3ae6b3ac9fd474a762f70a9cf2cc77e0aadfc7b627c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite author: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"768122c679ae4a9a249b07118c719352d96c1f9742b5a15374081d97d8389d5e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: invite contributor: 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":"ghost/core/test/unit/server/models/invite.test.js"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef3ffb418fb65e730b33fe775aeba831410887683064f31eb349b86eb29e3c68"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Doesn\u0027t throw an error when the csrf verification fails when bypassed: 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":"ghost/core/test/unit/server/services/auth/session/session-service.test.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1f1085202606abb234c9e70987096b695d0bd8f2139a6f2720c82ababddec7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: settles immediately when no imports are running: 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":"ghost/core/test/unit/server/services/content-import/import/store.test.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2ca80029ebc1a39d937300020d3e8b15ecb6288f8971ea66c083ef50cb0534"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: passes validation for a valid redirects config: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/custom-redirects/validation.test.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"340468aa63b92040c7075d1b00a196ec68272fefdc96e82b767850687f2862d7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/email-service/newsletter-email-event-storage.test.js"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"24cc7b42a645eeded13fdb762a9afe2f5f5f1a63a3c96f575227ebe98fd71027"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Renders: 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":1649}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b82293c3415ede48088e5536ec2c6f4523cee8741d216fc45cb7793ce9a202a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets buttonBorderRadius to correct default: 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3820}}}],"partialFingerprints":{"codehealthFindingId/v1":"279a0c7b15b70ea02024f4859c8e2b0d00145fdf52b69f67574448f3fdec1da9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets buttonBorderRadius to correct rounded value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3824}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fde2a434161f8446e7cf7530c4e3b6f5b8e7d6a4d5c204951b2e2c1970b2bd3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets buttonBorderRadius to correct square value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3828}}}],"partialFingerprints":{"codehealthFindingId/v1":"aafc869c1a0f8dacb19bb11ae8e640064ec897702ef5afd027aa1972829897ae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets buttonBorderRadius to correct pill value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3832}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4e1a8b81f73509ba22d8c2e112c344fac62df3b9f1f19d8dacd760b49a4813a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets imageCorners to correct rounded value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3836}}}],"partialFingerprints":{"codehealthFindingId/v1":"d24b33cb9215c73afd7326a8ef2861b0b48981cb5af166ba2644861efe95147b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets imageCorners to correct square value which is false: 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3840}}}],"partialFingerprints":{"codehealthFindingId/v1":"75ccbeccb02c93a3d87efdf307c9e51fd3125bb1a6b1f369bab2321bb185a817"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets hasOutlineButtons to correct default: 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3855}}}],"partialFingerprints":{"codehealthFindingId/v1":"9abe557b5c6a41f61cf8d4c19254caf191bca58a1fd1d94b45d11e8143748a3d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets hasOutlineButtons to correct fill value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3859}}}],"partialFingerprints":{"codehealthFindingId/v1":"551e65dee0212eb700ed72070ea590f169108cca024e53745f80ad96aac0aab5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets hasOutlineButtons to correct outline value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3863}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae66abfc593322a32c4e0a334c328de482add8b0c3ab9d05a6693a5f9e4913d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets linkStyle to correct default: 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3907}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1073cb3ca87b51565fef347d314b61f56f4bf9383941be4df2d5b5b00fe5537"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: passes newsletter link_style through: 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3911}}}],"partialFingerprints":{"codehealthFindingId/v1":"c456c3b9eaa2276a022e639d691fa58b1abd8fb175c208fc50a38eb2d0ec7d08"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets dividerColor to correct default value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3926}}}],"partialFingerprints":{"codehealthFindingId/v1":"551b0804f81a08defac245948cf0a9c61a20fe419f3e8b4dc0b48dcba95fc823"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets dividerColor to correct light value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3930}}}],"partialFingerprints":{"codehealthFindingId/v1":"210783d59d537ed39adc544fef7ed4095b13d22c66a23eb7ba3daafc464cea53"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets dividerColor to correct accent value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3934}}}],"partialFingerprints":{"codehealthFindingId/v1":"11fa85eb921aaaa3e9aebb170961d8e3a0fa31de4d06717f64ec36daf404f548"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets dividerColor to correct custom value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3939}}}],"partialFingerprints":{"codehealthFindingId/v1":"382a70a5110e6451f8efb3201b71aafe033d20772dd082963f1294a2d59b035b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets dividerColor to default value if invalid value is provided: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3943}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca90d1dbb7b57952895b947d8cb3efe305dd4e2b958949fd59236c4f3c79ef00"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets buttonColor/buttonTextColor to correct value for ${settingValue}${otherSettings ? : 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":3982}}}],"partialFingerprints":{"codehealthFindingId/v1":"7463f35e84c164c990b2b4b7ad9efd75045dbb5a553351f351b38d7e1b823908"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sets headerBackgroundColor/headerBackgroundIsDark to correct values for ${settingValue}${otherSettings ? : 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":"ghost/core/test/unit/server/services/email-service/email-renderer.test.js"},"region":{"startLine":4025}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c6ef1883549a53c1a35582ac189b16b2391f77de291d9dc90e002d82488e1f5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: works in development mode: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/email-service/batch-sending-service.test.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f38dfeda2b158899fe1b6819ee275893510268d15ea41be115ea5a4b4851548"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: onShutdown is idempotent and returns a resolved promise: 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":"ghost/core/test/unit/server/services/email-service/batch-sending-service.test.js"},"region":{"startLine":2374}}}],"partialFingerprints":{"codehealthFindingId/v1":"301277a17f5615be9d61d2ef6c16ebbb9fc8208ee1d1820a74cb8882d8d9d342"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): destroys streaming sources and cleans up theme files when the client disconnects: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/exports/site-exporter.test.ts"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"61464de539e43054392e94df8a94680218b678c131a10e1189e2272b5b88a1b9"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): removes a theme zip that finishes staging after the client disconnects: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/exports/site-exporter.test.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"a13034195e521c442cdb85318f5c41439ed53c102921bac1ca7f69bd4262758a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: registers the update-check handler: 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":"ghost/core/test/unit/server/services/jobs-service/register-job-handlers.test.ts"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"469db4b30411909aba5ef32c965fcc77a842a8945a16a18f42b8a095691a35a9"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): clearHandlers lets a rebooted process register the same job types again: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/jobs-service/jobs-service.test.ts"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd4b8b4c47067f45ef9afc3dae9acd3d611940bb3cd8dac98eea42dfdafa0330"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): clearHandlers resets queue declarations so a reboot can re-declare them: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/jobs-service/jobs-service.test.ts"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"695740cb9a0a31f782ab10e7f5959d06ac4dcb47f8bf8a2476e75c4390d5e01c"}},{"ruleId":"D10","level":"error","message":{"text":"No assertions (empty test): re-init clears handlers so a reboot can register the same job types again: Test method has an empty body \u2014 it asserts nothing and exercises no code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/jobs-service/index.test.js"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"5832c0dfd3f25fd959510949ca008bc27da56e32e90757f8cb500c966383cc6e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: exists: 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":"ghost/core/test/unit/server/services/link-tracking/link-click-tracking-service.test.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"502696665a36a08899ce0c9ed917aa6c2c1125e1087b5202d447ff54a6752fcd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should reuse the transaction connection for the member lookup: 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":"ghost/core/test/unit/server/services/link-tracking/link-click-repository.test.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff80f2281fece834515bf14f18f6288e99d0db8b96a7a8b1ed7d44f1419849b5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/member-attribution/url-translator.test.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"b58604e72bb269dd028089440e9d12a4c59f8d3f421110f620ffc12161cbda91"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/member-attribution/service.test.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6f564eaa2a713e2963765038432cb6e2924d1c0faaea0dd2ce0f8ad57dd9e60"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/member-attribution/referrer-translator.test.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"028709ae4fff1982924b15392a14def8a0314f66d53c58974c94d61d09b2079f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/member-attribution/outbound-link-tagger.test.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad2079a21b01bfaa239b4254f52a7676f960fb9fe72bea9d8d965a6e583ce7bb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns empty if empty history: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b5243797e9130cce70b9096630510fb068f678b5afedf5b6469b387d17f7cc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns last url: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"9371a3ca571d40da5e706ddc91de92b5a69bedcab32bdaeb12fbcf964863380f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns last post: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0f2301a07025bb9d0814e2e0806f506828aabc2b0e96f3382d46a3d904df5b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns last post even when it found pages: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3e93d6e5c7d1bb494ce42da2975abdb304b1489c3be6ab02eb65806132bdada"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns last page if no posts: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"444a6adb8e19003d3f6d98ca6f9e30005f8e8d10d17f34611a8add78cddacf8a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns last post via id: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc9da1c69c0b863fd1bf021d2a47238d1206c27c9e4a48c72c3ca112b0e932f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns referrer attribution: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"7def1ab919f06e6c9b14ba8d9ee21b66179597b107037d4d1d7073774595b865"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns all null if only invalid ids: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"9da1f68245d17ed3115830f61a1d2c14f38a0d2996c08e2a64dcdaf6db083d1f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns null referrer attribution: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff1843fa9c70089caa1da593d45276bef428bc0a4e8467b3a851aaa530e1da58"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns all null for invalid histories: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"1580394a427395d849dd4795c96d7eac94e56b5761733f2540de33e3317dc231"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns all null for empty histories: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"040ca26ad44eca40df1b0b20cd9c05e1de4c1f9ed3c6676136f4bd5b806f7cd9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns post resource: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95b71240a62cfe7ee4b653400f750e6f385901fb11cafc5f407ea282f24ce3d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns author resource: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b6607b994fdc4847295abee179eb65913d2d544bf9a0fe693df817d8cfe937"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns default url title for resource if no title or name: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b3aa296dc7ea7d2e5c86a5e05e7d72984b889be6451ebb6208a15d0d560f12"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns url resource: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ebcd53a7ccfc0ee6dee4ee57c6be6730957f6cb4c0f3e8c3565852c5ab50e5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Returns url resource if not found: 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":"ghost/core/test/unit/server/services/member-attribution/attribution.test.js"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fa3a5775797ba99f46277a21c8e033c9b3a99a5aaac130c62059991eb7b2ae4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/members-events/event-storage.test.js"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bd2fc724972d5261edabcb0ca9841b60dd541ae54aa865e026c16a1069d914f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not error when subscription.plan is null: 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":"ghost/core/test/unit/server/services/members/members-api/repositories/member-repository.test.js"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"2357f0821bd65866d445942ada6400a151cd0b394dd86504a1cd97ef7e0ddf86"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Handles verify errors: 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":"ghost/core/test/unit/server/services/mentions/mentions-api.test.js"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"00169a9e7e4a105aaa099dc003c365c61b7aed323662e148b13e7413a47e2ee7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will not error with valid inputs: 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":"ghost/core/test/unit/server/services/mentions/mention.test.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"65030ccd0773a1afb491f3e0c93869143eb74a642054a314a3e77550ebbfd36a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Will not error with valid inputs: 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":"ghost/core/test/unit/server/services/milestones/milestone.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d9325bd799cdd3dc74d942c97b4fa06734017d224b7949ffb7593f9799aa638"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can handle ObjectID, string and no id: 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":"ghost/core/test/unit/server/services/offers/domain/models/offer.test.js"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"c05d67b590500810de6f1fd164f6d476e8885a96b3f9cb60fde3e532ca828680"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Exposes getters for its properties: 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":"ghost/core/test/unit/server/services/offers/domain/models/offer.test.js"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"168986cd2659f99c16ef98f55005a793b47ea73e82a08a8b227ca4c1930d08f3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can construct class: 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":"ghost/core/test/unit/server/services/posts/posts-service.test.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc54e03fd1fd65a0e34add63ce0848fc236e3b447055260be8c06a0a31f86fc0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Can construct class: 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":"ghost/core/test/unit/server/services/posts/posts-exporter.test.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"73cce4174a23233ea46a7af02a61691ef259f1432ef612dfd116729c173405fd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Keeps custom ordered stream exports stable across page boundaries: 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":"ghost/core/test/unit/server/services/posts/posts-exporter.test.js"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f72428581c94fb6e77ae084e8834738258c993073c310662a607fc145f46846"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not throw an error even if fetching throws an error: 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":"ghost/core/test/unit/server/services/recommendations/service/recommendation-metadata-service.test.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a5f0f0434d03bece87276c01c947b712cbb2f29afbf59e6da61526643017ba"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass when config and setting UUIDs match: 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":"ghost/core/test/unit/server/services/settings/settings-service.test.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fc7565626b7416ed9fb56964f9c87dfbdf702e39497995a0c42a061b4cfb088"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass when config and setting UUIDs match with different cases: 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":"ghost/core/test/unit/server/services/settings/settings-service.test.js"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a5a4a343e35609114c973670a30dae1b971ecbd43213f63441b61b69d00ef31"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass when config UUID is not set: 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":"ghost/core/test/unit/server/services/settings/settings-service.test.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a154be5c8b35de8e62f6ea3eb248bf51f21b8cff903c71e24ef4e82a7072ca24"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass when setting UUID is not set: 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":"ghost/core/test/unit/server/services/settings/settings-service.test.js"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e1e87799d77f7e0450d0067a062e7865aaf28d5563a63a6e3a843593ac5f31"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should pass when both UUIDs are not set: 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":"ghost/core/test/unit/server/services/settings/settings-service.test.js"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcdba5db908aea43e8f7368c0dca3e756d89e6638da1473af0aaa97d4100281e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/slack-notifications/slack-notifications-service.test.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82ed036104d6b8a3100e4d8460fde11ee8a396023c2406e8f9f8676cc887ce2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t throw: 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":"ghost/core/test/unit/server/services/staff/staff-service.test.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc2563c553dfbc5e047431901af9c35cce119d03bd9f59e76e5c77a88d818b38"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not send email for importer source: 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":"ghost/core/test/unit/server/services/staff/index.test.js"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"7babbfb6175efc60d949994f5bc3010c866bd489f2448c7dd9671e4d0ecc1f28"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not send email for importer source: 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":"ghost/core/test/unit/server/services/staff/index.test.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"28f0de2477508cc0b79888a48088b659037aa4419b619bcc4f6cb20e7368a788"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not send email for importer source: 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":"ghost/core/test/unit/server/services/staff/index.test.js"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68b300ad841b517da80343dc3b4a669a8636615a7e9702171aad4c724f7eee6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not send email when no email created at provided or a reason is set: 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":"ghost/core/test/unit/server/services/staff/index.test.js"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"f152793dd10baeb2a1e6642cb39f8f2d2cf4258cbff9b12a507c8fda3b1183f3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: sends success_url and cancel_url: 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":"ghost/core/test/unit/server/services/stripe/stripe-api.test.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82f133f483a3401f8b902f82b57f27b15788834087f8ac17ab3030cd910f738"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: createCheckoutSetupSession sends success_url and cancel_url: 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":"ghost/core/test/unit/server/services/stripe/stripe-api.test.js"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e534c9bbccf4b4bf76c97a9ee4f61e4be9fbebbeff20e13fba661255a3b1cfc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: createDonationCheckoutSession sends success_url and cancel_url: 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":"ghost/core/test/unit/server/services/stripe/stripe-api.test.js"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c4a3f4f5e38355c9510bcd468846ade7e073d65dfe58a20c728fb7cc6419ed6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: del() with no argument does nothing: 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":"ghost/core/test/unit/server/services/themes/list.test.js"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"05876f34a4c7561e07665eedc73c9c5023a2656bfd94402cfeb8c328d3546997"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Does not error for valid inputs: 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":"ghost/core/test/unit/server/services/tiers/tier.test.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e7c1f5c842edf19f0388adbfc3c6ca5428df9c0fe2fcb34b154e06a9c0aa32d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: exports an authenticatePublic middleware: 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":"ghost/core/test/unit/server/web/api/canary/content/middleware.test.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1482ad09ad86893af72e33822396fbac935b1ab8273c4602399edffa2bcb342"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows any valid color value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/shared/custom-theme-settings-cache/service.test.js"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d3b1827722de09e6b95b20d9174109da1dbd2a18eaad134678fbe612acf445"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows any valid boolean value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/shared/custom-theme-settings-cache/service.test.js"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d31a5099fedd23ef63ea4116c0d0f76eb1242404416782bfce0f30e651d2a3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows any text value: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/shared/custom-theme-settings-cache/service.test.js"},"region":{"startLine":1004}}}],"partialFingerprints":{"codehealthFindingId/v1":"1317cdc3af73c07c2215d95a1cc3303694d005118877645438c4f7a8bca29894"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: removes empty elements: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"151a38536d2d9d630e3129105d1d9c349a27a5ef74f64d3790ced8a01e34cd9f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders accent classes: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bed9640b9555eaad8c9542d22c6b02c973eb832bf4b30e6adeafc5171fe1b88"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders split classes: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d896a36951472ee5abc24e38b0f5aeee5c2f8ec0d6a22b2e285299a21e3269"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders split card swapped: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"05559a84616f58f37fb419638b632b0789f86b3b385d027221316b20bec2d022"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders background size: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d926776f618e2de4ef912e2f866acfb2017f1732b04199b38810c47c90c1982"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders text color styles with non-transparent background: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"eec3766e8234b83de5eda8596a1acca3e0a931fe05905c3c570a292ea21ab246"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: applies the accent color class if there is no background image: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"095189256c02a19492e1e32e986eb644d03b94551626655f1ce08b4abef2f710"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: applies the accent color class with a split layout: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"88a86d3e779781502b4152df1a22f1fe69bf913ecd35360b561d5cbe99687e9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: doesn\u0027t apply the accent color class if there is a background image: 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":"koenig/kg-default-nodes/test/renderers/signup-renderer.test.ts"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"777e61309aeaa13669b348d8ef5b5081176641fcc52513448ab73a34102115bf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with only a title: 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":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"f97d130c67e27c091b5ef592d3f6a25ef1eba4626c49bb382b5edf8423f6e919"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with only a description: 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":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"45c231a34864159713a63579211fa1a5b5538dcefc2fd504ce41bd382228df53"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with only a button: 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":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb8eb215ecb5ff12bed7b85ba1112d33946ba668cded59547ff5d8162db0097"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: matches snapshot for default test data: 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":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6925385c555849317829b2cf1c295b487c0f9763de0aea3e438a1afaf90569a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without rating when star-rating is disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb0f8342f70144eadbdb73f9416906c1e06760619a1634e31c536231f6e00fa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without button when button is disabled: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f04dc34c40fb4f0dd5deb50fb9721e5d02651d5b08d83e7bff27f016ed8508d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without an image when productImageSrc is missing: 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":"koenig/kg-default-nodes/test/renderers/product-renderer.test.ts"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"50755d3bca6c5a11e8e1b556a13ecaa106dc56828e7712329297a4934951908c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders a minimal image card: 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":"koenig/kg-default-nodes/test/renderers/image-renderer.test.ts"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5fda8598e3f392f2a196bba58cc44415f864d99d823615f452c57abcf4001ed"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without subheader: 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":"koenig/kg-default-nodes/test/renderers/header-v2-renderer.test.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b277eec48e61808cc2d4d0568160e9f2933bc0a2bd6af9d41ae20d30bee55a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with srcset: 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":"koenig/kg-default-nodes/test/renderers/header-v2-renderer.test.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e0457cfefa8f11df042e3ab2c3cfa529a1f752eee9b02610c3e253c2ad9b2b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has expected button output for outline buttons: 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":"koenig/kg-default-nodes/test/renderers/header-v2-renderer.test.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"27cd498262303310d8f2e61e4884dbb5f0aed0836e3c99d99b773581a17b20bf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders a minimal header card: 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":"koenig/kg-default-nodes/test/renderers/header-v1-renderer.test.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"45254390611e402a682b0d79d90bc55f11e0f2206962deff7408242e1c2a42f1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without subheader: 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":"koenig/kg-default-nodes/test/renderers/header-v1-renderer.test.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"580cadd37fd162b373885446cb9397a139f387e086d71b9bc0c8d9e507f28e9a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without subheader when it only contains trailing BR variants: 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":"koenig/kg-default-nodes/test/renderers/header-v1-renderer.test.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"f97a199a6d9f5ab2cfecc90a77aec81a6e38652a401f952af161d31ae65c871b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: skips invalid images: 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":"koenig/kg-default-nodes/test/renderers/gallery-renderer.test.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"de113df7675da8e958edd0808439f3a8fade821753191632897cfb6a4785797d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders all 9 images in a 3x3 grid: 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":"koenig/kg-default-nodes/test/renderers/gallery-renderer.test.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28fa137b8c2a6b0d0a9a4600096e817a0a8c53b373f515f463bdce8bd6f5dec"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is included when image src is relative or Unsplash: 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":"koenig/kg-default-nodes/test/renderers/gallery-renderer.test.ts"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"627883f3a36752e445c36e15bbb78758125c145f6997973ebae4b35a3e0e0bd6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: is included when image src is absolute or __GHOST_URL__: 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":"koenig/kg-default-nodes/test/renderers/gallery-renderer.test.ts"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"01dbee34d34e7d2da95e7a38e4743902ba903cc651820972e59bda4029e72efd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders a twitter embed without tweet_data: 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":"koenig/kg-default-nodes/test/renderers/embed-renderer.test.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fc1baf5973b3593da7c10876212c99e10883b4ccb52f2f209e28a2fceeb2990"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: removes any extra consecutives whitespaces: 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"394ff536a885a11c2f944c9424dbf34e86802d5fab8c7d4fcbfa7d3089294191"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: removes any linebreaks: 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0e59ba3f70325c25fc41cbbb750e95dc755e02d0444ac106d19b397f9120fe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders multiple paragraphs: 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"b394d2ed3391caf0e60264fcfbfd9a4715def88f7e906e112f07d165fa033d27"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: wraps {foo} in %%: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8254214655648a5ed455d7db7b7d29406740dda9be284ebf2e7af59230c814b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: wraps {foo, \u0022default\u0022} in %%: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"83340b8195261b1270bd220ce99f2d3df7a4d7747db81f1c7fd41c1d7674e7ba"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: wraps {foo,  \u0022default\u0022} in %% (extra spaces): 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"21348a725858177881cd1749017cda472e651b4d7392c30e4b27f27126fe1109"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: wraps {foo \u0022default\u0022} in %% (missing comma): 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c77d96fc7d01d2360ce72e25c4d71952681dcb99aa0e6e0e0320cfb587c6e8f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: wraps {foo  \u0022default\u0022} in %% (extra space, missing comma): 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"febe647de1cde73dba8c47f44defe692e5803e6fce9f11138b31e752c44f7ade"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not wrap {invalid } in %% (invalid space at the end): 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea361a7135319228b5f0fec0fe57f203a11d13fe46b80900f7677230a8fe691"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not wrap { invalid} in %% (invalid space at the beginning): 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"4010108e7bccf9d4a47496fb07c8da67c7183ddbdfa202d2dd5cbbb5a505753d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not wrap {foo invalid} in %% (two words, missing quotes): 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"00fecd72667bbb069bd4f79624333474b3c008400ba30b7f0b1eab29956f1a5f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: strips out \u003Ccode\u003E elements with placeholders: 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"1477206b41ce3901240a5b1a3140cd6b71f986529bece38a9708589cdf9c4d9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: leaves \u003Ccode\u003E elements when not used with a placeholder: 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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb83129aacacca5a89aa06dfe1f291469688815552c5ccc8e5d8ea403de3dffd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not render button if button text empty: 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":"koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"732db33a3202a8bc9e37ffb80601e45b59a296d6d626f6c152100da68f2f9dad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not render button if button url empty: 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":"koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"44670fdf588da5b8641078a19449443be18928dd0dabbae94a2490eb03154dab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders text with button and no dividers: 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":"koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"b166d927f5634c4cc9fd7d3bf50b9438adbc94a5439e170987250ec0e3ae671d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders only the button: 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":"koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd5e6dc4cf209abc5c696dc29f68b619240e070f8bd96c187b7d8769e9e70eda"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can align button center: 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":"koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e7c53b3d6132ccfb8484ef072648ffabe1e6a2b40b0ef3c868d5c97c50517a5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: matches snapshot for default test data: 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":"koenig/kg-default-nodes/test/renderers/codeblock-renderer.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"490bef49c279d1d4258a3145234f96e2103a6de98768a5b129b476e73b8de58c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without caption: 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":"koenig/kg-default-nodes/test/renderers/codeblock-renderer.test.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"b020ba88f6e306cdf14878ee9b7b314b65521f8742bf1aea666714700d90172b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: matches snapshot for default test data: 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":"koenig/kg-default-nodes/test/renderers/codeblock-renderer.test.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc22b2eb069dbd8a30f6f8ae36cf8e375d1065402c48840c9571ce5ecdc5d375"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without caption: 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":"koenig/kg-default-nodes/test/renderers/codeblock-renderer.test.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"0caa92529cf3c411c0272b59047746fc0298416df037f110d34c303b8f3edad6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without emoji: 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":"koenig/kg-default-nodes/test/renderers/callout-renderer.test.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8b0cdc8bfceac9b051b8c124923b9938cdc77f2048cb6d7acaf7f0b8f507b75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to white with an invalid backgroundColor: 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":"koenig/kg-default-nodes/test/renderers/callout-renderer.test.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"268c98682a0cc1053d7aebfda2e36f7d002a7e7becd972b8c1a595e053a0f36d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders inline code: 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":"koenig/kg-default-nodes/test/renderers/callout-renderer.test.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63a2589a49da525c8f67019f30796c63763c6e88e8a7a6ea6e180aa7b5ce32f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can render outline custom buttons: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"f540cd9b613b42449c64b5f4ac6ae9029eb8bb402f8d9d2690ce5626b23d3811"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles accent button color: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a3076b6984a8a66a324cebc43f2b17fd3818386fbba41bcb055cc9e1e1d8708"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles outline buttons: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"659f15f93ac56784194b7102761cf2166b39a56bf3e7ff4c26f437da3d48ae31"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts black button to white on dark background with transparent CTA: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"77e7def8a73b18b8ff2fdc732cb41e6fc713858e013014859764615a6f57e709"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts #000000 button to white on dark background when CTA background is transparent: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"0865a165fe9acf49ddea9065729e1a711b98920e47ff3ab023cf366cdb987007"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts #000 button to white on dark background when CTA background is transparent: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"35db58c3f3dcaf8b64d4d2c9ab8d2ffcccfca1e192b54d5cc12e3bfd0782ec37"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts #000000 button to white on dark background when CTA background is white: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"d82f48fd46c0811e1c4f7c20e0c77936e25cb263a744ada25377b35205c52f5c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts #000 button to white on dark background when CTA background is white: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"e75537122233b9b0a89432db8d883b054c15dbbef0c21ea457cd3cb3e805dd25"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not convert black button when background is not dark: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"7524130a036a000200ba53494d4aed4247da5712e13650dcbc3f4046a2c332ea"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not convert black button when CTA background is not transparent or white: 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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"8df197bd623b62b7ee54991a7aff7a48d1301d55fbc9630386c4b942a425391c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders default button text with a missing buttonText: 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":"koenig/kg-default-nodes/test/renderers/button-renderer.test.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cec01b5e2cae8b5399fce87dba3e92efcdd2392ed5c180e4fecdbf5c5278e97"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: matches snapshot for default test data: 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":"koenig/kg-default-nodes/test/renderers/button-renderer.test.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e91a284ff954c004e31a265184be1b9aef9366b2f5429f971a439ab7c2d667e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders default button text with a missing buttonText: 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":"koenig/kg-default-nodes/test/renderers/button-renderer.test.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ad6bb3b7fd25bea9fdeced01d86de9be1ee527cf34d346dea97eb9c89d1aab"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: registerDefaultTransforms() registers all transforms: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/kg-default-transforms.test.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"07fb9af18d9cdc013a652da654546829ee7878d5ac8359ed843a8b072bdd6833"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: removes when only node in paragraph: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-at-link-nodes.test.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"4045dc0c1fce93d64a8b9c0f3894a4a812e9df8b1f19ccf6bb4f3d8729760c1b"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: removes when at start of paragraph: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-at-link-nodes.test.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff7f8c9d48cf1ca74fd4205b838db9cd5f196816f2f7b0bdf5fe2831a5def78"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: removes when at end of paragraph: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-at-link-nodes.test.ts"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"df3da8eda43069c458f3bd2ad9dcaef966246272048d4908ec2b7bbab74610a8"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: removes when surrounded by text: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-at-link-nodes.test.ts"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0652a8a43c7cff1a66cbe4ae844f62fcae64aab882a09bc5b71582d1456b8c"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: removes when succeeded by period: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-at-link-nodes.test.ts"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"30ddfe9cde7543cba671b7012d3afa2cc518b94e01ac5daa1c04eb406e5030c4"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: can register without node loaded in editor: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-at-link-nodes.test.ts"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"93a9e0bb52b720b611a2cd23e4703949db7ead0846b5a6a7a2dd388360fab6be"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: strips paragraph text-align: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-alignment.test.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e4bca715b1b46e775ddc6cddae0e2a5ce920972032264bb8a443b0ff92a8767"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles being called for a node that isn\u0027t registered in the editor: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/remove-alignment.test.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b4a5a50b55ffe41c37b366f43f8b18211ef31707fbf31d9697cd46120e23a1"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles adjacent ULs: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/merge-list-nodes.test.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b59666883b1f95163dbf1378821e5161620806a94e31a40b41c7c8a739bf84c"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles not having list nodes in the editor: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/merge-list-nodes.test.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd526010e17c1724725fdaccf261acd9cd12dcd6a737d00b0935265584f9c08c"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles images inside paragraphs: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fba3a0e55a309f6571bc24ffa5263e65cb0f3d953826eaf88ab0d5ca189d51a"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles images inside lists: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0d9d66d342acfcdd3c8e3df1263f1905f33a0f99739a2c13ef617a0c0a5b993"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles images inside nested lists: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e829c7935e8fe5a3cf150c3211245ccf40d3fbe45f80e0a0ba5b7804372ddfb"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles images in deeply nested paragraphs: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"843779d879ec077d1e7529004f5ca6d68f668450406a4d88d238ab17c55a74a8"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles headings\u002Btext inside list items: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc78f37711a52d8b21960e2d8082ddc11afd3a63637f8f4c5501872e0e8c724"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: keeps original node when it also contains inline elements: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa9b6df0d103040dda56038e6a5fa3f581d0174fe4702d92f053145564f971f6"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: splits paragraphs if image is in middle of paragraph: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":727}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2cbb901c64c4dd47afa413f24ebf1e753e9299edee1ab43690cb4e257cbf51"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: doesn\u0027t error when targetted node isn\u0027t loaded in editor: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":850}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc70e9f8c8bca0d35c315af65cb2472fd5c5fd2d727501a19922efa4273ec0e9"}},{"ruleId":"D10","level":"note","message":{"text":"No direct assertions: handles lists inside headings: No conventional assertion call was detected, and 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 read the same way \u2014 so this is treated as that project\u0027s convention rather than a broken test, and it does not drag the score. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a project of runnable samples compiled as tests, where a run that does not throw is the only check. If it is the latter, these methods genuinely verify nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/transforms/denest.test.ts"},"region":{"startLine":892}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c733bd0644091b5af310d8fa2cc608daf5295cb1345b2f39545ae1d893e4a19"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves cursor to blank editor: 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":"koenig/koenig-lexical/test/e2e/title-behaviour.test.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c100ec597401eafb5ae472bb702081518d6fd380e3efe66e15e83f5d0c17c57"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: adds paragraph and moves cursor to populated editor: 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":"koenig/koenig-lexical/test/e2e/title-behaviour.test.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"2510ab5697dd55b08f1973ce5c5070bbf021cad1bde2d6a6b02c88b87d3c345a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves cursor to blank editor: 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":"koenig/koenig-lexical/test/e2e/title-behaviour.test.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"329ff5bf037d246af0d25e27f6c3ce074e373206b2c3d94537a4d0f7c67527eb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves cursor to editor when title is blank: 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":"koenig/koenig-lexical/test/e2e/title-behaviour.test.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d512799cb88338266de273b675039d898d33d40e89760171cdd8cec8624d150"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves cursor to editor when title is blank: 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":"koenig/koenig-lexical/test/e2e/title-behaviour.test.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd83b4a6bca3aa826a6d14b0910a5c493e15dec24ac2472534f013188dffc755"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has correct order when inserting after text: 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":"koenig/koenig-lexical/test/e2e/slash-menu.test.ts"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"39151a7f3a14bfacd3dc71f16a3c78d0d3ad58b64268cb3d2f8ffd7b7c3f975b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: has correct order when inserting after a card: 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":"koenig/koenig-lexical/test/e2e/slash-menu.test.ts"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7452b7043e49765672075239df3f1ffe50dd7b5b5adddbaebb7a7a46c899aa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can insert card at beginning of document before text: 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":"koenig/koenig-lexical/test/e2e/slash-menu.test.ts"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd2e23df59157212e205a4afc9099fdf94f573491970af25762c14ec716834e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can insert card at beginning of document before card: 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":"koenig/koenig-lexical/test/e2e/slash-menu.test.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"2371ee75a4b538b50cc12b36c2685ab7657bf461a5fe409e4289ccb01f8d8890"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create range selection covering a card: 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":"koenig/koenig-lexical/test/e2e/selection.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"306fca06beee9bb70b6e3c7949caa553de3ea5ab68d0dc7f7055f912c84a9b8e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cards do not show as selected in range selections: 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":"koenig/koenig-lexical/test/e2e/selection.test.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"39458ad3987c88678aa5bdc2830104f83a7dd7ef7f597faac3459ae9d4f8a2a9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: works with first and end nodes being paragraphs: 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":"koenig/koenig-lexical/test/e2e/selection.test.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5534fb895362089e36ec2f88aa1cbcad41c05ca5cb45e27b427553fa9c323ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: works with first and end nodes being empty paragraphs: 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":"koenig/koenig-lexical/test/e2e/selection.test.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e2f182154c55c1ed2a0f4689950f35382cbfa658673bb700b895db99c879e54"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves when selection moves between empty paragraphs: 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":"koenig/koenig-lexical/test/e2e/plus-button.test.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"311db81f61a3c26bd8fac16bd6190bda63b32d7b89c29d9163b025253f27ecb0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves when mouse moves: 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":"koenig/koenig-lexical/test/e2e/plus-button.test.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b40853ce94cc48cacddb21ef3affe62ad28e94652dd62a5f9082a0f4ec8b99f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns to caret position when over non-empty element: 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":"koenig/koenig-lexical/test/e2e/plus-button.test.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8adfc432779cae7b01978da5f348717df12409c18b8ab9b86d8fcf455b50b62"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves cursor when opening: 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":"koenig/koenig-lexical/test/e2e/plus-button.test.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"716a99c5ba47b944247170cb5bc6191700211a98f2f1b09d30c425421b9ac7a4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: deselects a selected card when plus button is clicked: 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":"koenig/koenig-lexical/test/e2e/plus-button.test.ts"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"2738a720a0f0197aa152ec5af528a4c2833ff3c0e5f93cab87b5d55d3eeaf1f8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts line breaks to paragraphs: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ec63063d8d767597c2a645347215a48b2aa1739ad90de0d4300f6c18ac0161"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted at start of populated paragraph creates a link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c879efd830a00c671f3d4e8441b8d4250894e0ba4e279526189b7dbcb8a392c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted mid populated paragraph creates a link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a84809924af1d19fd6d50bb87a3c999df219d1478467db2932fe20f819de6b5d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted at end of populated paragraph creates a link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad0ac956c30e501db3dfd087fc36e85de11cc0bb085fa4aa6624d1dfcfbd9d53"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted on selected text converts to link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c194c4cd929c42e9a86b56df0edb87fea64eb12af0a1e366f11422e7d3dcd1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted on selected text containing formats converts to link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"57dcb1bf294cdf22e35e6aa18714f866096ba6f8c36ab37b6d4ce1afd6e98de6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted on selected text within a nested editor converts to link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"061301b54d3a658c9857d9ed9791e31a24b8fe1cf7acf4fe0e99e418156cda39"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasted on blank paragraph with shift creates a link: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f6738ba9c1507d098d76f8fd200a8e788472bf44e63371fe849f9e962b4298"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: text alignment styles are stripped from paragraphs on paste: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb96ce57e9ce0b3149bd91c04dcc9c481bd93c6412ca975751dec31e4a58966"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: text alignment styles are stripped from headings on paste: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c9a770be0e303bd02960da687b0a765c80c512adb779fe31b96e6f3d5fa1274"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: text alignment styles are stripped from quotes on paste: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a615e4b5bb110737a5ac8e676216b30738843521ec9b56706c7698d353280e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: text alignment styles are not copied over for lists on paste: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"956be5660a1cac70170516d1470c5f661ec515f1ff21f590efa5672c92faeafd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: text format styles are not copied over on paste: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"479a5602244e2d51623bbf9c3e15786bafc2a0b9e67910366c9fbd99dd0b39bc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: supports basic text formatting: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"37cfc9d63a6512a3cd68456928b34cf128d14df0bb6e7fce8998d7cf0e3189b6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: supports headings: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"b423bfc9c6204f6e226dc4c14d5c036669e3c60c2d1ccd253b15e067d608b14a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ignores line breaks between paragraphs: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"50068789e49fbb2558e8c349ec9fd7fc13bff785adc34cb630df35286b699a63"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: paragraphs containing Google Docs heading span at start: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"f66f4df93aed63bddf726daa466772d01339f5bdcbb8383c9a88cf3269fd6cad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: paragraphs containing Google Docs heading span at end: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"7940d0008c3e1a7f083439d8b80f56f19a5a4098aaca248db372133bf9fd66de"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: paragraphs containing Google Docs heading span in middle: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4ba4d3a74f167440bf34929dc3bce7221083a9a63208438cbff80d63fb98d9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: headings containing Google Docs title span: 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":"koenig/koenig-lexical/test/e2e/paste-behaviour.test.ts"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dafbc004eca993933e66cbc3a6075f5ee0884965c27f23587b6018c59246b02"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: nested elements in paragraph nodes 1: 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":"koenig/koenig-lexical/test/e2e/node-transforms.test.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"c21ae54e6299530cb494e62324b64f12c28d57096258055c79399a1adf1e4596"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: nested elements in paragraph nodes 2: 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":"koenig/koenig-lexical/test/e2e/node-transforms.test.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"c273bbcfbe0d8c38205c5e53f3d5220ce96cdd5536c7c708552ef3f3b37c8a50"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: at beginning of populated list item after paragraph: 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":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"21defe6cf800a3bdfd2a6fea4384b7125fae8f9b5945aef9baa1c2ff87f55472"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: at beginning of populated list-item mid list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"2487c0c7b4b98599f41fab090dddd7348f24d9157c70d0732235effddda9722d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: on empty list item after paragraph: 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":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d974b96c13762ca12c825633a69976abdaa5b303ccda18b645cb729e18d323f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: on empty list item at end of list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c560b73cd131ba410b3ce0cd455110b37dd85abe080dec0f70a7f07e69147f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: indents on tab: 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":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b746612de98acea49930d0095144bca3370df5e4b27b5f9c9017c77a948f3fb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: dedents on shift\u002Btab as long as indent is \u003E 0: 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":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e8db28f2b0a433b9c8d26cd0052a358d97a2fe7d3876ed798cb57c5b775a9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: merges two ULs after deleting a separating paragraph: 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":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0238ca0290ae41743a9f5b99d02c33b60dfee898b865f7ff1135047d4c79974"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not merge two lists of different types after deleting separating paragraph: 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":"koenig/koenig-lexical/test/e2e/list-behaviour.test.ts"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aa60353cce6ae760c57815ff4e3ceed04afa27a1361be71253439d6532958fd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: displays default links with no query: 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":"koenig/koenig-lexical/test/e2e/linking.test.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"67351788cb913ef62a175f7ef0dbdcaae938a8abffb50d3504bd723cea96e7d7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: removes at-linking when backspacing: 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":"koenig/koenig-lexical/test/e2e/linking.test.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"be60bfd6db55038fd8d4cb4557e10b7ce6551a2b63de9fbaf63c9e4ec7be5e8c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: bold: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"4223be470cede63909d8bb16257cf5e29aecb3eac47a497dcaac2dc92acca973"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: italic: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b0c69f9ab26525afb7e5cabb4b879b3d751b70c0d45cdf95413b74f1c0048a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: strikethrough: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0ac0e85858868a5dfe0c9512cd8c8b3939512bddc049c97424b90b089fe07c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: link: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c2983e1d0efb65dd68afdf152c747cc635cd5151b572ecf841f126b236f662"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: inline code: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"9934beea1974ca6bf97466cec21fa540b6e51f961ac365f259c81c1395895c1d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: highlight: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c9e56056c5f684f409e4a56f3136dc0f0b21b754cfe7f24aaa65199255ee5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: quotes: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa556a7028ddf021c37b9fd29f7853456b0be5585cf4ef4dc199e3ae590ff0ab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: specific heading: 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":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"695933e97fc04659e845200be9b6e2dfb34958185e9e2cd724ef04d60fde5d18"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: unordered list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc3670b4e694c179bc9eb88c2940604b3c21c21cf8a393280ffaa871b69b601"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ordered list: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/format-shortcuts.test.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"6388a9b1cf66f1f3a1b8d996ef9e0d7c638973ecbf59d0c7b6c05151bdacc7cd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create link (without search): 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":"koenig/koenig-lexical/test/e2e/floating-toolbar.test.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcbbe3de0d49f547293fba98d288a885aa71013f915ff791b08cf33e1fec1d16"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: toggles all text when text\u002Bhr cards are selected: 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":"koenig/koenig-lexical/test/e2e/floating-toolbar.test.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5349b5eb64fb4ec646492c801240767985109ec46f90b1ea239ee4684bfc3eb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: toggles all text when text\u002Baudio cards are selected: 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":"koenig/koenig-lexical/test/e2e/floating-toolbar.test.ts"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"b35e43ce957ac8d25356ce62166209dcfaf73afc175d39f8356321691106cb71"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: click selects card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"33065e3f7966846832ae7fc9b4fd1b266b9990dd2fc17f8bab4fa057954c9385"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: click keeps selection: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"8302efcef481e4288537ae0fbb4af414565605c736005d4eb4d5f6f0e0d51093"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: click off deselects: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"dadc1b6fdb291f20a4a53f923522cbf451e8c5593011c3e6abc256f512677789"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: click outside editor deselects: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe2b3649d65870f428b04e607964e5d1ddfbdb60bad0b815aec9a69542fee70"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clicking below the editor focuses the editor if last node is a paragraph: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"fada41508489d7484e19d1cd080916dd9cf5c3866c2f399f914070dc2e4363df"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clicking below the editor focuses the editor if last node is a card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"510f244120f5965e0c8a92da44bd60ebd32346e4c77d70751e54301314e8cd0b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clicking in the space between cards selects the card under it: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"d40ef5f99b7f4b74375a2c0da4c1885ea0b5e7cf102f261eac86727478e25bdf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card after paragraph: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f0b0226b3585c878896a8791f7d74330c10a8eb6bff62d556fec67a67db53c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: when selected card is after card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d7a4095d633253af8018119bb7db2c47724a46e24943046877b1685b92c104"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card before paragraph: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d3e255fcfa2341c1a38920786fce9c91c8cffdcb6b31af704ed78bfcd491da"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: when selected card is before card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f3d3af4495c13759cce48a3ea34bf2a7a3308f570ff866fcfd4a89de5d96dcb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card after card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4a7b89c5a707ead6063300727de1b7be5e8904ffdabc4256f857c6db4a3faa3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moving through paragraph with breaks to card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc660b3a33bc0ae1d8a0a60afedced6f378b522e3e0fd43e94144fa984342198"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card before card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42775e62e7f0e80f38a93d6aeffc9e9ae0ad3e6308e54a84db06a73e0a6ec8e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card at end of document: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"f585e3b750d6dcd2efcf8bf51fffae7de9eae874e1e4ff966dad875bc48b602a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card creates paragraph after and moves selection: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":850}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f774045d151581c9deb6157a616ac002cb851c3111bccb940e0d8a0b0763b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card after paragraph: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":887}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b70f4e8ece10b8560a7b9875cfd767e0c38fd6c09db88c9ee354c27dd6f90ef"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card after card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d33ad90ccd0e4f95e5ed57597300e00e3d68598de50a3e3ca3ecd4d19a0eb2f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card as first section followed by paragraph: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bf5483c0bf26bb4cd4dc090f6271445b304554fafa3b6e6e89292355f28c9ce"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card as first section followed by card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"6808e787bddf4269d77623f680bf250d41f2073fcfd4316c46aaf1d49d73a54b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card as only node: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":987}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3628c3de11e371c7875c0f7f96e2971fce7848859c33f0471442b3956487772"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: at start of list after a card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1079}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1a1a543de45b5f9d925bdf741ae635b75076753bd6dd2b87fdf598491b3b57c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: at start of a quote block after a card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1111}}}],"partialFingerprints":{"codehealthFindingId/v1":"408a7164ce4eb5b54b77d96f0f22d5607b0acdfdfe7a58cedefc6a5c169721f5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: at start of an aside after a card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e750ca2254696e5fbba38bc2dc8c304a32459dfb1c34ade19ad95c2380497ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card before paragraph: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1174}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d685a1c0661fe53319d2699d651642204cded94d1608dfdd353d7c5f0a2162b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card before card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1203}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cca16c0339042d0314b6fa4f4addc8ff6379718cb0419092b89edf9170f9bfe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card as only node: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1221}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b4667c5ee27c8624a63c1537ffc6a0a6035505548021f477520e8a187072a5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: on empty paragraph before card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1233}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8f4935825c136a7518d2b3427ac44447388c3466c095d1c790ac0fd3b55acab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: at start of formatted text in paragraph before card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1323}}}],"partialFingerprints":{"codehealthFindingId/v1":"a96d4fd0b5b369caebb3e8df1d53d2ab46b73fcda3f119babe9adc4bb8a96015"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: on an populated paragraph after a card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1374}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b4a639d4a065a7a3babdfa297accfcdefd8f62e1a17c0f0891f83e9cc793483"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: on the first line of a multi-line paragraph after a card: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1390}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01321d71b49297d3d1dcccb41b69e80cca1da69b833e44cb9b7d51aed2fb9f4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: cursor position when deselecting empty card with nested editor: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1455}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d5a444e7b4329929a64f8351c90101c74bd2cf447f8df29662b7c631f6c514"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card and plain text at top: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1665}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5ffaee030719e1d1085b21a068b97d631d51e6a7947af32685ebb4b2b1544e1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card and card at top: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1683}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3b7a8ceed6eeff9a5e506e46e0963e376a21d7f3fbf8976cc5b6a15779367a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with caret in text and card at top: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1714}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc1c33cd37e980901589109eb1c58b9842553108dd008c7bd427e5754bb2877d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card and plain text at bottom: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1740}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c47f895381a6b8463e15ec6d6c55265a254fb3d1c81494c10daa2230edcf559"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with selected card and card at bottom: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1758}}}],"partialFingerprints":{"codehealthFindingId/v1":"db17f39253571d6622528d004c50ff0d1349e00255e5835d68de7cae1bb4ead7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: with caret in text and card at bottom: 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":"koenig/koenig-lexical/test/e2e/card-behaviour.test.ts"},"region":{"startLine":1789}}}],"partialFingerprints":{"codehealthFindingId/v1":"496af112e35c5652d1510ec6c58b75fefb6eda50defe27fe862b43c22c4aaf3f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized video card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/video-card.firefox.test.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b823c359e4bb5d10a09feff0e1d76338c1a309ceb8f8c4baf5c93419da817024"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders video card node: 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":"koenig/koenig-lexical/test/e2e/cards/video-card.firefox.test.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9169ccb8bb88767257998d65c6752ec1c243b3c1ea783021793414ab25d0b7b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: adds extra paragraph when video is inserted at end of document: 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":"koenig/koenig-lexical/test/e2e/cards/video-card.firefox.test.ts"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"17997cad3a1f149f0fb3dd51e7f1585fbd2305944937bc48e3a7a8dede2c8c7e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not add extra paragraph when video is inserted mid-document: 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":"koenig/koenig-lexical/test/e2e/cards/video-card.firefox.test.ts"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"d40d74e623a0ad5acb73e4bfc6c6374784fdab2666206957f58115bd968ec941"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can undo/redo without losing nested editor content: 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":"koenig/koenig-lexical/test/e2e/cards/video-card.firefox.test.ts"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"bffe6090cdf3525cc468e17d4dfaf71a5ff824d3fc52f483c28c3af54754363c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can insert card via slash command: 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":"koenig/koenig-lexical/test/e2e/cards/transistor-card.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09b09222d05d0b6d02f958cd79f472debd06cd7918a3e300933bc066caa6395"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized toggle card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/toggle-card.test.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"387ec1b14e53a881393a15c5ab6952a996ab37d4524562d3a96dfb8388f25378"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders toggle card node from slash command: 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":"koenig/koenig-lexical/test/e2e/cards/toggle-card.test.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"defeb23ee8cfecd6453747480b81cd076cf2dba4542341f845e12162db5f156f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: focuses on the content input when \u0022Enter\u0022 is pressed from the heading input: 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":"koenig/koenig-lexical/test/e2e/cards/toggle-card.test.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e2ddcb23b7da3efcc6da96147aff120cdcbace0cea1f10acfa78812151dd9f7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: focuses on the content input when \u0022Tab\u0022 is pressed from the heading input: 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":"koenig/koenig-lexical/test/e2e/cards/toggle-card.test.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"e78eecf96d1f15ee7e82f8b9ba37d869a30b52ff7294ae6e85d32a6758b88e4e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: focuses on the content input when \u0022Arrow Down\u0022 is pressed from the heading input: 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":"koenig/koenig-lexical/test/e2e/cards/toggle-card.test.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc068cd140f875a859a9c0a2ec06a26ad201ca947abdb8f12ef8aad2928e37b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized signup card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/signup-card.test.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"530f041773080255f9d6d44a8f0a120b51f0f488dedb74e1da28df51c63beef2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders signup card node: 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":"koenig/koenig-lexical/test/e2e/cards/signup-card.test.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"53acdc9258b7e5d91efed4590ad90ff6ebdcdb736b6f5f579ff0e69eb2e51f8c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import when brs are present in the serialized content: 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":"koenig/koenig-lexical/test/e2e/cards/signup-card.test.ts"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"426f3ba370339ac983b4c77390cfd025b5998090d0d81caedcd1aaf400925bdf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can put a br anywhere: 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":"koenig/koenig-lexical/test/e2e/cards/signup-card.test.ts"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d3beba42102be78d19aa9afcff7e90a9a58e35903e0edc3492156f7d289c3fb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized product card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/product-card.test.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d18bd28b0db51e720c5d9af452a561c55ea6598f1e11473cb7324e3e96fa5fe"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders product card node: 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":"koenig/koenig-lexical/test/e2e/cards/product-card.test.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f2a92994ff919c9e7d7b40b8aa2a957fe1589096b268c9a724b0ace685c6980"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can fill title and description: 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":"koenig/koenig-lexical/test/e2e/cards/product-card.test.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"874f85511b68b7043fad0966ff02858e2b6a1edc08a59273e14351df82a8e5b3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized product card nodes with a br: 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":"koenig/koenig-lexical/test/e2e/cards/product-card.test.ts"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83bd1ab28801f7bb2ec651ac5c77aa6443ea5332ee3bb0183661d4dc2932744"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles receiving titles wrapped in p: 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":"koenig/koenig-lexical/test/e2e/cards/product-card.test.ts"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ecdcc109d5ba7cd94a42fbd3eb7908bb86681302f02ca1c46f784e4d957307"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can handle new shift-enter in title and description: 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":"koenig/koenig-lexical/test/e2e/cards/product-card.test.ts"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c877511d0a807a2231be5a3df6da558a9eae5e99dc2cec2ca7040a15da4d93c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized paywall card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/paywall-card.test.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c79cf500def733e598d24d0e61a029d9ab1b80dbdd0b93e063318c2e1afa4ad"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders paywall card node from slash command: 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":"koenig/koenig-lexical/test/e2e/cards/paywall-card.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"36206a089c6c9d09713ef67bb4e085a8dffb38155188e1a4588247eb7549659e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: focuses on the next paragraph when rendered: 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":"koenig/koenig-lexical/test/e2e/cards/paywall-card.test.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab933229ef5c8ac6302b0ee49ecefe53ddcb9d37acbadffa6ebd37985958e7ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized markdown card node: 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":"koenig/koenig-lexical/test/e2e/cards/markdown-card.test.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae35c4c08a0affcfc64778e0b4c054086f6b7ace47c2155134919c81858d9b10"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders markdown card node: 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":"koenig/koenig-lexical/test/e2e/cards/markdown-card.test.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"07bae584548abaf0a847696e94e35e89d48026b895eb368b17118a5eaad40c89"}},{"ruleId":"D10","level":"error","message":{"text":"Assertions commented out: can upload an image: The test body contains commented-out assertion calls and no live one \u2014 it runs, verifies nothing, and still passes. Restore the assertions or delete the test; a green test that checks nothing is worse than an absent one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/cards/markdown-card.test.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"7201cb9298c85d41499645fbbb25f3fe42cc9a460fbc7d86380ba848dd4b21ee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized image card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/image-card.test.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec634fa33f43f96544e3eff2ded42e93ac1d7fb887e6cb3448d6f73c780a8041"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders image card node: 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":"koenig/koenig-lexical/test/e2e/cards/image-card.test.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"598f2b3368a641487211beef6cf1d023a314fefe0217ae5e2cfd5640faaf133c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: adds extra paragraph when image is inserted at end of document: 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":"koenig/koenig-lexical/test/e2e/cards/image-card.test.ts"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"f08af3903a7932a8a5de76179105b60613201d10d5bdabe00b7b27efa146aca5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not add extra paragraph when image is inserted mid-document: 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":"koenig/koenig-lexical/test/e2e/cards/image-card.test.ts"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"0582be1243eedfb43b17a0c49901a0d397195b7ed9a657a4216141d926d315a9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can insert unsplash image: 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":"koenig/koenig-lexical/test/e2e/cards/image-card.test.ts"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"874f34f639969fd503fe4ed2523c5d0a3dcb1f0482790aa766bb19e2a68c6574"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized html card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/html-card.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac5412766c77436b7c737b3601ffea1f872656a64bc853a4304c002a2300595"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders without style elements and attributes: 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":"koenig/koenig-lexical/test/e2e/cards/html-card.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8ded46eb5d179f3d82ae3f559c0ad681e4bbbc26a3130062cb7a22446668e09"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders html card node from slash entry: 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":"koenig/koenig-lexical/test/e2e/cards/html-card.test.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"084d4bc8d33656ca116a34b2d67891bbdfbb8d6d473e0bf1e84f696288f420e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized header card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/header-card.test.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"5420b65e17b003675d216dea81021a36449a4b25af2533b03cfc9018c7bb9691"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders header card node: 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":"koenig/koenig-lexical/test/e2e/cards/header-card.test.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eb171a0d3e128788c807d32c4497681d2cf92e015b27cd54458a1487588ea2d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders header card node: 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":"koenig/koenig-lexical/test/e2e/cards/header-card.test.ts"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa607ed04cc8c351ab828e72a068852f889178c95babe7a5a4773093f80f284"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add a shift-enter to header and subheader: 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":"koenig/koenig-lexical/test/e2e/cards/header-card.test.ts"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"c910336b90cad3d09dde792d1df7adcd892d1ddb74abb720bccbe057b09d53d7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized gallery card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/gallery-card.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e2590e0339538a1876ffe9ecc652252146859673373cf1b1411acdd25f5326d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can insert gallery card: 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":"koenig/koenig-lexical/test/e2e/cards/gallery-card.test.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f26e72f4be99f94d02c4d158b1d454c46f4b3999330ac82ed1d87de81ed8d11"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can drag populated image card onto empty gallery card: 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":"koenig/koenig-lexical/test/e2e/cards/gallery-card.test.ts"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"75e5571034556f1f9621e04a1ad7b08d84e9aa182b1e39514b116c28c11327b3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized file card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/file-card.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbde4ac4c2a95d90d7dc27478ed56d7e8bf9160c371ac66e2be1c0e6e652bd5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders file card node: 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":"koenig/koenig-lexical/test/e2e/cards/file-card.test.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b6a0c1828ade6b4812c1b1d23d845d1659291b0bfbdcd609df5398d1b7d551"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can upload a file: 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":"koenig/koenig-lexical/test/e2e/cards/file-card.test.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"3938f814a8ec0fc82241516220855579b85d82308b9dadb11c28f41aaa21dd70"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized embed card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/embed-card.test.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"97728aea30b928d7f6b9aaba512262aa1c2098e90e177ee33456c61e4264adb7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import a email CTA card node: 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":"koenig/koenig-lexical/test/e2e/cards/email-cta-card.test.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd752dad254df9406a62752809de652317333bab3be985507add5dc6506281c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import a email CTA card node with dividers: 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":"koenig/koenig-lexical/test/e2e/cards/email-cta-card.test.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be665c5ad7d36d6858b69be2b016e334febc56d76a833bc498c1bd68f0b986f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import a email CTA card node with centered content: 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":"koenig/koenig-lexical/test/e2e/cards/email-cta-card.test.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46ab95c2d9308e3d961afc9cd1508452324f1a3ac1a8cc55db4510fba51ee84"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import a email CTA card node with a button: 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":"koenig/koenig-lexical/test/e2e/cards/email-cta-card.test.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"169eca34f95e77b73124ee874c1badc001cc30ea07fdbe7e84bdf1c0566f4b0b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the email CTA card node with a settings panel from slash command: 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":"koenig/koenig-lexical/test/e2e/cards/email-cta-card.test.ts"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91534fd22ac75db9811d6a804f7be575c9e6c7563f884c4cdd8c94c8360d1b2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats typed placeholders: 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":"koenig/koenig-lexical/test/e2e/cards/email-cta-card.test.ts"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"9526173869479a5bc95313daf31d1c7f3f8efcaa0ff719ccb56aea2f0402ca31"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized email card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/email-card.test.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c638293f9e12e9ac253922eb7dcbbe38de39150f5d03e006d556252a8e6f5032"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders email card node in edit mode from slash command: 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":"koenig/koenig-lexical/test/e2e/cards/email-card.test.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4271bd476302689e33f43cecb3faa22f32083d5edfa5abcb2b71767a87102b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats typed placeholders: 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":"koenig/koenig-lexical/test/e2e/cards/email-card.test.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9027a7e8c79b1fd0c9cf81f72e95eea4af774e8d2b1faaf9501f8706fbb7fb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized code block card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"0429d12e41678ef651d06ff40d876eed50b0cc87b10c28efaa2515d5e343b976"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with \u0060\u0060\u0060 \u002B space: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"72cdf62bfc8fb5c4d1ac8955961f7e61752d09a6f375df01b01aabc176a5f69a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with \u0060\u0060\u0060lang \u002B space: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf24f2cd8c4e0b2837f62556f17cd813496bccd6e0b81113172f74eed4880d2b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with \u0060\u0060\u0060 \u002B enter: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dc0540ff5a84e73d44d2de41bc77101cc1a5fb597aa60d377c586f651f6db38"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with \u0060\u0060\u0060lang \u002B enter: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd3fbf12cb4bec5f00c5711a0f7060acec7be4d23d536a2bcf2a10921e4d5422"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with \u0060\u0060\u0060 \u002B tab: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaf314314b25dd75a573a9924bafcd7924f99a0f77b11b3337a75163c86691a9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with \u0060\u0060\u0060lang \u002B tab: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a9e21ed9a342864a4243eb1876628b99882e65e39e2d8fc4da0c427f80ff4d6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can undo/redo without losing caption: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"88076a170e5970e82f8a49e71a9cb3213c4e2691bfce831356f322b19c2e469e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: goes into display mode when losing focus: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccc989dfc9bf486180af5e01df6d7a7a2ba2ad57189519c62c692ea1ee144d22"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can cut text: 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":"koenig/koenig-lexical/test/e2e/cards/code-block-card.test.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"895d3dd683e0b69ba510913da649d05631b538cf5902da6b07bdf01ef54676dc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders callout card: 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":"koenig/koenig-lexical/test/e2e/cards/callout-card.test.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0dc45168c8e16b37e817527ee22192b0bb21ae4be1dbf3e7a0d79d367f3875"}},{"ruleId":"D10","level":"error","message":{"text":"Assertions commented out: colour picker renders all colours: The test body contains commented-out assertion calls and no live one \u2014 it runs, verifies nothing, and still passes. Restore the assertions or delete the test; a green test that checks nothing is worse than an absent one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/cards/callout-card.test.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc4c96553ed38b40206612d3a434523ccaac679c1adca607e38f6940fc7a7ab"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: syncs display state content: 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":"koenig/koenig-lexical/test/e2e/cards/callout-card.test.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"12a550e5515c02d3b2b495c7f6fe7164876a51b71cfd5dd4a27d7aafe4785e99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can toggle edit mode with CMD\u002BENTER: 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":"koenig/koenig-lexical/test/e2e/cards/callout-card.test.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfbd0dd660e6ded5217d9cc9303c1b0a479328a0f4b711218060d415ecf6e8c9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can leave edit mode with ESCAPE: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/cards/callout-card.test.ts"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"de669af07ae06269b0eb64d0d1bbc9941407386baf2d7fc5cae658eaee0f3a75"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized CTA card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/call-to-action-card.test.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c4f8c937e2a6604a9e26d88606d8252d0129249eae40592a6ccf70a581dc936"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders CTA Card: 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":"koenig/koenig-lexical/test/e2e/cards/call-to-action-card.test.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b14139646875a27c7aacc95e2a6dd3b2c776692f571c37fae6b276faded818"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized button card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/button-card.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ca0eff11c16a94a4367a903591eea319f8e1e26edc8376dc7867f0e29d74431"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders button card: 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":"koenig/koenig-lexical/test/e2e/cards/button-card.test.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"8427dd338422bff404cb04e33d33f5399f646d38dabbe28b422c3b3c82e62457"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized bookmark card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/bookmark-card-without-search.test.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"67553a75a1456c5effe9cb038fd68cb0726bd503d941ceae5f3ba96d248f6326"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders bookmark card node: 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":"koenig/koenig-lexical/test/e2e/cards/bookmark-card-without-search.test.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a0b5474d666983f1884325b50ac68bdffa63d74244827b6e69862bff000acd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: escape removes url input component: 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":"koenig/koenig-lexical/test/e2e/cards/bookmark-card-without-search.test.ts"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"c28a4501b5f01ec260cad805fc352ac1e9855ddaf0a1e32a6255060f28777a19"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized bookmark card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/bookmark-card-with-search.test.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f032a70022381b0e34ab66eb907adca3109616cf7dc4dd59498eedd24cb60c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders bookmark card node: 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":"koenig/koenig-lexical/test/e2e/cards/bookmark-card-with-search.test.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c0f4cb145aa7af32097f40dd8c4c8260e94a48597dbf215c84e85963a6021b0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: escape removes url input component: 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":"koenig/koenig-lexical/test/e2e/cards/bookmark-card-with-search.test.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"023eafee08ae73cbad358f257857a9485957c39146200281fe72d1b6003ec7cf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can import serialized audio card nodes: 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":"koenig/koenig-lexical/test/e2e/cards/audio-card.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d1d35a59ac5214e33a0059e48ceb7b9b70faa230021909a4369ddbb0b8c30f0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders audio card node: 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":"koenig/koenig-lexical/test/e2e/cards/audio-card.test.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"82bb92032b822cd27c4f3d59c6a7eaa94db5dc055b4f230102cc06f0e4b48438"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can upload and remove a thumbnail image: 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":"koenig/koenig-lexical/test/e2e/cards/audio-card.test.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aba648814929b4e30db600b8973006175d1acaba8571c2f76fc76023c5e7b62"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows errors on a failed thumbnail upload: 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":"koenig/koenig-lexical/test/e2e/cards/audio-card.test.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccadcc0e2fe7a83d18318acf1df262fa9d8ad85930dbce2abb0cfe4b0fc79518"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not add extra paragraph when audio is inserted mid-document: 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":"koenig/koenig-lexical/test/e2e/cards/audio-card.test.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b33b332faa982926dc7350fa860072c3243d5883e311a9236af3f1972c92b4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: adds extra paragraph when audio is inserted at end of document: 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":"koenig/koenig-lexical/test/e2e/cards/audio-card.test.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a83aa0580ecf83936ac81b95c5bb3e2137e4306744ae5c8874a07b81c905e9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add basic text: 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":"koenig/koenig-lexical/test/e2e/editors/minimal-editor.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dfd110e90aa245310d9070360a6d0e12b977dc6fbbbf2c6860af7c5c1177db8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restricts to single paragraph by typing manually: 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":"koenig/koenig-lexical/test/e2e/editors/minimal-editor.test.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"07664e25242044e3dc1ff1d2c72ce2c9b769e8428ddd4581b91f9e2d8c835204"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ignores hr card shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/minimal-editor.test.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6220c2c1076bdcc8cd450c53ff20130b656793b4d5c50e2bb394a301ee8cb0cb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ignores code block card shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/minimal-editor.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"4144bb66587eac2499c1617cece06c79e9ddd5fbfa1b3088568ea90e7a4f4809"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add basic text: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"323b936545201fdb5f085b1b01c8819474fba82691d85002c09e7ba420e63911"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add multiple paragraphs: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb90c9343d5ceeaded0c2ba83144eec56e3f2d9a2893cc146f163ba9de07d65"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create headings with ## shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"097a0fd451201f66758454aedb9a65f447d818274084917992a36aa212bdc363"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create unordered lists with - shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"8431a9c4abd3a1bb444e6bc0443dce4a9db9dd5da410727d544885dd2565f87e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create ordered lists with 1. shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"d95f6f77073ebf4957e488b5c3f0e68271c91e8a746d1d206fae8782065c2cd6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create horizontal rules with --- shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ee6b92e39cbd4b592e1326e62fc1156b3f7538dc2ea7bd5c3b86d072ed5a689"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: list backspace at start converts to paragraph: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"7de55ebb75ff431d8da64707fb20d76761b9111d47b4d8a0628cb3ca994e6648"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can create blockquote with \u003E shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"daaaa0630acaa3a47ef148b1471987dbb91219a957627e1540cec42210157370"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: code block shortcut does NOT create code block: 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":"koenig/koenig-lexical/test/e2e/editors/email-editor.test.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe36ba5a4d7106df6b7aacb799ba77747a16146adb4943eb45842bb3acb1ea2d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add basic text: 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":"koenig/koenig-lexical/test/e2e/editors/basic-editor.test.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d087d6e2780b09b6bf0b073b67fee192a4051ef290c295bf3cedde69d5eac2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can add more than 1 paragraphs by typing manually: 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":"koenig/koenig-lexical/test/e2e/editors/basic-editor.test.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5083fe4fa88225e4d05e1e10cf8171f2097b4064aa12b8610e26c1c70bebb52"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ignores hr card shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/basic-editor.test.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa6a170399ea25ec41a879b4ec73032b846d70666e4e3d1c1f99174074a08b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ignores code block card shortcut: 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":"koenig/koenig-lexical/test/e2e/editors/basic-editor.test.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f7264c1041b9bbef120afa5cc0f284b12257850b8d9d33395388af066fcec57"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: highlights TK when preceded or follow by emdash: 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":"koenig/koenig-lexical/test/e2e/plugins/TKPlugin.test.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6824f9ebc72d9870bc934ec9b854348cc08a478f6b208001be48d117dab970"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: continuing to click the indicator cycles through the TK nodes in the parent: 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":"koenig/koenig-lexical/test/e2e/plugins/TKPlugin.test.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"697f3ea2bc4c1a1bb3f3da5882699626003f958224ea2ded1bc24b19474247b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restricted content editor accepts input: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"68249c9622536fed5d793f84c78c6f82a677ef779669135ed4e85acf01164eb1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can not add more than specified number of paragraphs by typing manually: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b087b2915d7c70c516e16094b8fdc9b9d59adeb2792c431bee1e6ec6dfb41810"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can not add more than specified number of paragraphs by pasting plain text: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6d276e49673c6911320a64e3c48c115d38c6a0b2c46d268446cb637982f9de4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can not add more than specified number of paragraphs by pasting HTML: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"36e7756941d6d10f6c5666e56128d578a95bc4516a63b1319e95fd118c5f11c9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can not add more than specified number of paragraphs by pasting Lexical: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"569bc9fdd2b29a6add12905835a0731d612a1e477b7d8909e39ba1e968649341"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can not add more than specified number of paragraphs when paragraphs \u003E 1: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6a6158040042b57712a3bf45c42b3f13d9d91797188b46ecdfb166c1ff1bc3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats in paragraphs are preserved: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"74cd26e982f35a63a5bcaafd84065fa29782ddb2374459444dd0fdadcb1d54ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats in first list item are preserved when converting to paragraph: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"71c806d9a80bab6b37719fda1a84780b0c03c940be561eaba32c3d44f0610c25"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: headings are converted to paragraphs: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ba93d7204cd19f3d17f9b0c91a564ea6cd664334ec472f5c361f01689bf842"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: pasting over a selection does not bypass the restriction: 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":"koenig/koenig-lexical/test/e2e/plugins/RestrictContentPlugin.test.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"c475c28f1c7beddbc0fdcca8b018532c9f75bbede7803b5de5468686f95969b9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats {first_name} as code: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"0609ac93e41d6a550198c66ec8a71ef96ceb8b9639d7bcbf88ce5018629af0e5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats {first_name, \u0022fallback\u0022} as code: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"304882e5391f0bcb3ac2ac94ceb147d8857dfafcf8330c7c90bef91e16ec71ed"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats {email} as code: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"54a9f13a64f6e00591d016ceb520ea0a4a24410e45e47aa2d17309947b9af47b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles multiple replacement strings in same paragraph: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0c557596b1f754661e1c4b527a2be60f101bcea24b083a2c36c10e5740444b8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats replacement string at start of paragraph: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf8a4e8317a32c8d4188d012293a22ffde77768f0f746bf7d213e5eec6bb06f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats replacement string at end of paragraph: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34b321b4d01117193f5592d2ed754ece2126b216b2c047161f67c64f8790767"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats standalone replacement string: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d146563b2115ea2805938a3cbe79e68516c039df45e6452e48c7913a1a73525b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: handles adjacent replacement strings: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"763bf7f820993a41f0de3db50a2445874a91c33e241cf42d019ad4d5604082dc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not format incomplete braces: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"df1b9dd4afe00f6be59c06ed24a182eb6a5f87a58176cacd8f1dd2d797561ac7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: formats empty braces as replacement string: 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":"koenig/koenig-lexical/test/e2e/plugins/ReplacementStringsPlugin.test.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"a89ce170196e25ca37915565aed04fc733e2a2e818ec2b298eae0c744c6764e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can render html to editor: 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":"koenig/koenig-lexical/test/e2e/plugins/HtmlOutputPlugin.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdbc228ed25421cee8d896c169c1e92f6adb48382c643d1acd76711bc7be25c9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can put emojis back to back without spaces: 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":"koenig/koenig-lexical/test/e2e/plugins/EmojiPickerPlugin.test.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b4a81ede316ac820f61bce9df0f9ccae5c3bed6d50bec037b37c07216174d91"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can insert emojis by providing the whole :shortcode:: 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":"koenig/koenig-lexical/test/e2e/plugins/EmojiPickerPlugin.test.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"7440a83239ae986c3bc5345d8f997620a809e9a9c04a66c3a5e8ec8d7d757719"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: a whole :shortcode: with no emojis matches inserts nothing: 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":"koenig/koenig-lexical/test/e2e/plugins/EmojiPickerPlugin.test.ts"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9f53c5a9f9beea80104ce23fca533b083a7fb77acbab125f253f4d262c61e8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can drag and drop a card between two other nodes: 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":"koenig/koenig-lexical/test/e2e/plugins/DragDropReorderPlugin.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e00e1f0562b92d39c3be641e4d05ca2feed10f69992db97fac9868aba0edf30f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can drag and drop a card at the top of the editor: 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":"koenig/koenig-lexical/test/e2e/plugins/DragDropReorderPlugin.test.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"625ab0a5f3b0d8533716b95a758058ffea7b21074af1184223ec51162513d7a6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: can drag and drop an audio file on the editor: 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":"koenig/koenig-lexical/test/e2e/plugins/DragDropPastePlugin.test.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecac8ebb64b6b1e05c8eabc34028a465359496d00b344dc247af0d0451cf1500"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders paywall card: 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":"koenig/koenig-lexical/test/e2e/text-transforms/paywall.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbfec705147067af67f1dbc49770685dde6f00f7a4a00a350e41fa0f6e772775"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${testCase.text} -\u003E heading: 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":"koenig/koenig-lexical/test/e2e/text-transforms/markdown.test.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"6067fd4b57974e1c4c0c52a6bf959eda60168cd5335bcbdaea2727b259ab6aae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${testCase.text}: 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":"koenig/koenig-lexical/test/e2e/text-transforms/markdown.test.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"133bbe12708630b3511caad9860411de5c1cf07f5e2b4ca3ae2db351cf13327f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${testCase.text}: 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":"koenig/koenig-lexical/test/e2e/text-transforms/markdown.test.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff20c04f5593e5e17de932d48fe491af3735edf139ec9bb6b626e538da467de6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: converts selected text to link on url paste: 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":"koenig/koenig-lexical/test/e2e/text-transforms/links.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7adc77b99f0c10a7a9c34c21ff7c00a25821b9ba5d77be9400e566d1ba961a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not convert text to link if pasting a non-url: 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":"koenig/koenig-lexical/test/e2e/text-transforms/links.test.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"d607f407553817467ec5535b9aa6ffd76568963f6ab130b14c580ca7c96147ff"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders horizontal line rule: 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":"koenig/koenig-lexical/test/e2e/text-transforms/horizontal-line-rule.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7b7c37e5ba2b6b82250fe5e91560cdbec5fa6fab89e74373d55d259b5a00f0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: ${testCase.text} -\u003E heading: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"95bdffcc22e02a24052cc3feba1c42bf7f2940d56c6b1ef80fceeda50182839d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: \u0022# \u0022 before plain text converts to heading: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f61172263fba153e523c44b9c8bc3201b934173111e4544798a5683555e072"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: \u0022# \u0022 before formatted text converts to heading: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd380c4ca01161fb354fd9e02316f83860cc22e0f028b3c2164a6da4852a3aa6"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: \u0022# \u0022 before existing h1 text removes \u0022# \u0022: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad91ea0f1aae286c74850fce7715bf6e9a2ae2ad49e2f97fbac8118f613db40a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: \u0022# \u0022 before existing h2 text converts to h1: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8b8bbb4c9651fdad05a1cbf2cca1d3d5c6a98649bc6c215f19fa0869326256"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: \u0022##\u0022 before existing h1 text converts to h2: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e92e95ee79cefe35451d345b2f2924237760d081d539920dcb339b6508ddfe7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: \u0022# \u0022 at beginning of blockquote converts to h1: 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":"koenig/koenig-lexical/test/e2e/text-transforms/headings.test.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ea1382a5192ddcc5fd7dd4410735fc4f10af716b9fa5e8d526c1e9fd604d7d0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with text and space on either side: 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":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ccb453e5251b31b88f5393e3ef608490b83f4187873b43369fd62944c3d805"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with text and text on either side: 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":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"168f834f524ba62efc9df0e2c8125f894bd87be4c8bf8724c3e3378cf4fa3dcc"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with space and space on either side: 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":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c993d925be593d39c41ccaf8ddec89f9d3dbb1eaf9bbb8fed56adcc746d1b51"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders in the middle of text: 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":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7299d1a365ba3a8f6217efac6c4a7ebd305c412dc31b0880e005840c10f53595"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with text and space on either side: 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":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"2386f4fd04c4b0e732da3804b5b4168c62534a62934d379c1313782c477ac235"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders with space and space on either side: 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":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c1282cc2a43913f6bbc6a4ae0a4da6c86cbd763cacea65805d4aa7bb1bb73ae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does render in the middle of text with space: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ccc16eb04db7aa35c44c0398aa3d732cd24d2b0abd987ce3557e15546e7c73c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: does not render in the middle of text without space: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/text-transforms/emdash-endash.test.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a840b2cc794aa4908aed26511a159b9933734a772c42ce26466c99f0fffdc7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders code block node in edit mode: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/koenig-lexical/test/e2e/text-transforms/code-block.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"2689c8603aa13953c63b3579148a8c89b4fa8ac4ec5b961406d9f4f4c06dc24a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Accepts valid JSON string in mobiledoc field: 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":"packages/admin-api-schema/test/api.test.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b3ec232c8a648f06e7be9ba8be3939d362d68f761bf670df9427645db2697c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Accepts lowercase event in webhook: 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":"packages/admin-api-schema/test/api.test.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcf801d315d4752959ed6215686b2dbaf07b305d1f45099a8ef18eaf8a2db90"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Passes isLowercase check when data is falsy (empty string): 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":"packages/admin-api-schema/test/api.test.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"12b64f51756876d5f5e713b33e009786a4d9fa7b745c5c5f875b588a95f0a858"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: no models passed: 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":"packages/api-framework/test/serializers/handle.test.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"9696c4a1cfe8b574460b9e4ffbdf1496bce236e75e7b404145473f848ea290e1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows empty values: 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":"packages/api-framework/test/validators/input/all.test.js"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"431aae97e114166af6470aa5b6b2dae8965f9dbdddbc349c71ddf1c775794691"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows supported id values: 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":"packages/api-framework/test/validators/input/all.test.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"19558714ac0403b5d3c0658276e03299f69614d0779504d3358e9f89cbbb1f4f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows supported limit values: 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":"packages/api-framework/test/validators/input/all.test.js"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ded1ecdfe03e8dab0fce343f2ec83efc86ce698ea298b6aebe58e8cbe65202"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: accepts real Knex connections and transactions: 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":"packages/limit-service/test/types.test.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"90aa08ac2823068c5ceb6edf0128eaccc345ab07280bf61a8be54ad058fbee90"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: requires callers to handle nonnumeric count results: 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":"packages/limit-service/test/types.test.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f8ef539f475fe51a36716257cddd69ba7a8a0c486e1466cfa45675e26343640"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: passes if does not go over the limit: 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":"packages/limit-service/test/limits.test.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55e84c05b3f9aa8f2da923a8231933c521b1136953ccbed2b4ae42c81b9df64"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: passes if does not go over the limit: 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":"packages/limit-service/test/limits.test.ts"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd9cd4c91a7dd7b78f3bd096b591f0118825b09588935a8357c5a902f537a99"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: accept correct values: 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":"packages/limit-service/test/limits.test.ts"},"region":{"startLine":783}}}],"partialFingerprints":{"codehealthFindingId/v1":"030f8b2c2961154ef2e0c3a55cf93d5da84d350394595942c0bfa61828a46df1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: passes for values in the allowlist: 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":"packages/limit-service/test/limits.test.ts"},"region":{"startLine":822}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9d5d56705cac3f94883ea698113e58dc5c01f4298c1bb58f544e879c315df75"}},{"ruleId":"D10","level":"note","message":{"text":"Test project verifies nothing: koenig/kg-default-transforms: No conventional assertion call was detected in 20 of 20 tests in \u0060koenig/kg-default-transforms\u0060 \u2014 the project as a whole, not one method. Two things look like this: verification that happens indirectly (an approval/verifier harness or BDD step methods), or a suite that genuinely checks nothing. If it is the latter, this project passes unconditionally and cannot fail."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/test/kg-default-transforms.test.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"de5c2c3ee8cde930113e2d3cd9c7bc477aa0b1f5979a64ab2a218ba598e887ce"}},{"ruleId":"D14","level":"error","message":{"text":"Banned license: ua-parser-js: \u0060ua-parser-js\u0060 1.0.41 is published on registry.npmjs.org under \u0060AGPL-3.0-or-later\u0060, which this policy bans, and it is a PRODUCTION dependency this repository\u0027s committed lockfile resolves \u2014 so it is installed by everything that depends on this repository, not just by its build toolchain. A package offering SEVERAL licences is a choice and is only charged when every one of them is banned. Replace the package, or record an accepted exception."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e5221c97b6b861db266e73300c386b8d26850408221e20fddbeb16790833c770"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/session/editor-session.ts: apps/admin/src/editor/session/editor-session.ts changed 26 times in last 90 days, max cyclomatic complexity 92 in editor-session.createEditorSession at line 216. 5 of those changes were fix/bug commits, and the other 21 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/session/editor-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":"apps/admin/src/editor/session/editor-session.ts"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc2de0c7b26d908dc933880834d61274201956ffeb7e83cf493318fd8cb32e14"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx: apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx changed 25 times in last 90 days, max cyclomatic complexity 79 in tier-detail-modal.TierDetailModalContent at line 61. 1 of those changes was a fix/bug commit, and the other 24 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/tiers/tier-detail-modal.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":"apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b4ce87b907040c2e38f9a7c940b62e2cc78c54427b4e4abc849ff9e67c57e71"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/user-detail-modal.tsx: apps/admin/src/settings/general/user-detail-modal.tsx changed 26 times in last 90 days, max cyclomatic complexity 69 in user-detail-modal.UserDetailModalContent at line 121. 1 of those changes was a fix/bug commit, and the other 25 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/user-detail-modal.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":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66dde85b0ca9dc8105424f98e5e1aba51a784bbab5db1b5ecca000e017dae88"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx: apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx changed 31 times in last 90 days, max cyclomatic complexity 53 in newsletter-detail-modal.Sidebar at line 166. 1 of those changes was a fix/bug commit, and the other 30 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/newsletters/newsletter-detail-modal.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":"apps/admin/src/settings/email/newsletters/newsletter-detail-modal.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d564afc18731c85462c940dc3abb021da1d17c2da42b03a173939f5860cd2e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx: apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx changed 14 times in last 90 days, max cyclomatic complexity 113 in theme-code-editor-modal.ThemeCodeEditorModal at line 298. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/theme/theme-code-editor-modal.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":"apps/admin/src/settings/site/theme/theme-code-editor-modal.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a7583f5b4f0230aeec371a1131a20bf829fdd7c62012c458a2755af07074cb2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/growth/offers/add-offer-modal.tsx: apps/admin/src/settings/growth/offers/add-offer-modal.tsx changed 18 times in last 90 days, max cyclomatic complexity 72 in add-offer-modal.AddOfferModal at line 454. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/growth/offers/add-offer-modal.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":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":454}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b076f1529bede7691a15367a0e8aad6757e5ae97525ef229d8dd0dc0a357be7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-detail.tsx: apps/admin/src/members/detail/member-detail.tsx changed 17 times in last 90 days, max cyclomatic complexity 75 in member-detail.MemberDetailPage at line 67. 2 of those changes were fix/bug commits, and the other 15 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-detail.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":"apps/admin/src/members/detail/member-detail.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"14612c6bd1a8e1be72e7a648bdf5687d0229158b275e03263ac408f90c68d1d6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx: apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx changed 19 times in last 90 days, max cyclomatic complexity 66 in edit-retention-offer-modal.EditRetentionOfferModal at line 503. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/growth/offers/edit-retention-offer-modal.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":"apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"439e5815890059ac5d69c5d529274e03c20f2cd6236301e2fe375afff6da52ca"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/newsletter/newsletter.tsx: apps/admin/src/posts/analytics/newsletter/newsletter.tsx changed 16 times in last 90 days, max cyclomatic complexity 66 in newsletter.Newsletter at line 102. 2 of those changes were fix/bug commits, and the other 14 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/newsletter/newsletter.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":"apps/admin/src/posts/analytics/newsletter/newsletter.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0f1c068d41cbd2a744964c40e7384b397803d0dae81df9e54bc9c411abb5939"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/members-api/repositories/member-repository.js: ghost/core/core/server/services/members/members-api/repositories/member-repository.js changed 8 times in last 90 days, max cyclomatic complexity 124 in linkSubscription at line 1223. 2 of those changes were fix/bug commits, and the other 6 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/members-api/repositories/member-repository.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":1223}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda7a59e3918e3105708cf20bf795c218c17cc7221fadabdbe4b8460c44a89be"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/utils/api.js: apps/portal/src/utils/api.js changed 9 times in last 90 days, max cyclomatic complexity 107 in api.setupGhostApi at line 4. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/utils/api.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/utils/api.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dcef9b4be2e33f3642a6f3c9a4a11b37270cb2f6fbe106680f3de4013e1beba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/custom-fields/custom-field-modal.tsx: apps/admin/src/settings/membership/custom-fields/custom-field-modal.tsx changed 24 times in last 90 days, max cyclomatic complexity 40 in custom-field-modal.CustomFieldModal at line 43. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/custom-fields/custom-field-modal.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":"apps/admin/src/settings/membership/custom-fields/custom-field-modal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"466a8b9adc76f0371df68f4c75353c3170ca91204ae38a3470dd69ec1ff64bb0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/layout/sidebar.tsx: apps/admin/src/settings/layout/sidebar.tsx changed 22 times in last 90 days, max cyclomatic complexity 43 in sidebar.Sidebar 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/layout/sidebar.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":"apps/admin/src/settings/layout/sidebar.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"f87544b54d672f6377a746ee3286b5f2f6aa375177f7cbeb8502dd4746c15df5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/shade/src/components/patterns/filters.tsx: apps/shade/src/components/patterns/filters.tsx changed 11 times in last 90 days, max cyclomatic complexity 84 in filters.Filters at line 2947. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/shade/src/components/patterns/filters.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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":2947}}}],"partialFingerprints":{"codehealthFindingId/v1":"0388d81e171717957dae523eb30be89bcd4dc2b421811829951c769bed300291"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/components/post-analytics-header.tsx: apps/admin/src/posts/analytics/components/post-analytics-header.tsx changed 19 times in last 90 days, max cyclomatic complexity 43 in post-analytics-header.PostAnalyticsHeader at line 66. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/components/post-analytics-header.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":"apps/admin/src/posts/analytics/components/post-analytics-header.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c042d3382f51e7f7cd839527e960e0b23a50db0e6662569a6f941d8c62f3b92d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/tags/detail/tag-detail.tsx: apps/admin/src/tags/detail/tag-detail.tsx changed 9 times in last 90 days, max cyclomatic complexity 87 in tag-detail.TagDetail at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/tags/detail/tag-detail.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":"apps/admin/src/tags/detail/tag-detail.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b86d9c3550066d86bfdd8ff24054671b553bc9ff40588958f7caa0071d7331"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/engine/save-engine.ts: apps/admin/src/editor/engine/save-engine.ts changed 6 times in last 90 days, max cyclomatic complexity 130 in save-engine.createSaveEngine at line 364. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/engine/save-engine.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/save-engine.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da914f05af29753b4d0080d380da5e35d3d2e494d5826b919786c5d709c7c56"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/preview/post-preview-modal.tsx: apps/admin/src/editor/preview/post-preview-modal.tsx changed 10 times in last 90 days, max cyclomatic complexity 77 in post-preview-modal.PostPreviewModal at line 80. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/preview/post-preview-modal.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":"apps/admin/src/editor/preview/post-preview-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eea229ee87ffd0c6f2616930c6433614c3f0ee1c3e7ea481e828d121c38e8a3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/design-and-branding/global-settings.tsx: apps/admin/src/settings/site/design-and-branding/global-settings.tsx changed 11 times in last 90 days, max cyclomatic complexity 69 in global-settings.GlobalSettings at line 101. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/design-and-branding/global-settings.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":"apps/admin/src/settings/site/design-and-branding/global-settings.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b0c7a665e1577942b52a8d7e8fbfcc0395d104e42e87ce7e4a46a17c3c36e5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/overview/overview.tsx: apps/admin/src/posts/analytics/overview/overview.tsx changed 15 times in last 90 days, max cyclomatic complexity 50 in overview.Overview at line 51. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/overview/overview.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":"apps/admin/src/posts/analytics/overview/overview.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6ab1fdac1e32816cf5ff9d1dc97289cf6b284834839b2defa9a88117e768399"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/session/use-editor-session.ts: apps/admin/src/editor/session/use-editor-session.ts changed 23 times in last 90 days, max cyclomatic complexity 32 in use-editor-session.useEditorSession at line 164. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/session/use-editor-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":"apps/admin/src/editor/session/use-editor-session.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"725f48511bfe512809b618b82d7152989d0cfa74e95514bc511f46d8edc9d904"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/app.jsx: apps/portal/src/app.jsx changed 14 times in last 90 days, max cyclomatic complexity 50 in App.fetchQueryStrData at line 492. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/app.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/app.jsx"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"b23aeb3c0b24e957602bf0bd9ac54a5929a3afad58a9525451951816ca425675"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx: apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx changed 7 times in last 90 days, max cyclomatic complexity 98 in newsletter-preview-content.NewsletterPreviewContent 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/newsletters/newsletter-preview-content.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":"apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c64f8a1e4d6ebbddcc68eaa878de810c1bcd1b1fdaff4919897b89859e35b6b7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx changed 12 times in last 90 days, max cyclomatic complexity 55 in import-members-modal.ImportMembersModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f88d58bca76465729a4910564ecf34c7383d1f0b1c2e2c96fc0193112524b2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/import-export/import/importer.ts: ghost/core/core/server/services/members/import-export/import/importer.ts changed 16 times in last 90 days, max cyclomatic complexity 40 in MembersCSVImporter.writeRows at line 421. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/import-export/import/importer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/import-export/import/importer.ts"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb895d91397ffee5680d46105be90064bf27e8bc5cc870396fdbb8a42db836c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/automations/database-automations-repository.ts: ghost/core/core/server/services/automations/database-automations-repository.ts changed 27 times in last 90 days, max cyclomatic complexity 23 in database-automations-repository.createDatabaseAutomationsRepository 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/automations/database-automations-repository.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/automations/database-automations-repository.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"174b6a4faaa9359d72ed08c35cd55b8e1a8be3c740c91f0dda939a33177ca0d6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/tiers.tsx: apps/admin/src/settings/membership/tiers.tsx changed 17 times in last 90 days, max cyclomatic complexity 35 in tiers.Tiers at line 72. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/tiers.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":"apps/admin/src/settings/membership/tiers.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae193ed212f8e19a61d9ac5748139820545741cae2f83a3cd3352b6310ad7230"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/editor-screen.tsx: apps/admin/src/editor/editor-screen.tsx changed 22 times in last 90 days, max cyclomatic complexity 27 in editor-screen.EditorLoader 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/editor-screen.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":"apps/admin/src/editor/editor-screen.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"4697db8e169514bbf894786ef97c630bf42ef4aad5eb9ac0f91c03caec50508a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx: apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx changed 14 times in last 90 days, max cyclomatic complexity 41 in latest-post.LatestPost at line 52. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/overview/components/latest-post.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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f0f75737dbb3c471d3bfdb1109f86a16e8b32043aa134fdb71dac0b2b22d7f4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/growth/offers/edit-offer-modal.tsx: apps/admin/src/settings/growth/offers/edit-offer-modal.tsx changed 20 times in last 90 days, max cyclomatic complexity 27 in edit-offer-modal.Sidebar at line 53. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/growth/offers/edit-offer-modal.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":"apps/admin/src/settings/growth/offers/edit-offer-modal.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3c9fbb4a19fadfa983fa902bcae679522898852f2c5a8243bbace0d56bb464"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/theme-modal.tsx: apps/admin/src/settings/site/theme-modal.tsx changed 20 times in last 90 days, max cyclomatic complexity 26 in theme-modal.ChangeThemeModal at line 317. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/theme-modal.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":"apps/admin/src/settings/site/theme-modal.tsx"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"40aa58136db2da43be4adaffab18e6ffc2a9304081da3a926e05d5947e3c343e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/engine/change-tracker.ts: apps/admin/src/editor/engine/change-tracker.ts changed 8 times in last 90 days, max cyclomatic complexity 63 in change-tracker.createChangeTracker 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/engine/change-tracker.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/change-tracker.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9cf46efdd85487a976330d52ec023f11de10f43bddb9092beb63c7f958a7870"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/advanced/history-modal.tsx: apps/admin/src/settings/advanced/history-modal.tsx changed 24 times in last 90 days, max cyclomatic complexity 21 in history-modal.HistoryFilter at line 99. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/advanced/history-modal.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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"b636568c4179060dc0f876edb37d93b9e56693ffe3c636de304787c675c00bc6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx: apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx changed 18 times in last 90 days, max cyclomatic complexity 28 in welcome-email-modal.WelcomeEmailModal at line 113. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/member-emails/welcome-email-modal.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":"apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"170126b921c372daa76900a9be5caaac661eadf649e1863289c16c7b0f93a074"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/access.tsx: apps/admin/src/settings/membership/access.tsx changed 14 times in last 90 days, max cyclomatic complexity 36 in access.Access at line 135. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/access.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":"apps/admin/src/settings/membership/access.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fc6c2598b34c57715de7ed032c501a3160400700c9e9aa0b06ed51fbc30c209"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/invite-user-modal.tsx: apps/admin/src/settings/general/invite-user-modal.tsx changed 16 times in last 90 days, max cyclomatic complexity 31 in invite-user-modal.InviteUserModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/invite-user-modal.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":"apps/admin/src/settings/general/invite-user-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ad9a3ccc097d9efe1d8135cc308accfd5c941ac38bafec1b222e8dc01e2125c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx changed 9 times in last 90 days, max cyclomatic complexity 54 in mapping-step.MappingStep at line 105. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c73dddcb487a475f07c83ad8eb051feb17f435b44f1f5c79d962069a6aeef79"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/advanced/migration-tools/universal-import-modal.tsx: apps/admin/src/settings/advanced/migration-tools/universal-import-modal.tsx changed 17 times in last 90 days, max cyclomatic complexity 28 in universal-import-modal.UniversalImportModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/advanced/migration-tools/universal-import-modal.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":"apps/admin/src/settings/advanced/migration-tools/universal-import-modal.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"36bbcb5c4ece034494164920c61de73bf5265874a954b59c839d502fe9bf134a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/shade/src/components/patterns/settings-modal.tsx: apps/shade/src/components/patterns/settings-modal.tsx changed 8 times in last 90 days, max cyclomatic complexity 59 in settings-modal.SettingsModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/shade/src/components/patterns/settings-modal.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":"apps/shade/src/components/patterns/settings-modal.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c3be3e959331a114deef4e4c35a0be0962fa64ffa87ddf613a2ede171fba63a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/members-api/services/member-bread-service.js: ghost/core/core/server/services/members/members-api/services/member-bread-service.js changed 21 times in last 90 days, max cyclomatic complexity 22 in add at line 470. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/members-api/services/member-bread-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/services/member-bread-service.js"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3ab04fbffff6a2fa815e0bcc529a3889db0830e33ec7df7281ad2183d153d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx: apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx changed 8 times in last 90 days, max cyclomatic complexity 57 in newsletters-kpis.NewsletterKPIs at line 110. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.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":"apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"5555693d7f0b2614c546f85130d4ada92e0de755653ec36606f0ec35b4963bfe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/components/preview-modal.tsx: apps/admin/src/settings/components/preview-modal.tsx changed 17 times in last 90 days, max cyclomatic complexity 26 in preview-modal.PreviewModalContent at line 91. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/components/preview-modal.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":"apps/admin/src/settings/components/preview-modal.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"1831a91beb4b62b95e39cca8e4a1f6efdfba387515134be9acc23f2774c1febd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/components/feed/feed-item.tsx: apps/activitypub/src/components/feed/feed-item.tsx changed 4 times in last 90 days, max cyclomatic complexity 109 in feed-item.FeedItem at line 506. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/components/feed/feed-item.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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b73bc88f7a7e03cc72fff151b97095303e638225d25ab6333da15724175ce49"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/members-api/members-api.js: ghost/core/core/server/services/members/members-api/members-api.js changed 16 times in last 90 days, max cyclomatic complexity 27 in members-api.MembersAPI 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/members-api/members-api.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/members-api.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5dafcda95f5c4f975baaf3c18a1ada6236d1a72ce5e16da36935d2ee276bfa1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/design-and-theme-modal.tsx: apps/admin/src/settings/site/design-and-theme-modal.tsx changed 12 times in last 90 days, max cyclomatic complexity 35 in design-and-theme-modal.DesignAndThemeModal at line 11. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/design-and-theme-modal.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":"apps/admin/src/settings/site/design-and-theme-modal.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"c02ecbe535e17f7cced7ad0c9752553d8b4bf36e845fb1e7c17a009a66f11828"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js: ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js changed 8 times in last 90 days, max cyclomatic complexity 52 in posts.default at line 24. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ddb4c77aece0206b8b1053a6e5e4a282d2d9953179b7927c6710aa389863772"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/tiers/tier-detail-preview.tsx: apps/admin/src/settings/membership/tiers/tier-detail-preview.tsx changed 13 times in last 90 days, max cyclomatic complexity 31 in tier-detail-preview.TierDetailPreview 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/tiers/tier-detail-preview.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":"apps/admin/src/settings/membership/tiers/tier-detail-preview.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d189a2aa6b12a5a46f558cf57569bc01d36a2c983ac478cfa3c825d8f115f9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx: apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx changed 25 times in last 90 days, max cyclomatic complexity 16 in stripe-connect-modal.Connect at line 70. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/stripe/stripe-connect-modal.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":"apps/admin/src/settings/membership/stripe/stripe-connect-modal.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a4efa76d395c2cb99992bdaff292955fbc42c34c69fc15e2dfc761044c2d32"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/email-service/email-renderer.js: ghost/core/core/server/services/email-service/email-renderer.js changed 11 times in last 90 days, max cyclomatic complexity 36 in EmailRenderer.getTemplateData at line 1288. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/email-service/email-renderer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-renderer.js"},"region":{"startLine":1288}}}],"partialFingerprints":{"codehealthFindingId/v1":"992b568fb36ad1e78ce17d44fac3106aae4e3c63667e11bed7eb97df8958c750"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/publication-language.tsx: apps/admin/src/settings/general/publication-language.tsx changed 13 times in last 90 days, max cyclomatic complexity 30 in publication-language.PublicationLanguage at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/publication-language.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":"apps/admin/src/settings/general/publication-language.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60e561c8072b8eb90094d5be672e92ca76013f6a0d26a3b5ebf10436041ad5b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/api/members.ts: apps/admin-x-framework/src/api/members.ts changed 22 times in last 90 days, max cyclomatic complexity 17 in members.membersCountString at line 344. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/api/members.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/api/members.ts"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"dde4ee7f04e0e3eaea388f04ee9e6998d13af2642f7c8654b0633a4aafef769b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/editor.tsx: apps/admin/src/automations/editor.tsx changed 5 times in last 90 days, max cyclomatic complexity 74 in editor.AutomationEditorContent at line 67. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/editor.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":"apps/admin/src/automations/editor.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e70ba2c168bb0ec59ba282591acdbcec83578e98d373f2dd6b0299366433af0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members-metafields/definitions-service.ts: ghost/core/core/server/services/members-metafields/definitions-service.ts changed 23 times in last 90 days, max cyclomatic complexity 16 in MetafieldDefinitionsService.edit at line 550. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members-metafields/definitions-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members-metafields/definitions-service.ts"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8cfe6174aafcfb5b6dcdc48bba5b7496425f0f7c3c68baf9f199aed80ac1bea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/inbox/components/reader.tsx: apps/activitypub/src/views/inbox/components/reader.tsx changed 4 times in last 90 days, max cyclomatic complexity 92 in reader.Reader at line 535. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/inbox/components/reader.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":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"0592504c8832f5e60d044495d0ff7b78de5389096e0a098b43ff2184b58259b8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/oembed/oembed-service.js: ghost/core/core/server/services/oembed/oembed-service.js changed 14 times in last 90 days, max cyclomatic complexity 26 in OEmbedService.fetchOembedDataFromUrl at line 755. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/oembed/oembed-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/oembed/oembed-service.js"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2e069e59d5077b11b59646b902c8ede037994646faf919dee4412fe9eec46e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/settings/post-settings-sidebar.tsx: apps/admin/src/editor/settings/post-settings-sidebar.tsx changed 19 times in last 90 days, max cyclomatic complexity 19 in post-settings-sidebar.PostSettingsSidebar at line 111. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/settings/post-settings-sidebar.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":"apps/admin/src/editor/settings/post-settings-sidebar.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d0a09536a087cb861ca78770bdc54ff35e9684a7d4f523bab70efe00c873e13"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/users.tsx: apps/admin/src/settings/general/users.tsx changed 18 times in last 90 days, max cyclomatic complexity 20 in users.Users at line 311. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/users.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":"apps/admin/src/settings/general/users.tsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"80e357e345fffd6049df472b7c31dd868acf0f462304df3d6fc9a124772f325d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/canvas/automation-canvas.tsx: apps/admin/src/automations/components/canvas/automation-canvas.tsx changed 8 times in last 90 days, max cyclomatic complexity 45 in automation-canvas.AutomationCanvas at line 388. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/canvas/automation-canvas.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":"apps/admin/src/automations/components/canvas/automation-canvas.tsx"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5de407e5a46a80a227f4249ad86fa90b50bea7560edfda269c4f88ac0ac8d4b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/member-emails.tsx: apps/admin/src/settings/membership/member-emails.tsx changed 15 times in last 90 days, max cyclomatic complexity 24 in member-emails.MemberEmails at line 171. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/member-emails.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":"apps/admin/src/settings/membership/member-emails.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d606cba144e742a8bb4901704690e705c3e508fdafdc627ef1b0ec8d9a9669"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx: apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx changed 7 times in last 90 days, max cyclomatic complexity 51 in import-members-modal.ImportMembersModal at line 42. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members-modal.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":"apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f0ba4063986241e702ebe08536aa13d6936cd12d55e31b5fe6eca7653e878f9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/growth/growth.tsx: apps/admin/src/analytics/views/stats/growth/growth.tsx changed 9 times in last 90 days, max cyclomatic complexity 39 in growth.Growth at line 74. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/growth/growth.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":"apps/admin/src/analytics/views/stats/growth/growth.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"813498ee1928c2019c808ce1b14b09cc4f1ca830482446f797ced5d898249d99"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/portal/signup-options.tsx: apps/admin/src/settings/membership/portal/signup-options.tsx changed 10 times in last 90 days, max cyclomatic complexity 35 in signup-options.SignupOptions at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/portal/signup-options.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":"apps/admin/src/settings/membership/portal/signup-options.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba6b9a3fcce605d9781d5ff18b1dc5f9f38194e39b9385f213643f135b529e4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/members.tsx: apps/admin/src/members/members.tsx changed 9 times in last 90 days, max cyclomatic complexity 38 in members.MembersPage 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/members.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":"apps/admin/src/members/members.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a36953f8a4f3a77162a3310eae1b7d049b5c08526896afe9389c243620355d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/web/web.tsx: apps/admin/src/posts/analytics/web/web.tsx changed 9 times in last 90 days, max cyclomatic complexity 38 in web.Web 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/web/web.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":"apps/admin/src/posts/analytics/web/web.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3164e5a0dd7aff1b0baa01de035c2efd10731a7d7eb19eabd46c9b625974fa41"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/use-member-filter-fields.ts: apps/admin/src/members/use-member-filter-fields.ts changed 14 times in last 90 days, max cyclomatic complexity 24 in use-member-filter-fields.useMemberFilterFields at line 280. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/use-member-filter-fields.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/use-member-filter-fields.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cf851ac09f2589890c44696a51a7f88fe1176104930a0b51246e4671d32027"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/route-settings/route-settings-parser.ts: ghost/core/core/server/services/route-settings/route-settings-parser.ts changed 12 times in last 90 days, max cyclomatic complexity 28 in route-settings-parser.serializeRouteSettings at line 501. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/route-settings/route-settings-parser.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/route-settings/route-settings-parser.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"9968e9a14e3b3664f12c7330ae0aa497d20621998162797bd0af28fab26d87f0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/tiers/tier-checkout-collection.tsx: apps/admin/src/settings/membership/tiers/tier-checkout-collection.tsx changed 11 times in last 90 days, max cyclomatic complexity 30 in tier-checkout-collection.TierCheckoutCollection at line 278. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/tiers/tier-checkout-collection.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":"apps/admin/src/settings/membership/tiers/tier-checkout-collection.tsx"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceb450533dd7abc73b3ae8df213ba4af402b92d75cd30659f466bbf7f0227f48"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/email-analytics/email-analytics-service.ts: ghost/core/core/server/services/email-analytics/email-analytics-service.ts changed 15 times in last 90 days, max cyclomatic complexity 22 in EmailAnalyticsService.#fetchEventsForJob at line 447. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/email-analytics/email-analytics-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-analytics/email-analytics-service.ts"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c370ea0eb4221e2ca8cac0e4f1e2c5f1666f2bc28c17292364885b34e4c9064"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/advanced/labs/yaml-file-editor-modal.tsx: apps/admin/src/settings/advanced/labs/yaml-file-editor-modal.tsx changed 15 times in last 90 days, max cyclomatic complexity 22 in yaml-file-editor-modal.YamlFileEditorModal at line 34. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/advanced/labs/yaml-file-editor-modal.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":"apps/admin/src/settings/advanced/labs/yaml-file-editor-modal.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"69e6cd67677495fcd3320e7616e92e82180b71178dd5bdea145e320a9d90e53b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/growth/embed-signup/embed-signup-sidebar.tsx: apps/admin/src/settings/growth/embed-signup/embed-signup-sidebar.tsx changed 13 times in last 90 days, max cyclomatic complexity 25 in embed-signup-sidebar.EmbedSignupSidebar 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/growth/embed-signup/embed-signup-sidebar.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":"apps/admin/src/settings/growth/embed-signup/embed-signup-sidebar.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e8ae4d5edf8a4d606b33ac637de783137b31666e0e6d46174e4bf212d0a4eaf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/design-modal.tsx: apps/admin/src/settings/site/design-modal.tsx changed 14 times in last 90 days, max cyclomatic complexity 23 in design-modal.DesignModal at line 80. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/design-modal.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":"apps/admin/src/settings/site/design-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"567816576076211578d5ecffc10083bfeb463b5c488dad8a3a5266d0346f541b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/models/relations/authors.js: ghost/core/core/server/models/relations/authors.js changed 6 times in last 90 days, max cyclomatic complexity 53 in authors.extendModel 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/models/relations/authors.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/relations/authors.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"385596b34ccba9da3f0d11a41129e42f5ae247390e892f8b09aaa2dd191f28b5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/post-editor.tsx: apps/admin/src/editor/post-editor.tsx changed 7 times in last 90 days, max cyclomatic complexity 44 in post-editor.PostEditor at line 92. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/post-editor.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":"apps/admin/src/editor/post-editor.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"e929c8264b77a55aaddf67c98fa6f423306d2129843b8a7efe4d5393be4c84da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/growth/recommendations/add-recommendation-modal.tsx: apps/admin/src/settings/growth/recommendations/add-recommendation-modal.tsx changed 14 times in last 90 days, max cyclomatic complexity 22 in add-recommendation-modal.AddRecommendationModal at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/growth/recommendations/add-recommendation-modal.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":"apps/admin/src/settings/growth/recommendations/add-recommendation-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9193a6a9b9a9d463cc0835b34ef273a6608a28418956a0ff166f8d877f97fba7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/ghost_head.js: ghost/core/core/frontend/helpers/ghost_head.js changed 6 times in last 90 days, max cyclomatic complexity 51 in ghost_head.ghost_head at line 359. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/ghost_head.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/ghost_head.js"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"cef64f61a87c172a200a6dca6f3ce9d6250ef61a03f828ec08058d2197bccca7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/automations/poll.ts: ghost/core/core/server/services/automations/poll.ts changed 17 times in last 90 days, max cyclomatic complexity 18 in poll.processStep at line 129. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/automations/poll.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/automations/poll.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9759a207bf5a878d262bf093002e939cb07b0007bb35412a75ca282a3efed3c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/advanced/integrations/custom-integration-modal.tsx: apps/admin/src/settings/advanced/integrations/custom-integration-modal.tsx changed 17 times in last 90 days, max cyclomatic complexity 18 in custom-integration-modal.CustomIntegrationModalContent 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/advanced/integrations/custom-integration-modal.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":"apps/admin/src/settings/advanced/integrations/custom-integration-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e03f7b1beccb6cfb8a8734e04025a6749c7c04ab927317b6d819fdad2bdd989"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.tsx: apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.tsx changed 8 times in last 90 days, max cyclomatic complexity 38 in welcome-email-customize-modal.WelcomeEmailCustomizeModal at line 299. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.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":"apps/admin/src/settings/membership/member-emails/welcome-email-customize-modal.tsx"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e6a3d737d24560a2ede13d7f082dac31cba3cb7fd9755eb8e981e0cc5f69ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/portal/portal-modal.tsx: apps/admin/src/settings/membership/portal/portal-modal.tsx changed 15 times in last 90 days, max cyclomatic complexity 20 in portal-modal.PortalModal at line 99. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/portal/portal-modal.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":"apps/admin/src/settings/membership/portal/portal-modal.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"811782c382543d62ef7e8235d31e4e532781afddebaeac8569822c2a868fceb8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/gift-page.tsx: apps/portal/src/components/pages/gift-page.tsx changed 4 times in last 90 days, max cyclomatic complexity 73 in gift-page.GiftPage 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/gift-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":"apps/portal/src/components/pages/gift-page.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"abb8af0e6fd4c5b6f30c46bddce81e54556e0dd770968efce56488ae6d87cd41"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/users/change-password-form.tsx: apps/admin/src/settings/general/users/change-password-form.tsx changed 8 times in last 90 days, max cyclomatic complexity 36 in change-password-form.ChangePasswordForm at line 52. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/users/change-password-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":"apps/admin/src/settings/general/users/change-password-form.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e20cfc223d53e3c4990303612e9e4cd04498c6f99cca47716221a1b552ef9b8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/email-modal/email-content-modal.tsx: apps/admin/src/automations/components/email-modal/email-content-modal.tsx changed 7 times in last 90 days, max cyclomatic complexity 41 in email-content-modal.EmailContentModal at line 124. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/email-modal/email-content-modal.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":"apps/admin/src/automations/components/email-modal/email-content-modal.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"6043f55c16e1590fa1bc366b04d3e35a26c1355af5285e7707edee140c517b91"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx: apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx changed 10 times in last 90 days, max cyclomatic complexity 28 in newsletters.Newsletters at line 287. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/newsletters/newsletters.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":"apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5d5d55d8815e174c3d8595861971387441a0f81dd674785034f962222db17c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx: apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx changed 12 times in last 90 days, max cyclomatic complexity 23 in top-posts.TopPosts 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/overview/components/top-posts.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":"apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ed61c5ac79aec7b158701d252e74c1630515db0b01a62287947c9c417d97a34"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/newsletters/add-newsletter-modal.tsx: apps/admin/src/settings/email/newsletters/add-newsletter-modal.tsx changed 18 times in last 90 days, max cyclomatic complexity 15 in add-newsletter-modal.AddNewsletterModal at line 28. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/newsletters/add-newsletter-modal.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":"apps/admin/src/settings/email/newsletters/add-newsletter-modal.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"139f4588623402823051c2efe5b9c509d64939fef1f688164e4d3b8ed2c03d4a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/schema/commands.js: ghost/core/core/server/data/schema/commands.js changed 10 times in last 90 days, max cyclomatic complexity 26 in commands.addTableColumn 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/schema/commands.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/schema/commands.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c35d840044e8fa3fa4ae9f4828a8ec0992c68cf81959ec50bc640287cc5a74"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/notifications/notifications.tsx: apps/activitypub/src/views/notifications/notifications.tsx changed 3 times in last 90 days, max cyclomatic complexity 86 in notifications.Notifications at line 306. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/notifications/notifications.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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"add602c163daaacfe79cb5b28ebec36548e0cfd06e8b1f67292d9524de2041ca"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/members-filters.tsx: apps/admin/src/members/components/members-filters.tsx changed 17 times in last 90 days, max cyclomatic complexity 15 in members-filters.MembersFilters 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/members-filters.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":"apps/admin/src/members/components/members-filters.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"633d15832bf8d63cb432cfaa3eb3fc82e215f305e9e3f2946074124b6fe4f9c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/preferences/components/domain.tsx: apps/activitypub/src/views/preferences/components/domain.tsx changed 3 times in last 90 days, max cyclomatic complexity 83 in domain.Domain at line 88. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/preferences/components/domain.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":"apps/activitypub/src/views/preferences/components/domain.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"7663330ea827ccd64402596e5e6ededfc067b2d56bdc7d429c040f1283e56797"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/stats/posts-stats-service.js: ghost/core/core/server/services/stats/posts-stats-service.js changed 7 times in last 90 days, max cyclomatic complexity 35 in PostsStatsService.getTopPostsViews at line 1256. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/stats/posts-stats-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stats/posts-stats-service.js"},"region":{"startLine":1256}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b08cc93a07a0aeb563a5342b4dc0e8d65c3c08a4ac61f0ed9def329f964499e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/auth/session/session-service.js: ghost/core/core/server/services/auth/session/session-service.js changed 5 times in last 90 days, max cyclomatic complexity 49 in session-service.createSessionService at line 66. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/auth/session/session-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/auth/session/session-service.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"36df8bbe2b3548ebaa5bf9b49989e8e2784fa7aa184afaba9f1bfadc66e514f6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/gifts/gift-service.ts: ghost/core/core/server/services/gifts/gift-service.ts changed 12 times in last 90 days, max cyclomatic complexity 20 in GiftService.startCheckout at line 331. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/gifts/gift-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-service.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc8bd8d4619faeb650d301298233b3d1aadce077ccdb3f3231648d11ea03508"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/emails.tsx: apps/admin/src/settings/email/emails.tsx changed 14 times in last 90 days, max cyclomatic complexity 17 in emails.EmailsGroup 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/emails.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":"apps/admin/src/settings/email/emails.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5198b4f0798fa1b411096e633e4bec24ed69dd7a3e51c0ca9fea061ca8ba90c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/locations/components/locations-card.tsx: apps/admin/src/analytics/views/stats/locations/components/locations-card.tsx changed 7 times in last 90 days, max cyclomatic complexity 34 in locations-card.LocationsCard at line 96. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/locations/components/locations-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":"apps/admin/src/analytics/views/stats/locations/components/locations-card.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d1abd5949db260ebd6e727b21060f6f5e49cb2b9337a5ce8a9a562d23af1ef2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/growth/offers/offers-index.tsx: apps/admin/src/settings/growth/offers/offers-index.tsx changed 14 times in last 90 days, max cyclomatic complexity 17 in offers-index.OffersIndexModal at line 335. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/growth/offers/offers-index.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":"apps/admin/src/settings/growth/offers/offers-index.tsx"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"a759e2c597cd9f33a2aa4721ff56b05e46cc02795443e4cc3e8274444af106fb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/components/modals/new-note-modal.tsx: apps/activitypub/src/components/modals/new-note-modal.tsx changed 3 times in last 90 days, max cyclomatic complexity 79 in new-note-modal.NewNoteModal at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/components/modals/new-note-modal.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":"apps/activitypub/src/components/modals/new-note-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f73d318460dde06546ec47f56c7364f7fca617365284d238e8c7e9e51ae426"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/publish-options.ts: apps/admin/src/editor/publish/publish-options.ts changed 4 times in last 90 days, max cyclomatic complexity 57 in publish-options.createPublishOptions at line 329. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/publish-options.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/publish-options.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e4e16b81c2392e39515618bf67696cb4a57ab4535fad719d4ff26d77aa4b88f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-custom-fields-field.tsx: apps/admin/src/members/detail/member-custom-fields-field.tsx changed 14 times in last 90 days, max cyclomatic complexity 16 in member-custom-fields-field.MemberCustomFieldEditModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-custom-fields-field.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":"apps/admin/src/members/detail/member-custom-fields-field.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d1f204cc88a674b80cc47de167b8353fdf65101b28aa7d84a2bad1b2303016"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/growth/components/growth-kpis.tsx: apps/admin/src/analytics/views/stats/growth/components/growth-kpis.tsx changed 7 times in last 90 days, max cyclomatic complexity 31 in growth-kpis.GrowthKPIs at line 158. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/growth/components/growth-kpis.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":"apps/admin/src/analytics/views/stats/growth/components/growth-kpis.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ac092ae60631f32496a3254ae25b228428e65b406bc1c5afe284b4166eb8497"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/services/llms/service.js: ghost/core/core/frontend/services/llms/service.js changed 4 times in last 90 days, max cyclomatic complexity 53 in service.createLlmsService at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/services/llms/service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/llms/service.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d9b504d90837cc5f3c75578117d0854445f7ce157e0d2c0690cbd4bf8af644"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx: apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx changed 5 times in last 90 days, max cyclomatic complexity 42 in paid-subscription-change-chart.PaidMembersChangeChart at line 180. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.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":"apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"57634d22c18fe498da6039ff89b25538b1f9f40940bd5747ee75ca83040bfb7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/advanced/integrations/webhook-modal.tsx: apps/admin/src/settings/advanced/integrations/webhook-modal.tsx changed 10 times in last 90 days, max cyclomatic complexity 21 in webhook-modal.WebhookModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/advanced/integrations/webhook-modal.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":"apps/admin/src/settings/advanced/integrations/webhook-modal.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84bc39c4815ef59afe8a8f38d019b276ef4f22825aff9ff8dcfab6df0be447f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/portal/portal-links.tsx: apps/admin/src/settings/membership/portal/portal-links.tsx changed 11 times in last 90 days, max cyclomatic complexity 19 in portal-links.PortalLinks 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/portal/portal-links.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":"apps/admin/src/settings/membership/portal/portal-links.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"35f25fb927de2821daa142c9cf44c7c4b12d5ae80928a13f9eebfed63ef24671"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/engine/slug-machine.ts: apps/admin/src/editor/engine/slug-machine.ts changed 4 times in last 90 days, max cyclomatic complexity 52 in slug-machine.createSlugMachine at line 123. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/engine/slug-machine.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/engine/slug-machine.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"1778d2e76b0fbfe6939a371bb437e74b70e305575f65c9dca33c1cf00172916c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/components/top-level-group.tsx: apps/admin/src/settings/components/top-level-group.tsx changed 6 times in last 90 days, max cyclomatic complexity 34 in top-level-group.TopLevelGroup at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/components/top-level-group.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":"apps/admin/src/settings/components/top-level-group.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f9bc15b020135870312fe56d6dab9ebdbb11df04af82d60a8465545cf7f856b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/design-and-branding/theme-setting.tsx: apps/admin/src/settings/site/design-and-branding/theme-setting.tsx changed 12 times in last 90 days, max cyclomatic complexity 17 in theme-setting.ThemeSetting 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/design-and-branding/theme-setting.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":"apps/admin/src/settings/site/design-and-branding/theme-setting.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdffc97cd54ff6c0acb0ddcfa57cbe2277b4d522ba1566ab27cff7b34feeb567"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/api.js: ghost/core/core/server/services/members/api.js changed 10 times in last 90 days, max cyclomatic complexity 20 in api.createApiInstance 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/api.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/api.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"16bd6e870d919e17a7d26eb554e752c0467620a91c05e554fcc1122b97cf4afb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/use-publish-flow.ts: apps/admin/src/editor/publish/use-publish-flow.ts changed 4 times in last 90 days, max cyclomatic complexity 50 in use-publish-flow.usePublishFlow at line 98. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/use-publish-flow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/use-publish-flow.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"520bf80ddb2a236844ed470094d44ffa3283bcc6e81202dac7b6967317d80b14"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/comments/components/comments-list.tsx: apps/admin/src/comments/components/comments-list.tsx changed 9 times in last 90 days, max cyclomatic complexity 22 in comments-list.CommentsList at line 43. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/comments/components/comments-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":"apps/admin/src/comments/components/comments-list.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"37cd9542481d0280636800bc57f19222b64b66d44797491a9fe78da2d2b7bcee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/overview/overview.tsx: apps/admin/src/analytics/views/stats/overview/overview.tsx changed 11 times in last 90 days, max cyclomatic complexity 18 in overview.Overview at line 83. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/overview/overview.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":"apps/admin/src/analytics/views/stats/overview/overview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"355198278ae01c127d565941deaa6ecc1cf1440b70558082a49e25761361c188"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/newsletters/newsletter-preview.tsx: apps/admin/src/settings/email/newsletters/newsletter-preview.tsx changed 4 times in last 90 days, max cyclomatic complexity 49 in newsletter-preview.NewsletterPreview at line 9. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/newsletters/newsletter-preview.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":"apps/admin/src/settings/email/newsletters/newsletter-preview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f5af6bf0a9ebbe1d203e811f5d1616e15003a946962efde88ae06ff1a6cc816"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts: apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts changed 7 times in last 90 days, max cyclomatic complexity 27 in use-post-success-modal.usePostSuccessModal at line 20. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/hooks/use-post-success-modal.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"11813ab0116d8639bc82bca6c1c164c573bd4bff3cbc1d37a6f3ef4599a7a202"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/growth/components/growth-sources.tsx: apps/admin/src/analytics/views/stats/growth/components/growth-sources.tsx changed 9 times in last 90 days, max cyclomatic complexity 21 in growth-sources.GrowthSources at line 111. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/growth/components/growth-sources.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":"apps/admin/src/analytics/views/stats/growth/components/growth-sources.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"36bcdb7ae8d61f55c9d2cd6487559aedbc1c9ad6133cfa680508257e5dbfe509"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/default-recipients.tsx: apps/admin/src/settings/email/default-recipients.tsx changed 7 times in last 90 days, max cyclomatic complexity 27 in default-recipients.DefaultRecipients at line 83. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/default-recipients.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":"apps/admin/src/settings/email/default-recipients.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccbfc11d00951e4dc735ebc4fd04671a64f68fa8b720a5731b61fef6144a00cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-event.ts: apps/admin/src/members/detail/member-event.ts changed 4 times in last 90 days, max cyclomatic complexity 47 in member-event.getAction at line 240. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-event.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"41865ca026e74aa47501eb7bb11afa34aab5a413247d5953689d7aabfe767131"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/overview/components/newsletter-overview.tsx: apps/admin/src/posts/analytics/overview/components/newsletter-overview.tsx changed 8 times in last 90 days, max cyclomatic complexity 23 in newsletter-overview.NewsletterOverview at line 41. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/overview/components/newsletter-overview.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":"apps/admin/src/posts/analytics/overview/components/newsletter-overview.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"e10e93bb66d2fd0a84bc159f03994a48144bb31bc0fd58fca6370db5145a760e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/popup-modal.jsx: apps/portal/src/components/popup-modal.jsx changed 5 times in last 90 days, max cyclomatic complexity 36 in PopupContent.render 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/popup-modal.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/popup-modal.jsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea5e2268ae7b6781515b0fedb70a56ff1cf5a16422819fbcd93725e2beddb61b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/email-service/batch-sending-service.js: ghost/core/core/server/services/email-service/batch-sending-service.js changed 10 times in last 90 days, max cyclomatic complexity 18 in BatchSendingService.createBatches at line 401. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/email-service/batch-sending-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/batch-sending-service.js"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"155f02579fa15b5412fd30c5b4ac797ad06a0a0e9301b3a66793e4416122d845"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/overview/components/overview-kpis.tsx: apps/admin/src/analytics/views/stats/overview/components/overview-kpis.tsx changed 12 times in last 90 days, max cyclomatic complexity 15 in overview-kpis.OverviewKPICard at line 48. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/overview/components/overview-kpis.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":"apps/admin/src/analytics/views/stats/overview/components/overview-kpis.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c91c8c3aa796eee593401a7be8983fe678478f981bab46050c279373142a7e0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/growth/components/growth-sources.tsx: apps/admin/src/posts/analytics/growth/components/growth-sources.tsx changed 10 times in last 90 days, max cyclomatic complexity 18 in growth-sources.GrowthSources at line 147. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/growth/components/growth-sources.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":"apps/admin/src/posts/analytics/growth/components/growth-sources.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"efe55b18a63924c9d8ba818976f0ea112886889e4887af032a1c156343cb3e0f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/actions.js: apps/portal/src/actions.js changed 9 times in last 90 days, max cyclomatic complexity 20 in actions.updateProfile at line 960. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/actions.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/actions.js"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"9843cb6c1b1e639c683daad05ab63fde05755f78003ce05e831962d3beb90480"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members-metafields/filter.ts: ghost/core/core/server/services/members-metafields/filter.ts changed 10 times in last 90 days, max cyclomatic complexity 18 in filter.createMetafieldsFilterTransformer at line 100. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members-metafields/filter.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members-metafields/filter.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"9faab537826ea30e3ff0b42b463d615044514a7e0d8551a124a13c02600488c0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/navigation/navigation-item-editor.tsx: apps/admin/src/settings/site/navigation/navigation-item-editor.tsx changed 10 times in last 90 days, max cyclomatic complexity 18 in navigation-item-editor.NavigationItemEditor 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/navigation/navigation-item-editor.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":"apps/admin/src/settings/site/navigation/navigation-item-editor.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"27909157825eb2cf46a7b0f880344e3860676266798ea5f96ab55b388e31fea5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/shared/analytics/stats-filter.tsx: apps/admin/src/shared/analytics/stats-filter.tsx changed 11 times in last 90 days, max cyclomatic complexity 16 in stats-filter.StatsFilter at line 338. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/shared/analytics/stats-filter.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":"apps/admin/src/shared/analytics/stats-filter.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecbceb86b1f16e068cd51aa6c02f09162978c0acfef9b386c9aa80cca43e33bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js: ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js changed 7 times in last 90 days, max cyclomatic complexity 25 in MembersStripeCustomersSubscriptionsImporter.generate at line 100. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac34f07fbb5d6a024a720c4c6b2c1c3826692793820bbc02e131caaa7786d37"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/gifts/gift-delivery-service.ts: ghost/core/core/server/services/gifts/gift-delivery-service.ts changed 7 times in last 90 days, max cyclomatic complexity 25 in GiftDeliveryService.send at line 229. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/gifts/gift-delivery-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/gifts/gift-delivery-service.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d9a5fcbbbed24a93d58cd4ae88eb18ff9581e75c50577fddf199ce6db45b5a9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/components/koenig-lexical-editor.js: apps/ember-admin/app/components/koenig-lexical-editor.js changed 9 times in last 90 days, max cyclomatic complexity 19 in KoenigLexicalEditor.ReactComponent 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/components/koenig-lexical-editor.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/koenig-lexical-editor.js"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9f3dce30d364d963b497e38597f8502b79a89bb7bdee1f345783e8b69a2ae1f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/content-import/import/importer.ts: ghost/core/core/server/services/content-import/import/importer.ts changed 9 times in last 90 days, max cyclomatic complexity 19 in ContentCSVImporter.processRows at line 239. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/content-import/import/importer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/import/importer.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfc70e92bc4ac79b23460857e4b0f542719e19983a1423e4ab121514f1a3547f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/preferences/components/profile.tsx: apps/activitypub/src/views/preferences/components/profile.tsx changed 3 times in last 90 days, max cyclomatic complexity 57 in profile.ProfileCard at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/preferences/components/profile.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":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"3892bf17b486ab00842423ee262a0d28292c5fd22eada638a4a0709da822312b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js: ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js changed 4 times in last 90 days, max cyclomatic complexity 42 in comments.commentMapper at line 51. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"9156b4af26191027baa847b2cfde363795e08a28f12bc70cb4811fdd03e4c797"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/update-flow-modal.tsx: apps/admin/src/editor/publish/update-flow-modal.tsx changed 4 times in last 90 days, max cyclomatic complexity 42 in update-flow-modal.KeyedUpdateFlowModal at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/update-flow-modal.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":"apps/admin/src/editor/publish/update-flow-modal.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f243c0623be8a74fdcd9547a520139a0751294143bf9c2df4c8aa269b27ed5e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/web/web.tsx: apps/admin/src/analytics/views/stats/web/web.tsx changed 8 times in last 90 days, max cyclomatic complexity 21 in web.Web at line 26. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/web/web.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":"apps/admin/src/analytics/views/stats/web/web.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72f96ae94c4db928c6bcf4b3c3ac25c7c8c4ff93a31333b7ab95ba787aa855b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/custom-fields/filter-renderer.tsx: apps/admin/src/members/custom-fields/filter-renderer.tsx changed 11 times in last 90 days, max cyclomatic complexity 15 in filter-renderer.CustomFieldFilterRenderer at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/custom-fields/filter-renderer.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":"apps/admin/src/members/custom-fields/filter-renderer.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cbdd4d8c8cce529f62f9d34a53eb6fcdcdfb971671c3d376fc210cd4c16ae39"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx: apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx changed 6 times in last 90 days, max cyclomatic complexity 27 in welcome-email-preview-frame.WelcomeEmailPreviewFrame at line 10. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.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":"apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"17e3a49c485c9f94deb3419e1c9a81794d00382aa19532d1c6447276b5952e95"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/services/sitemap/site-map-manager.js: ghost/core/core/frontend/services/sitemap/site-map-manager.js changed 10 times in last 90 days, max cyclomatic complexity 16 in SiteMapManager.constructor at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/services/sitemap/site-map-manager.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/sitemap/site-map-manager.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c17c95b7f4f9b96958f1124e8d88dc98ffde0c372bbe0f61ba483be543392b0c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: e2e/helpers/services/stripe/fake-stripe-server.ts: e2e/helpers/services/stripe/fake-stripe-server.ts changed 6 times in last 90 days, max cyclomatic complexity 26 in (anonymous) 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- e2e/helpers/services/stripe/fake-stripe-server.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/helpers/services/stripe/fake-stripe-server.ts"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"7debda42911750df2949639690d98bccfae6887bcdc80ece47842945072cc376"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/utils/get-portal-preview-url.ts: apps/admin/src/settings/utils/get-portal-preview-url.ts changed 5 times in last 90 days, max cyclomatic complexity 31 in get-portal-preview-url.getPortalPreviewUrl 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/utils/get-portal-preview-url.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/get-portal-preview-url.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac769cb6833fd2b959930195d3cc30a703177f953e8810869840d4a4d81175b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/custom-fields/addressing.ts: apps/admin/src/members/custom-fields/addressing.ts changed 8 times in last 90 days, max cyclomatic complexity 19 in addressing.customFieldAddressing 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/custom-fields/addressing.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/custom-fields/addressing.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a0a073690279f5adcb954c59565ce3c0587a0f5bf218147dc7e0c5a6ae774f3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/shade/src/components/ui/multi-select-combobox.tsx: apps/shade/src/components/ui/multi-select-combobox.tsx changed 5 times in last 90 days, max cyclomatic complexity 30 in multi-select-combobox.MultiSelectCombobox at line 171. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/shade/src/components/ui/multi-select-combobox.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/multi-select-combobox.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef485df4118bdf560553125c0db39d08c951563416c9c32a858648193d9681d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/newsletter/components/feedback.tsx: apps/admin/src/posts/analytics/newsletter/components/feedback.tsx changed 10 times in last 90 days, max cyclomatic complexity 15 in feedback.Feedback 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/newsletter/components/feedback.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":"apps/admin/src/posts/analytics/newsletter/components/feedback.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eab41fa01464e708d1aa613136337a7ca645cc7b0e6649d6db6115589a7f95b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx: apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx changed 6 times in last 90 days, max cyclomatic complexity 25 in new-subscribers-cadence.NewSubscribersCadence at line 65. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.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":"apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd4a98a51bb8ddf800af260105f539f105598115717bd07868e9a745fc2bd4c7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/api/automations.ts: apps/admin-x-framework/src/api/automations.ts changed 8 times in last 90 days, max cyclomatic complexity 18 in automations.spliceAction 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/api/automations.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/api/automations.ts"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ebd5b4e92c214eabe134707323e9e422267b5bcd9bcc006a664cc9e772e47ee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members/mapping.ts: apps/admin/src/members/components/bulk-action-modals/import-members/mapping.ts changed 9 times in last 90 days, max cyclomatic complexity 16 in mapping.detectFieldTypes at line 193. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members/mapping.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/mapping.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"70706223933b627efc0863a3f5938257b7e2f9f5162deb2ae44f4e57ea2ec202"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/utils/api/fetch-api.ts: apps/admin-x-framework/src/utils/api/fetch-api.ts changed 6 times in last 90 days, max cyclomatic complexity 24 in fetch-api.useFetchApi at line 161. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/utils/api/fetch-api.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/api/fetch-api.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d39fa7a25cc68e2058a655acdb70791b649ba8367881ae187ec54cb3f76fb32c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/users/profile-tab.tsx: apps/admin/src/settings/general/users/profile-tab.tsx changed 8 times in last 90 days, max cyclomatic complexity 18 in profile-tab.BasicInputs 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/users/profile-tab.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":"apps/admin/src/settings/general/users/profile-tab.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c02b790c0e5bb4d12a67834157f11ae1bf425e2f2e7d449078bbd0e15e89eb40"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/tags/detail/tag-detail-form.tsx: apps/admin/src/tags/detail/tag-detail-form.tsx changed 8 times in last 90 days, max cyclomatic complexity 18 in tag-detail-form.TagDetailForm at line 73. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/tags/detail/tag-detail-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":"apps/admin/src/tags/detail/tag-detail-form.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ca50c088978a85734b8d00b0d639574d8cd5205cdbd15f245ba3f876e4bab1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/posts/posts-service.js: ghost/core/core/server/services/posts/posts-service.js changed 7 times in last 90 days, max cyclomatic complexity 20 in PostsService.bulkEdit at line 120. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/posts/posts-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/posts/posts-service.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"10fc337c4c6bb96ff3d78b63cc794ef2e3683997235da1be9441829108c1a65f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/navigation.js: ghost/core/core/frontend/helpers/navigation.js changed 5 times in last 90 days, max cyclomatic complexity 28 in navigation.navigation at line 98. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/navigation.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/navigation.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"957c8ae50e576936d44e29e700ff709a5cb941668cdcdaecd48022c42166c910"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/members-actions.tsx: apps/admin/src/members/components/members-actions.tsx changed 5 times in last 90 days, max cyclomatic complexity 28 in members-actions.MembersActions at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/members-actions.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":"apps/admin/src/members/components/members-actions.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec47b3002e544f959ad20b60bd456208b5ad54f8c9e33410d8f3079f04fd4280"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/gift-redemption-page.jsx: apps/portal/src/components/pages/gift-redemption-page.jsx changed 4 times in last 90 days, max cyclomatic complexity 35 in gift-redemption-page.GiftRedemptionPage 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/gift-redemption-page.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-redemption-page.jsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c33f3df2f566182f1936568b5151d6568bf384af14bd217a0dab1822be02d6a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: e2e/helpers/pages/admin/posts/post/post-editor-page.ts: e2e/helpers/pages/admin/posts/post/post-editor-page.ts changed 8 times in last 90 days, max cyclomatic complexity 17 in constructor at line 107. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- e2e/helpers/pages/admin/posts/post/post-editor-page.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/helpers/pages/admin/posts/post/post-editor-page.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"f57a4fd910ba66ff786687fab39e87a77b7936a26dde752de66189a578b50acf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/models/base/plugins/events.js: ghost/core/core/server/models/base/plugins/events.js changed 4 times in last 90 days, max cyclomatic complexity 34 in events.default at line 14. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/models/base/plugins/events.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/events.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f7457860da5d698fc7e07e16d1798e6326d6cfe06e24056bf3e6983f1dfbc19"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/layout/app-sidebar/nav-content.tsx: apps/admin/src/layout/app-sidebar/nav-content.tsx changed 8 times in last 90 days, max cyclomatic complexity 17 in nav-content.NavContent 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/layout/app-sidebar/nav-content.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":"apps/admin/src/layout/app-sidebar/nav-content.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ad4049cf88d43e9e95c392f27edce2df76154575b9ab706e427c9340a33847"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/membership/member-emails/test-email-dropdown.tsx: apps/admin/src/settings/membership/member-emails/test-email-dropdown.tsx changed 8 times in last 90 days, max cyclomatic complexity 17 in test-email-dropdown.TestEmailDropdown at line 15. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/membership/member-emails/test-email-dropdown.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":"apps/admin/src/settings/membership/member-emails/test-email-dropdown.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ae3e210eb0b2ffc36fd32c2fa56aee6034c507f676f797e5ef41ade3a5179f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/get.js: ghost/core/core/frontend/helpers/get.js changed 5 times in last 90 days, max cyclomatic complexity 27 in get.get at line 405. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/get.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/get.js"},"region":{"startLine":405}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e3bc783802b618353641658b52c3260d9f9a4ef469c52ed7ee5a4a4d848dbc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/preferences/components/edit-profile.tsx: apps/activitypub/src/views/preferences/components/edit-profile.tsx changed 3 times in last 90 days, max cyclomatic complexity 45 in edit-profile.EditProfile at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/preferences/components/edit-profile.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":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"c122d77ee49f2592bd72da0b68556336dc57135c25fc6499314734893531745d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/general/social-accounts.tsx: apps/admin/src/settings/general/social-accounts.tsx changed 9 times in last 90 days, max cyclomatic complexity 15 in social-accounts.SocialAccounts at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/general/social-accounts.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":"apps/admin/src/settings/general/social-accounts.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"156570de067fb8b27331769c191c0bae3d46ad7471b836f838fd5028cbe0d2d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/editor-header-actions.tsx: apps/admin/src/editor/editor-header-actions.tsx changed 7 times in last 90 days, max cyclomatic complexity 19 in editor-header-actions.PublishActions at line 172. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/editor-header-actions.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":"apps/admin/src/editor/editor-header-actions.tsx"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1fad2a4e4f20e83086d682ccd0e9b8b8a9ea80a2738a12868bbed2d385a0a71"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/slack-ping/slack-ping-service.ts: ghost/core/core/server/services/slack-ping/slack-ping-service.ts changed 7 times in last 90 days, max cyclomatic complexity 19 in SlackPingService.ping at line 127. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/slack-ping/slack-ping-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/slack-ping/slack-ping-service.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff982d6437f66b2211c7e0b7f6b497cb7e8f89f26693e2820e15f8c76deb825"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/components/color-picker-field.tsx: apps/admin/src/settings/components/color-picker-field.tsx changed 6 times in last 90 days, max cyclomatic complexity 22 in color-picker-field.ColorPickerField at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/components/color-picker-field.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":"apps/admin/src/settings/components/color-picker-field.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f23333b1a1e310ba948d1310f703fb31b9855673b9497451888eb586f13e220"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: configs/eslint-react/index.mjs: configs/eslint-react/index.mjs changed 4 times in last 90 days, max cyclomatic complexity 33 in index.reactAppConfig at line 139. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- configs/eslint-react/index.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":"configs/eslint-react/index.mjs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f629cd87373e5ee2a816d94522b0e0430481089ac4df83c8d3efecf32c6ab160"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/components/email-recipients-options.tsx: apps/admin/src/editor/publish/components/email-recipients-options.tsx changed 5 times in last 90 days, max cyclomatic complexity 26 in email-recipients-options.EmailRecipientsOptions at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/components/email-recipients-options.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":"apps/admin/src/editor/publish/components/email-recipients-options.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"98e0b08bfe31d3da46b232da22136be82a10f6097c7c81d03b8ae0c218397750"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/middleware.js: ghost/core/core/server/services/members/middleware.js changed 5 times in last 90 days, max cyclomatic complexity 26 in middleware.createSessionFromMagicLink at line 415. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/middleware.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/middleware.js"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa7aaf289fc0210224e28324a6a04289779df481ca35b5ceea7cef124d37bd1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/helpers/parse-member-event.js: apps/ember-admin/app/helpers/parse-member-event.js changed 3 times in last 90 days, max cyclomatic complexity 43 in ParseMemberEventHelper.getAction at line 194. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/helpers/parse-member-event.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"be047de71e863e1a0d2c6c88e03b92ef74feb0bf7b2030a72c629c505b312aff"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/components/confirmation-modal.tsx: apps/admin/src/settings/components/confirmation-modal.tsx changed 8 times in last 90 days, max cyclomatic complexity 16 in confirmation-modal.ConfirmationModalContent at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/components/confirmation-modal.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":"apps/admin/src/settings/components/confirmation-modal.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7c5db4322c0bad83c93f97ed28a4570360888277a343f1dd25ce031ced7e893"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/email-sending-status/email-sending-status-banner.tsx: apps/admin/src/posts/analytics/email-sending-status/email-sending-status-banner.tsx changed 6 times in last 90 days, max cyclomatic complexity 21 in email-sending-status-banner.EmailSendingStatusBanner at line 94. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/email-sending-status/email-sending-status-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":"apps/admin/src/posts/analytics/email-sending-status/email-sending-status-banner.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"267bdcba13843de1de8f2acd5a911843578abaca06f5c9acc5abeeaec413e6a1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email/use-default-recipients-options.tsx: apps/admin/src/settings/email/use-default-recipients-options.tsx changed 6 times in last 90 days, max cyclomatic complexity 20 in use-default-recipients-options.useDefaultRecipientsOptions 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email/use-default-recipients-options.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":"apps/admin/src/settings/email/use-default-recipients-options.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a452f74f3be39961c21e52c8f514fe04e72cc55185fbe90ca0fe5d18a97963"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/hooks/use-pintura-editor.ts: apps/admin/src/settings/hooks/use-pintura-editor.ts changed 5 times in last 90 days, max cyclomatic complexity 24 in use-pintura-editor.usePinturaEditor at line 49. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/hooks/use-pintura-editor.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/hooks/use-pintura-editor.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"f584f2810bc3bb02353820f4cc217a450ebe710716a2635f942a86791c9026e8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/utils/welcome-email-sender-details.ts: apps/admin/src/settings/utils/welcome-email-sender-details.ts changed 6 times in last 90 days, max cyclomatic complexity 20 in welcome-email-sender-details.resolveWelcomeEmailSenderDetails 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/utils/welcome-email-sender-details.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/welcome-email-sender-details.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"801be0c81032505ed8dcd1b86552dd2f711ae46ed6ce2719189a58394bc33fe4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/hooks/use-limiter.ts: apps/admin-x-framework/src/hooks/use-limiter.ts changed 7 times in last 90 days, max cyclomatic complexity 17 in use-limiter.useLimiter at line 27. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/hooks/use-limiter.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/hooks/use-limiter.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75ef0a3005271625c3b2265bf22cd77d78a1c8c69575ee19f80cf8deab23e53"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/lib/mailgun-client.js: ghost/core/core/server/services/lib/mailgun-client.js changed 7 times in last 90 days, max cyclomatic complexity 17 in send at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/lib/mailgun-client.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/lib/mailgun-client.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa5a7b2df9ca6139c4cc285dfbfc4670f02e6b8735fd635a7174bddb77682b2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/comments/comments.tsx: apps/admin/src/comments/comments.tsx changed 7 times in last 90 days, max cyclomatic complexity 17 in comments.CommentsPage 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/comments/comments.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":"apps/admin/src/comments/comments.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bbadf01fa8917860716151785d89325e4c0169d4ec765997c074f7103639cb0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/importer/importers/data/settings-importer.js: ghost/core/core/server/data/importer/importers/data/settings-importer.js changed 4 times in last 90 days, max cyclomatic complexity 29 in SettingsImporter.beforeImport at line 99. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/importer/importers/data/settings-importer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/settings-importer.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"e582114d626ffb6a7044051dea88a6528f73d4bf082c3d5811114d54c09ab141"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts: apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts changed 4 times in last 90 days, max cyclomatic complexity 29 in use-post-newsletter-stats.usePostNewsletterStats 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"685f901ab228bc8b2286ca3a476f20d8123b5ae31ae45cf90a4d2c6f9a96931d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/hooks/use-activity-pub-queries.ts: apps/activitypub/src/hooks/use-activity-pub-queries.ts changed 4 times in last 90 days, max cyclomatic complexity 29 in use-activity-pub-queries.useDeleteMutationForUser at line 2165. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/hooks/use-activity-pub-queries.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3729b9ac474b7672566c7ecc20ca1c4fdc6d555fc103325c3deb7c2675902c5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/profile/components/profile-page.tsx: apps/activitypub/src/views/profile/components/profile-page.tsx changed 2 times in last 90 days, max cyclomatic complexity 58 in profile-page.ProfilePage 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/profile/components/profile-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":"apps/activitypub/src/views/profile/components/profile-page.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd283c90ef1debd70067eca61616c32908f169fbd75d92e7437ad323bfef72f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js: ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js changed 5 times in last 90 days, max cyclomatic complexity 23 in MemberWelcomeEmailRenderer.render 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/member-welcome-emails/member-welcome-email-renderer.js"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cd76c85694d44dc04ad6cd99572dfcd46c594f761dc7eb9e497d4a422109566"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-activity-feed.tsx: apps/admin/src/members/detail/member-activity-feed.tsx changed 6 times in last 90 days, max cyclomatic complexity 19 in member-activity-feed.EventIcon at line 38. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-activity-feed.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":"apps/admin/src/members/detail/member-activity-feed.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"61686d38d6e38b9f6a872b78fdbdf56bfaeee73961975e799ab4b93e28e53ae1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx changed 6 times in last 90 days, max cyclomatic complexity 19 in field-picker.FieldPicker at line 88. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/field-picker.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"45965292334145f9eb89d4a24317687420640030537fea174d1f651c3980d430"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/components/global/profile-preview-hover-card.tsx: apps/activitypub/src/components/global/profile-preview-hover-card.tsx changed 3 times in last 90 days, max cyclomatic complexity 38 in profile-preview-hover-card.ProfilePreviewHoverCard 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/components/global/profile-preview-hover-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":"apps/activitypub/src/components/global/profile-preview-hover-card.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"7633509a711df95e9a078d067065779d0b438f2f82e33b2422cef4a4e9e97af3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/comments-ui/src/app.tsx: apps/comments-ui/src/app.tsx changed 3 times in last 90 days, max cyclomatic complexity 38 in app.App at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/comments-ui/src/app.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":"apps/comments-ui/src/app.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d6a35e8cd4eba92afbdf0e786fa7f8c561a952b9b92c3d88b320ae5ed2e892"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/email-sending-status/email-sending-status-provider.tsx: apps/admin/src/posts/analytics/email-sending-status/email-sending-status-provider.tsx changed 3 times in last 90 days, max cyclomatic complexity 37 in email-sending-status-provider.EmailSendingStatusProvider 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/email-sending-status/email-sending-status-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":"apps/admin/src/posts/analytics/email-sending-status/email-sending-status-provider.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c93d5c9508fb73f9cee5824c0906fcfde24956c13d59b8044e7aca2d399595"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts: ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts changed 5 times in last 90 days, max cyclomatic complexity 22 in AutomationRunStepsImporter.import 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/importers/automation-run-steps-importer.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"df9fdcf05e5d403821d4d99d1eb2672f1d4b91c98b9ab199da5e7361cdda23b2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/modals/gift-link-modal.tsx: apps/admin/src/posts/analytics/modals/gift-link-modal.tsx changed 5 times in last 90 days, max cyclomatic complexity 22 in gift-link-modal.GiftLinkModal at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/modals/gift-link-modal.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":"apps/admin/src/posts/analytics/modals/gift-link-modal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff9741045a3b7e13855eb1840bfadf701ade553b48b845235325c14da339d85"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/foreach.js: ghost/core/core/frontend/helpers/foreach.js changed 3 times in last 90 days, max cyclomatic complexity 36 in foreach.foreach 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/foreach.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/foreach.js"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"551fe2de744d45adbd220aa396c37fa15d6a52fc33144c9d73e3029981dce953"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/tags/detail/tag-image-field.tsx: apps/admin/src/tags/detail/tag-image-field.tsx changed 6 times in last 90 days, max cyclomatic complexity 18 in tag-image-field.TagImageField 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/tags/detail/tag-image-field.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":"apps/admin/src/tags/detail/tag-image-field.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a4c8a409633ce57c3ee2d3f90d73d45f33ecbd5d76e98d54b1f58d102002a22"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/email-modal/preview-frame.tsx: apps/admin/src/automations/components/email-modal/preview-frame.tsx changed 4 times in last 90 days, max cyclomatic complexity 27 in preview-frame.EmailPreviewFrame at line 10. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/email-modal/preview-frame.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":"apps/admin/src/automations/components/email-modal/preview-frame.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"4beffe6dcac962d9df19dd0f50410ca7cde70b208cd33c753e70c5553c7c31be"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/content-import/import/post-data.ts: ghost/core/core/server/services/content-import/import/post-data.ts changed 5 times in last 90 days, max cyclomatic complexity 21 in post-data.buildPostData at line 82. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/content-import/import/post-data.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/import/post-data.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"15952bca5ec70e5e9ae8c8a393ebab800317cbfc842fc7e8d393f004c472383f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/api/actions.ts: apps/admin-x-framework/src/api/actions.ts changed 5 times in last 90 days, max cyclomatic complexity 21 in actions.getLinkTarget 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/api/actions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/api/actions.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b2b235ba97861b6c91466e2205535be3efcbbad205c1b917b5937cc51497748"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/utils/locale-validation.ts: apps/admin/src/settings/utils/locale-validation.ts changed 3 times in last 90 days, max cyclomatic complexity 35 in locale-validation.validateLocale 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/utils/locale-validation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/locale-validation.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2255fadf9c099c07663c1bd3810e92d8b00c232ee36621774543f90e7233b48"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/gift-success-page.jsx: apps/portal/src/components/pages/gift-success-page.jsx changed 4 times in last 90 days, max cyclomatic complexity 26 in gift-success-page.GiftSuccessPage at line 139. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/gift-success-page.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-success-page.jsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dd688ea59cfe1a9266315ea26cc5e40c0dffb101ed61dc890b0de41a2e4b7e7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx: apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx changed 4 times in last 90 days, max cyclomatic complexity 26 in mapping-step.MappingStep 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.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":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff0ee26c538b903636c88719b7e5e6e6770cc37e6e44b903c2069c30249d1e1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/test/utils/e2e-framework-mock-manager.js: ghost/core/test/utils/e2e-framework-mock-manager.js changed 6 times in last 90 days, max cyclomatic complexity 17 in restoreLimitService at line 516. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/test/utils/e2e-framework-mock-manager.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/utils/e2e-framework-mock-manager.js"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c51ad433dcdb072d8f347360ed656e6810126b0e59bc12bf738fe22aac0988"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/label-picker/label-picker.tsx: apps/admin/src/members/label-picker/label-picker.tsx changed 6 times in last 90 days, max cyclomatic complexity 17 in label-picker.ComboboxPicker at line 266. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/label-picker/label-picker.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/label-picker/label-picker.tsx"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"88242408353eabc784948668e64bbf72b8c47780ea0ef1bc2cde39f97921260d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/unsubscribe-page.jsx: apps/portal/src/components/pages/unsubscribe-page.jsx changed 3 times in last 90 days, max cyclomatic complexity 34 in unsubscribe-page.UnsubscribePage at line 83. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/unsubscribe-page.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/unsubscribe-page.jsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc16f42e79efa2c0cda711091c625432c69220489ba9b3e9568f729ff589e618"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/canvas/nodes.tsx: apps/admin/src/automations/components/canvas/nodes.tsx changed 6 times in last 90 days, max cyclomatic complexity 17 in nodes.NodeShell at line 92. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/canvas/nodes.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":"apps/admin/src/automations/components/canvas/nodes.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4a5358a38d120d11d634dc0d4ecdec26166be10314d44248734c3904973f50"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/use-publish-inputs.ts: apps/admin/src/editor/publish/use-publish-inputs.ts changed 5 times in last 90 days, max cyclomatic complexity 20 in use-publish-inputs.usePublishInputs at line 147. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/use-publish-inputs.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/use-publish-inputs.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"843c8df733ab4e37fdd3d0751e956f18127f6de5787f0223485845c64378474a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/hooks/use-gift-link-usage.ts: apps/admin/src/posts/analytics/hooks/use-gift-link-usage.ts changed 5 times in last 90 days, max cyclomatic complexity 20 in use-gift-link-usage.useGiftLinkUsage at line 34. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/hooks/use-gift-link-usage.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/hooks/use-gift-link-usage.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0cb6f6ebc2631dd7d5389472923f2c173e74f9acdab95bd9252a9fde7b5db09"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/utils/social-urls/platform-validator.ts: apps/admin/src/settings/utils/social-urls/platform-validator.ts changed 4 times in last 90 days, max cyclomatic complexity 25 in platform-validator.createPlatformValidator at line 153. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/utils/social-urls/platform-validator.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/social-urls/platform-validator.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b702920905ce3c91177b7a7a6e581583a72e6d2dd29549daf4e1394a80e625"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/list/posts-list-screen.tsx: apps/admin/src/posts/list/posts-list-screen.tsx changed 3 times in last 90 days, max cyclomatic complexity 33 in posts-list-screen.PostsListScreen at line 61. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/list/posts-list-screen.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":"apps/admin/src/posts/list/posts-list-screen.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34dd8689153b2d9362c70d813f02e72d1d86aa6a8ba84a9bd3d67bfcf604e29"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/schema/validator.ts: ghost/core/core/server/data/schema/validator.ts changed 4 times in last 90 days, max cyclomatic complexity 24 in validator.validateSchema at line 43. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/schema/validator.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/schema/validator.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f2e6ef90c101bce0ce21d991da01f5062a2546e6ec6cd6a57d3a6cb849493a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/models/base/plugins/actions.js: ghost/core/core/server/models/base/plugins/actions.js changed 3 times in last 90 days, max cyclomatic complexity 32 in actions.default 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/models/base/plugins/actions.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/actions.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa747fe76c85a9dfbe6e6e4f4812a58383645794ccaba25a6ad275e82d65793"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/activity/member-activity.tsx: apps/admin/src/members/activity/member-activity.tsx changed 2 times in last 90 days, max cyclomatic complexity 48 in member-activity.ActivityPage at line 48. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/activity/member-activity.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":"apps/admin/src/members/activity/member-activity.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7325820d334fe7031348780135f440079308bc01f741c4b58d99f17ec5010f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/hooks/use-theme.ts: apps/admin/src/hooks/use-theme.ts changed 6 times in last 90 days, max cyclomatic complexity 16 in use-theme.useTheme at line 52. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/hooks/use-theme.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/hooks/use-theme.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"304d1f38a76ede99bc5465b7cc60fd3c1b33ff6b7e92f6efbf77e96580b2a2c0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/comments/components/comment-likes-modal.tsx: apps/admin/src/comments/components/comment-likes-modal.tsx changed 4 times in last 90 days, max cyclomatic complexity 24 in comment-likes-modal.CommentLikesModal at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/comments/components/comment-likes-modal.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":"apps/admin/src/comments/components/comment-likes-modal.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb97963387f1a6ad7f6726c93665ed13e1362919c6cee3292811d2e4fa66b7fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/members-list.tsx: apps/admin/src/members/components/members-list.tsx changed 6 times in last 90 days, max cyclomatic complexity 16 in members-list.MembersList 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/members-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":"apps/admin/src/members/components/members-list.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0ea329f0643edde353bfd7cdbdf4ea0977346ccc7d008c19b2882d5e20f79d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/shared/virtual-list/use-scroll-restoration.tsx: apps/admin/src/shared/virtual-list/use-scroll-restoration.tsx changed 4 times in last 90 days, max cyclomatic complexity 24 in use-scroll-restoration.useScrollRestoration 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/shared/virtual-list/use-scroll-restoration.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":"apps/admin/src/shared/virtual-list/use-scroll-restoration.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff35e849fcc1def97440bf1ce9efee3817e4f571bba6a7f661d64c54306ff24e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/common/input-field.jsx: apps/portal/src/components/common/input-field.jsx changed 5 times in last 90 days, max cyclomatic complexity 19 in input-field.InputField 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/common/input-field.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/input-field.jsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"363d8dbc883b5633988d63f3dadab6233ece7dc9ff994b7994ed20ca8dbe9ac1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/advanced/migration-tools/export-all-modal.tsx: apps/admin/src/settings/advanced/migration-tools/export-all-modal.tsx changed 5 times in last 90 days, max cyclomatic complexity 19 in export-all-modal.ExportAllModal at line 80. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/advanced/migration-tools/export-all-modal.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":"apps/admin/src/settings/advanced/migration-tools/export-all-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5e2e2d7f8639c7451cc398d2711cd0ddf501f19c708e1856e901daa1f480b79"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx: apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx changed 3 times in last 90 days, max cyclomatic complexity 31 in paid-account-actions.PaidAccountActions at line 21. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"732d5e1b70eb5d2580d0e17931256106bbbffdae79ad0c8e78a4e6f4263cde8e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/hooks/use-label-picker.ts: apps/admin/src/members/hooks/use-label-picker.ts changed 4 times in last 90 days, max cyclomatic complexity 23 in use-label-picker.useLabelPicker at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/hooks/use-label-picker.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/hooks/use-label-picker.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efdeb3cc676ceb325994bbc591eb47102e2d82b4e1739f3ea870eaa2dca6efa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/routes/posts.js: apps/ember-admin/app/routes/posts.js changed 5 times in last 90 days, max cyclomatic complexity 18 in PostsRoute.model at line 183. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/routes/posts.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/routes/posts.js"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e48568985dd0969ae23eeaf5e3acc6760858c0c95011b6d9392756e7f8e002e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/models/base/plugins/crud.js: ghost/core/core/server/models/base/plugins/crud.js changed 3 times in last 90 days, max cyclomatic complexity 30 in crud.default 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/models/base/plugins/crud.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/crud.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"c34c7632969e4e6e0fc3c1cf4ff547108111c2717d25041ecefe55fec9ef5f43"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/mentions/mention-sending-service.js: ghost/core/core/server/services/mentions/mention-sending-service.js changed 6 times in last 90 days, max cyclomatic complexity 15 in sendForPost 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/mentions/mention-sending-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/mentions/mention-sending-service.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a8122237adac7fcfc6acc6a9b3c06be495e4287a9df88407aa5948913ecdb5e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: e2e/helpers/services/stripe/stripe-service.ts: e2e/helpers/services/stripe/stripe-service.ts changed 5 times in last 90 days, max cyclomatic complexity 18 in completeDonationCheckout at line 360. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- e2e/helpers/services/stripe/stripe-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/helpers/services/stripe/stripe-service.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6fead0b552b092924ec15f8923b7d9c2223636a2a838062940bfa89cf3117a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/services/routing/controllers/entry.ts: ghost/core/core/frontend/services/routing/controllers/entry.ts changed 6 times in last 90 days, max cyclomatic complexity 15 in entry.entryController 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/services/routing/controllers/entry.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/routing/controllers/entry.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"13c824c13ef201e17c913b0c92c8005a26b11d5973622c20ab99d3c9837db42b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/hooks/site/use-navigation-editor.tsx: apps/admin/src/settings/hooks/site/use-navigation-editor.tsx changed 6 times in last 90 days, max cyclomatic complexity 15 in use-navigation-editor.useNavigationEditor at line 57. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/hooks/site/use-navigation-editor.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":"apps/admin/src/settings/hooks/site/use-navigation-editor.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20929d5e1bfe05789bf732bf12c630c70c03bb88d4b0a7f04b347a73bf7318c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/shared/pickers/chip-picker.tsx: apps/admin/src/shared/pickers/chip-picker.tsx changed 2 times in last 90 days, max cyclomatic complexity 44 in chip-picker.ChipPicker at line 77. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/shared/pickers/chip-picker.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/pickers/chip-picker.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cff2f3907ebff616d1e3d6216dfd9db2d1a5723a9736539122815992b753bb3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/components/modals/search.tsx: apps/activitypub/src/components/modals/search.tsx changed 2 times in last 90 days, max cyclomatic complexity 44 in search.Search at line 53. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/components/modals/search.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":"apps/activitypub/src/components/modals/search.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bf382e5804020315dc11a294e0be088f35ae98ec9fd964da1f4c183c5a2967e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/importer/importers/data/base.js: ghost/core/core/server/data/importer/importers/data/base.js changed 5 times in last 90 days, max cyclomatic complexity 17 in Base.replaceIdentifiers 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/importer/importers/data/base.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/base.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff7222c95f2639a16741da9772410d9948c46b665b7eba7f2d03d2fda581a05"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: e2e/helpers/services/stripe/builders.ts: e2e/helpers/services/stripe/builders.ts changed 5 times in last 90 days, max cyclomatic complexity 17 in buildSubscription 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- e2e/helpers/services/stripe/builders.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/helpers/services/stripe/builders.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"625ba73ec81e83e3fa190471f48b7c87abb2c53b19bd7db4c8065716ab0fe776"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/members-api/controllers/member-controller.js: ghost/core/core/server/services/members/members-api/controllers/member-controller.js changed 3 times in last 90 days, max cyclomatic complexity 28 in updateSubscription 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/members-api/controllers/member-controller.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/controllers/member-controller.js"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"1735c38daecedc3954763c6f2b5eb8fc9064ea19f90d2b349e2bf94081a35e9d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/list/components/post-list-row.tsx: apps/admin/src/posts/list/components/post-list-row.tsx changed 3 times in last 90 days, max cyclomatic complexity 28 in post-list-row.PostListRowComponent at line 124. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/list/components/post-list-row.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":"apps/admin/src/posts/list/components/post-list-row.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"364449ec2106634f780aaf981e1b4275ca8d2f24e64a8089bfa62101e3de00ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/common/date-picker.jsx: apps/portal/src/components/common/date-picker.jsx changed 3 times in last 90 days, max cyclomatic complexity 28 in date-picker.DatePicker at line 296. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/common/date-picker.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/date-picker.jsx"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f37e80f578682fb1ef3478de42b7bcc3db75e118aa1e38f7d5cd72405bbdbc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/analytics/newsletter/components/newsletter-radial-chart.tsx: apps/admin/src/posts/analytics/newsletter/components/newsletter-radial-chart.tsx changed 4 times in last 90 days, max cyclomatic complexity 21 in newsletter-radial-chart.NewsletterRadialChart at line 26. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/analytics/newsletter/components/newsletter-radial-chart.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":"apps/admin/src/posts/analytics/newsletter/components/newsletter-radial-chart.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c46fb0df2e5498487b09352ef135f1703ddb6fbd89d6e765a2d093822e494665"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/site/theme/theme-file-tree.tsx: apps/admin/src/settings/site/theme/theme-file-tree.tsx changed 4 times in last 90 days, max cyclomatic complexity 21 in theme-file-tree.ThemeFileTree at line 100. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/site/theme/theme-file-tree.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":"apps/admin/src/settings/site/theme/theme-file-tree.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a4ff8bc7e01c809c6d121fa2538b78cf24877aaa470c5a8fd4dce318729fcda"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/utils/format-url.ts: apps/admin/src/settings/utils/format-url.ts changed 4 times in last 90 days, max cyclomatic complexity 21 in format-url.formatUrl at line 3. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/utils/format-url.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/utils/format-url.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ab90b82cc0f7091c106101c8c1318f29ecf302a9f8ab2193d58fff1d8c59de"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/models/base/plugins/sanitize.js: ghost/core/core/server/models/base/plugins/sanitize.js changed 3 times in last 90 days, max cyclomatic complexity 27 in sanitize.default at line 16. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/models/base/plugins/sanitize.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/sanitize.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf413336afcd4ee1d3e1a7b4a88d6d451e38c0321b60d3f71d29845d50c2eae8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/models/base/plugins/generate-slug.js: ghost/core/core/server/models/base/plugins/generate-slug.js changed 3 times in last 90 days, max cyclomatic complexity 27 in generate-slug.default at line 9. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/models/base/plugins/generate-slug.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/generate-slug.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af32865b1943aee55b2053f9725e70bd1dba55c0ad6e823ede4a7ba73a6a400"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/layout/admin-layout.tsx: apps/admin/src/layout/admin-layout.tsx changed 5 times in last 90 days, max cyclomatic complexity 16 in admin-layout.AdminLayout at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/layout/admin-layout.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":"apps/admin/src/layout/admin-layout.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"9998249b427708909d0c402765195032b358b2ef2512fb6b231b8467bc268e5f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-actions-menu.tsx: apps/admin/src/members/detail/member-actions-menu.tsx changed 5 times in last 90 days, max cyclomatic complexity 16 in member-actions-menu.MemberActionsMenu at line 42. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-actions-menu.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":"apps/admin/src/members/detail/member-actions-menu.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"85808efcf4447967ab89c1110859b83425bb858bec783bed75c591bc69d09052"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-detail-sidebar.tsx: apps/admin/src/members/detail/member-detail-sidebar.tsx changed 4 times in last 90 days, max cyclomatic complexity 20 in member-detail-sidebar.MemberDetailSidebar 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-detail-sidebar.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":"apps/admin/src/members/detail/member-detail-sidebar.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a7479438aefdc036f12ca0c97f97749bfb6fbd1b96cee7f82ad1f03d6af841"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/use-post-snippets.tsx: apps/admin/src/editor/use-post-snippets.tsx changed 4 times in last 90 days, max cyclomatic complexity 20 in use-post-snippets.usePostSnippets at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/use-post-snippets.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":"apps/admin/src/editor/use-post-snippets.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad86781cd68cbdb5b8f626a6f958a8a562b2e6ce7a1283f307ad18cc9912e45e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/lib/image/image-size.js: ghost/core/core/server/lib/image/image-size.js changed 5 times in last 90 days, max cyclomatic complexity 16 in ImageSize._getImageSizeFromUrl 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/lib/image/image-size.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/lib/image/image-size.js"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"916240ec0ac27a5a342f1316253190d059742d368b464b92e2047bbba09a9c7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/members-api/repositories/product-repository.js: ghost/core/core/server/services/members/members-api/repositories/product-repository.js changed 2 times in last 90 days, max cyclomatic complexity 40 in ProductRepository.update at line 374. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/members-api/repositories/product-repository.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/product-repository.js"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e970b7714bae95f64b26b1206d7709cd8e3a374a4e32e201931c1315ccc0d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/members-header-search.tsx: apps/admin/src/members/components/members-header-search.tsx changed 4 times in last 90 days, max cyclomatic complexity 20 in members-header-search.MembersHeaderSearch at line 16. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/members-header-search.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":"apps/admin/src/members/components/members-header-search.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"35defc663956b42d921b652feb902563a96937aff84c25facee622d3179d3802"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/controllers/lexical-editor.js: apps/ember-admin/app/controllers/lexical-editor.js changed 2 times in last 90 days, max cyclomatic complexity 39 in LexicalEditorController.saveTask at line 591. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/controllers/lexical-editor.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db4f13cfe993307e0c7424da1e2c6e3610f92f79fd03929b6cb96c537e79bfe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/hooks/use-growth-stats.ts: apps/admin/src/analytics/hooks/use-growth-stats.ts changed 3 times in last 90 days, max cyclomatic complexity 26 in use-growth-stats.calculateTotals at line 18. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/hooks/use-growth-stats.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/hooks/use-growth-stats.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d3464ec6aefe2850639b6bdc4dafbb348c162b3896c40c259da873f3b59f10"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.tsx: apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.tsx changed 3 times in last 90 days, max cyclomatic complexity 26 in unsubscribe-modal.UnsubscribeModal 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.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":"apps/admin/src/members/components/bulk-action-modals/unsubscribe-modal.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"46edde3bc039230782561ed809a8102605d116ce0dd8b76dc38c7ae81a9d8c77"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/notification.jsx: apps/portal/src/components/notification.jsx changed 2 times in last 90 days, max cyclomatic complexity 38 in notification.NotificationText 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/notification.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/notification.jsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3a9560c4123d977601bc90865c2227a8cc97c2c6d5fa0582c7fb8fa36e58c28"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/utils/helpers.js: apps/portal/src/utils/helpers.js changed 5 times in last 90 days, max cyclomatic complexity 15 in helpers.getQueryPrice at line 235. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/utils/helpers.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/utils/helpers.js"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4e958fbb958a5e85d017b0a60afa691941a65299ea73e2e962b2ddd15b4dc56"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/email-design/email-preview.tsx: apps/admin/src/settings/email-design/email-preview.tsx changed 5 times in last 90 days, max cyclomatic complexity 15 in email-preview.EnvelopeHeader at line 36. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/email-design/email-preview.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":"apps/admin/src/settings/email-design/email-preview.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be7289dc9ce4ec129d21251d48e8a48d6fb30b9b35cc623ab24473a0f14b7b7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/comments/components/comment-thread-list.tsx: apps/admin/src/comments/components/comment-thread-list.tsx changed 5 times in last 90 days, max cyclomatic complexity 15 in comment-thread-list.CommentRow at line 39. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/comments/components/comment-thread-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":"apps/admin/src/comments/components/comment-thread-list.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a83dd566d1f8b421446a66b62e05e384498e1829aac1b13624cf271dad67138"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/posts/posts-exporter.js: ghost/core/core/server/services/posts/posts-exporter.js changed 2 times in last 90 days, max cyclomatic complexity 35 in PostsExporter.#mapPosts at line 192. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/posts/posts-exporter.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/posts/posts-exporter.js"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"affa784643b0adbbb1a5806600886d95cdd2d151cf275d63f45ca5ccf723683a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/components/options-step.tsx: apps/admin/src/editor/publish/components/options-step.tsx changed 3 times in last 90 days, max cyclomatic complexity 23 in options-step.OptionsStep 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/components/options-step.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":"apps/admin/src/editor/publish/components/options-step.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da63b139d3270ccd068df414146645dc4058965eae5c93274f622b2aacef374"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/shade/src/components/ui/pagemenu.tsx: apps/shade/src/components/ui/pagemenu.tsx changed 3 times in last 90 days, max cyclomatic complexity 23 in pagemenu.PageMenu at line 29. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/shade/src/components/ui/pagemenu.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":"apps/shade/src/components/ui/pagemenu.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"af3535bd2c242cb3edc5f6b582ee72ab5a9fb22edcd19074504a41ab58fdde31"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/web/api/middleware/upload.js: ghost/core/core/server/web/api/middleware/upload.js changed 4 times in last 90 days, max cyclomatic complexity 17 in upload.mediaValidation at line 408. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/web/api/middleware/upload.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/web/api/middleware/upload.js"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce063fae534e6ce2ac555a2bcae981058ec696c8e4c8b82a4af89eacfb60c9a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/web/routers/serve-public-file.js: ghost/core/core/frontend/web/routers/serve-public-file.js changed 4 times in last 90 days, max cyclomatic complexity 17 in serve-public-file.createPublicFileMiddleware 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/web/routers/serve-public-file.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/web/routers/serve-public-file.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"faaf740ea8e373c46a4f6e5fdb3d27bcc53ee0cee29136c61f4a1b79b6385e08"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/importer/importers/data/posts-importer.js: ghost/core/core/server/data/importer/importers/data/posts-importer.js changed 4 times in last 90 days, max cyclomatic complexity 17 in PostsImporter.beforeImport at line 247. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/importer/importers/data/posts-importer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/posts-importer.js"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cdb80b81bba2e1026e5d4b0a95c1a3b9a76cc8154fd9785d6ea0e54f0ce2be8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/api/endpoints/utils/validators/input/settings.js: ghost/core/core/server/api/endpoints/utils/validators/input/settings.js changed 4 times in last 90 days, max cyclomatic complexity 17 in settings.validateNavigationItems 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/api/endpoints/utils/validators/input/settings.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/utils/validators/input/settings.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd16afbf165aa4065f6acd4eb8109ca49a543dca746d35e1f44bd416dac92973"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/canvas/use-canvas-viewport.ts: apps/admin/src/automations/components/canvas/use-canvas-viewport.ts changed 4 times in last 90 days, max cyclomatic complexity 17 in use-canvas-viewport.useCanvasViewport at line 57. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/canvas/use-canvas-viewport.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/canvas/use-canvas-viewport.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba0946e5249f2ec6664e9a1a4835755729edd55da454961890b8c9adb607af8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/email-modal/test-email-dropdown.tsx: apps/admin/src/automations/components/email-modal/test-email-dropdown.tsx changed 4 times in last 90 days, max cyclomatic complexity 17 in test-email-dropdown.TestEmailDropdown at line 15. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/email-modal/test-email-dropdown.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":"apps/admin/src/automations/components/email-modal/test-email-dropdown.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d9f95fbdb16fb9770cd8cc2303830c38e6a40df3342faa4cfac76667664e81"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/shared/filters/relative-date-filter.tsx: apps/admin/src/shared/filters/relative-date-filter.tsx changed 4 times in last 90 days, max cyclomatic complexity 17 in relative-date-filter.RelativeDateFilter at line 27. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/shared/filters/relative-date-filter.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":"apps/admin/src/shared/filters/relative-date-filter.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f2cc6cd88b05c9b1c9bdd436a5539bdb330e7c7dd6f82283644097fac08429"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/stats/utils/tinybird.js: ghost/core/core/server/services/stats/utils/tinybird.js changed 3 times in last 90 days, max cyclomatic complexity 22 in tinybird.create 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/stats/utils/tinybird.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stats/utils/tinybird.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"3481d7827c550ab1e138c4154addf158076518178ce18c2b17a46e4db47c03cf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/check-internal-packages.js: scripts/check-internal-packages.js changed 2 times in last 90 days, max cyclomatic complexity 33 in check-internal-packages.validateCompliantPackage at line 193. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- scripts/check-internal-packages.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check-internal-packages.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"963ab97334c7eee4c03448a6ab507840f8a015cfe917fcefcbb9af24c6de88d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/notifications/notifications.js: ghost/core/core/server/services/notifications/notifications.js changed 4 times in last 90 days, max cyclomatic complexity 16 in Notifications.browse 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/notifications/notifications.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/notifications/notifications.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7b369a9091d46f0fed6a15a8d710ed1a3238ad67ac068806857e499e6ab49a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/preview/email-preview.tsx: apps/admin/src/editor/preview/email-preview.tsx changed 4 times in last 90 days, max cyclomatic complexity 16 in email-preview.EmailPreview at line 83. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/preview/email-preview.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":"apps/admin/src/editor/preview/email-preview.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4baf69404719be8353a2a9a29f415f7ef3c6e1eb5a323e888ffa0bbcd2c426"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/meta/asset-url.js: ghost/core/core/frontend/meta/asset-url.js changed 4 times in last 90 days, max cyclomatic complexity 16 in asset-url.getAssetUrl at line 104. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/meta/asset-url.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/asset-url.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"655d95ce42cbe91fe51124e651a7ee71a0bdbb17bc150dbcfb5cb7ca3d7bb10a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/hooks/scroll-section-provider.tsx: apps/admin/src/settings/hooks/scroll-section-provider.tsx changed 4 times in last 90 days, max cyclomatic complexity 16 in scroll-section-provider.ScrollSectionProvider at line 98. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/hooks/scroll-section-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":"apps/admin/src/settings/hooks/scroll-section-provider.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0961726ccf71e7e2575d7f1e372cb67b6100c085237070c5662d42b174ed461"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/hooks/use-unsaved-changes-guard.ts: apps/admin/src/hooks/use-unsaved-changes-guard.ts changed 3 times in last 90 days, max cyclomatic complexity 21 in use-unsaved-changes-guard.useUnsavedChangesGuard at line 65. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/hooks/use-unsaved-changes-guard.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/hooks/use-unsaved-changes-guard.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9516bbf77b51ed06046b7827094dbb88a621796acd59ae2a9e2a3e77b1e37f01"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/utils/api/handle-response.ts: apps/admin-x-framework/src/utils/api/handle-response.ts changed 3 times in last 90 days, max cyclomatic complexity 21 in handle-response.handleResponse at line 26. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/utils/api/handle-response.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/api/handle-response.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c815478f7423c47183d1c4f1447615196881f8b4bd94fe98a04a8963c3ee1d80"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/shade/src/components/ui/code-editor-view.tsx: apps/shade/src/components/ui/code-editor-view.tsx changed 3 times in last 90 days, max cyclomatic complexity 21 in code-editor-view.CodeEditorView at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/shade/src/components/ui/code-editor-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":"apps/shade/src/components/ui/code-editor-view.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a1d80505c90740a5107c5aa2460ed4591d8c24bf5f1fc3638ca634a2720a43d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/shade/src/components/ui/chart.tsx: apps/shade/src/components/ui/chart.tsx changed 2 times in last 90 days, max cyclomatic complexity 31 in chart.ChartTooltipContent at line 108. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/shade/src/components/ui/chart.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":"apps/shade/src/components/ui/chart.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbeb82c1cb258da90c701b074753a5c794ccb6d5b359a7ee77e71dde9007e30"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js: ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js changed 4 times in last 90 days, max cyclomatic complexity 15 in extra-attrs.forPost at line 10. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46042279479609adfc6d351af0090a107cdef73120aafb3d4906ace022bf6a1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/sodo-search/src/search-index.js: apps/sodo-search/src/search-index.js changed 3 times in last 90 days, max cyclomatic complexity 20 in search-index.isCJK at line 14. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/sodo-search/src/search-index.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/sodo-search/src/search-index.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"918cffb1c99146351649d644cd1f4312a91922dc31a7399ed66710e7244c7f62"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/has.js: ghost/core/core/frontend/helpers/has.js changed 3 times in last 90 days, max cyclomatic complexity 20 in has.has at line 129. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/has.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/has.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b794df174f1ae2108143fedd0150424d3b480a14ffe67bdb38d7d96aa77bd1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/services/rendering/renderer.js: ghost/core/core/frontend/services/rendering/renderer.js changed 4 times in last 90 days, max cyclomatic complexity 15 in renderer.renderer at line 17. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/services/rendering/renderer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/rendering/renderer.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"c75bbc0004457a00a009f99e8d2c8cac6faabaedc30dff4ea9a010f7f337ab78"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/manage-view-popover.tsx: apps/admin/src/members/components/manage-view-popover.tsx changed 3 times in last 90 days, max cyclomatic complexity 20 in manage-view-popover.ManageViewPopoverContent at line 21. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/manage-view-popover.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":"apps/admin/src/members/components/manage-view-popover.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"22815973044c8f96504ecce50dedab790c180b08a12758091754eb8dac17e76e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/utils/errors.js: apps/portal/src/utils/errors.js changed 4 times in last 90 days, max cyclomatic complexity 15 in errors.chooseBestErrorMessage at line 83. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/utils/errors.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/utils/errors.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5d6b729b576c1242d35f23d447f7e4bf67e03cec00cbc1272ef8776bbfeb13"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/services/routing/controllers/unsubscribe.js: ghost/core/core/frontend/services/routing/controllers/unsubscribe.js changed 4 times in last 90 days, max cyclomatic complexity 15 in unsubscribe.unsubscribeController at line 10. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/services/routing/controllers/unsubscribe.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/routing/controllers/unsubscribe.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af8655f2a2c16817a60e05dbf9ac6528a738b62c981b80b0f2ce619b628a638"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: e2e/helpers/playwright/fixture.ts: e2e/helpers/playwright/fixture.ts changed 4 times in last 90 days, max cyclomatic complexity 15 in _testEnvironmentContext at line 342. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- e2e/helpers/playwright/fixture.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/helpers/playwright/fixture.ts"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a95a702ebb340685c5fc465e3c50461b9f47f1a3d3cde326dba07328bc04319"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/email-address/email-address-service.ts: ghost/core/core/server/services/email-address/email-address-service.ts changed 3 times in last 90 days, max cyclomatic complexity 20 in EmailAddressService.getAddress at line 104. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/email-address/email-address-service.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-address/email-address-service.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d1d12e380b6efdb713b8eda206aec1c0c84942d9bf50c253feecb9b60792f7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/import-export/import/stripe-utils.js: ghost/core/core/server/services/members/import-export/import/stripe-utils.js changed 4 times in last 90 days, max cyclomatic complexity 15 in forceStripeSubscriptionToProduct at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/import-export/import/stripe-utils.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/import-export/import/stripe-utils.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"116768d6d27c5d7bf988b9924af852089c98353a900c750cc76c7d087e786f2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/analytics/utils/url-helpers.ts: apps/admin/src/analytics/utils/url-helpers.ts changed 4 times in last 90 days, max cyclomatic complexity 15 in url-helpers.generateTitleFromPath at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/analytics/utils/url-helpers.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/utils/url-helpers.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e87b9445c732ca5cf32494d9e02a9c6e31ab503a8c79edb6b93639706bf8cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/services/llms/markdown.js: ghost/core/core/frontend/services/llms/markdown.js changed 3 times in last 90 days, max cyclomatic complexity 20 in markdown.renderEntryMarkdown 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/services/llms/markdown.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/services/llms/markdown.js"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"54cf222d0570792f6ea242b578b80b4bb5b7834f8c399ac274ecea3847b35958"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/api/endpoints/utils/serializers/output/utils/clean.js: ghost/core/core/server/api/endpoints/utils/serializers/output/utils/clean.js changed 2 times in last 90 days, max cyclomatic complexity 29 in clean.post 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/api/endpoints/utils/serializers/output/utils/clean.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/utils/serializers/output/utils/clean.js"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6349bbfec689307909ad78cafab2c7e2ac88bc6dc1729afb2c9560a56dba9c8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/permissions/can-this.js: ghost/core/core/server/services/permissions/can-this.js changed 3 times in last 90 days, max cyclomatic complexity 19 in CanThisResult.buildObjectTypeHandlers at line 17. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/permissions/can-this.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/permissions/can-this.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a7d7b7b16bb4a25a6e671e3959e4065c62efabbc77478187dd0048d08fc80c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/shared/member-custom-fields/custom-field-picker.tsx: apps/admin/src/shared/member-custom-fields/custom-field-picker.tsx changed 3 times in last 90 days, max cyclomatic complexity 19 in custom-field-picker.CreateFieldInline at line 215. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/shared/member-custom-fields/custom-field-picker.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/shared/member-custom-fields/custom-field-picker.tsx"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d87cb11a79845d0855bcb62e8bc373248c18542209a1e8e038f980f73d18442"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/hooks/use-form.ts: apps/admin-x-framework/src/hooks/use-form.ts changed 3 times in last 90 days, max cyclomatic complexity 19 in use-form.useForm at line 51. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/hooks/use-form.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/hooks/use-form.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be8aa055000d595bbe4bf5a36c3ea4a261aa90acc68ace4b9a0f0e71656498c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/seeders/data-generator.js: ghost/core/core/server/data/seeders/data-generator.js changed 3 times in last 90 days, max cyclomatic complexity 19 in DataGenerator.#run 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/seeders/data-generator.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/seeders/data-generator.js"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33f528c2e23cd59d0c708a7d6c641303815687bf4ff25954c5b41485806cf5d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/common/products-section.jsx: apps/portal/src/components/common/products-section.jsx changed 3 times in last 90 days, max cyclomatic complexity 18 in products-section.FreeProductCard at line 688. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/common/products-section.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/products-section.jsx"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b2c860ef30f1ea6d165624faf230aeabb3e3fca03a0bb832dc5fa844abe1102"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/body_class.js: ghost/core/core/frontend/helpers/body_class.js changed 2 times in last 90 days, max cyclomatic complexity 27 in body_class.body_class 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/body_class.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/body_class.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c26c64d1f0e8e226b852af410bf66bfb99d475503423130253c9ae7d97a16e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/web/middleware/handle-image-sizes.js: ghost/core/core/frontend/web/middleware/handle-image-sizes.js changed 2 times in last 90 days, max cyclomatic complexity 27 in handle-image-sizes.handleImageSizes at line 16. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/web/middleware/handle-image-sizes.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/web/middleware/handle-image-sizes.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1fbd66b2e8437cda2da166a7b92c308b4e99de1c434daf336586184d0d5dcf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx: apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx changed 2 times in last 90 days, max cyclomatic complexity 26 in bluesky-sharing.BlueskySharing 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/preferences/components/bluesky-sharing.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":"apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff277f75224499f4455c1af970d420b1196d09acb7bba3b74b5eed9bef6599cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/comments-ui/src/components/content/forms/form.tsx: apps/comments-ui/src/components/content/forms/form.tsx changed 2 times in last 90 days, max cyclomatic complexity 26 in form.FormEditor at line 27. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/comments-ui/src/components/content/forms/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":"apps/comments-ui/src/components/content/forms/form.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"47768e249767756012a0ac3f18bfb643c4d3dca05d4c4fcf830aaef16bc8c724"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/preferences/components/account-migration.tsx: apps/activitypub/src/views/preferences/components/account-migration.tsx changed 3 times in last 90 days, max cyclomatic complexity 17 in account-migration.AccountMigration at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/preferences/components/account-migration.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":"apps/activitypub/src/views/preferences/components/account-migration.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"26d3959a5fae600a8e7715ecc9fba5fd58ce0b7105b9a0f6d6012457073e910e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/settings/utils/search.tsx: apps/admin/src/settings/utils/search.tsx changed 3 times in last 90 days, max cyclomatic complexity 17 in search.useSearchService 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/settings/utils/search.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":"apps/admin/src/settings/utils/search.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8e46a92ccc38fadf6550090fd2a513a2cb6d0491fba51d43a6f6201df3911f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/data-attributes.js: apps/portal/src/data-attributes.js changed 2 times in last 90 days, max cyclomatic complexity 25 in data-attributes.handleDataAttributes at line 227. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/data-attributes.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/data-attributes.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d1eac86c8b4754f9c86e3d790601189c72a0db3fbc08506dca15d8d006e81d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/comments-ui/src/components/content/comment.tsx: apps/comments-ui/src/components/content/comment.tsx changed 3 times in last 90 days, max cyclomatic complexity 16 in comment.PublishedComment at line 145. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/comments-ui/src/components/content/comment.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":"apps/comments-ui/src/components/content/comment.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b23c079d5900cbc6e27df23d78a55d21022806144d0eef305279a59f06d93e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/hooks/use-pintura-editor.ts: apps/admin/src/hooks/use-pintura-editor.ts changed 2 times in last 90 days, max cyclomatic complexity 23 in use-pintura-editor.usePinturaEditor at line 11. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/hooks/use-pintura-editor.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/hooks/use-pintura-editor.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab8ccfaacebd3a0907e6b58feec4bfa9444bd5f5e3b6076b2b53648eb52c4bdd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/share/share-modal.jsx: apps/portal/src/components/pages/share/share-modal.jsx changed 2 times in last 90 days, max cyclomatic complexity 23 in share-modal.ShareModal at line 16. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/share/share-modal.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/share/share-modal.jsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"53fc3d79abab3b62acb1c64b2be6546105b01f1789a21ba8081787fd671f9385"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/common/newsletter-management.jsx: apps/portal/src/components/common/newsletter-management.jsx changed 3 times in last 90 days, max cyclomatic complexity 15 in newsletter-management.NewsletterManagement at line 257. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/common/newsletter-management.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/common/newsletter-management.jsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c63c167e0ed9553752c81c3d34947890482828aab6284561def737ae2c738a3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/label-picker/edit-row.tsx: apps/admin/src/members/label-picker/edit-row.tsx changed 3 times in last 90 days, max cyclomatic complexity 15 in edit-row.EditRow at line 15. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/label-picker/edit-row.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":"apps/admin/src/members/label-picker/edit-row.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea8cb53863ba7f1e3fdbf7b31a745d871a42a8ae2190f8b80527b306ab31c8e9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/onboarding/onboarding-route.tsx: apps/admin/src/onboarding/onboarding-route.tsx changed 3 times in last 90 days, max cyclomatic complexity 15 in onboarding-route.OnboardingRoute at line 14. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/onboarding/onboarding-route.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":"apps/admin/src/onboarding/onboarding-route.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e1d5f4d65d00b7d90140795864ae747a039ce5169306c2a61a42836f90770e5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/mirage/config/members.js: apps/ember-admin/mirage/config/members.js changed 2 times in last 90 days, max cyclomatic complexity 22 in members.mockMembers at line 75. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/mirage/config/members.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/mirage/config/members.js"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"14568a72c8ddb3e5bd8f0706f53ade443bc8cc4c8b7a31149fbaae3454819f31"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/newsletters/newsletters-service.js: ghost/core/core/server/services/newsletters/newsletters-service.js changed 2 times in last 90 days, max cyclomatic complexity 22 in NewslettersService.prepAttrsForEmailVerification at line 289. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/newsletters/newsletters-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/newsletters/newsletters-service.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"29b3387472516a38a188ba856050cd1ea7284298a47706064ffa093004e3f36e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/views/preferences/components/moderation.tsx: apps/activitypub/src/views/preferences/components/moderation.tsx changed 2 times in last 90 days, max cyclomatic complexity 22 in moderation.Moderation at line 41. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/views/preferences/components/moderation.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":"apps/activitypub/src/views/preferences/components/moderation.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec00998344bd60fa9e9c893a54d2c570ff3fe9b257f9059aa2544c4373237b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/machine-payments/adapters/mpp-adapter.ts: ghost/core/core/server/services/machine-payments/adapters/mpp-adapter.ts changed 2 times in last 90 days, max cyclomatic complexity 22 in MppAdapter.#run at line 141. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/machine-payments/adapters/mpp-adapter.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/machine-payments/adapters/mpp-adapter.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5def6dc16e2e62791372ea0f56f3ccb96ad2d04048e343417368d03bf090795"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/gift/form-state.ts: apps/portal/src/components/pages/gift/form-state.ts changed 2 times in last 90 days, max cyclomatic complexity 21 in form-state.parseGiftFormState 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/gift/form-state.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift/form-state.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"8414f5376b95b25982d5e41de8c9878107df5733b379b712d22d551bbb65e82e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/recommendations-page.jsx: apps/portal/src/components/pages/recommendations-page.jsx changed 2 times in last 90 days, max cyclomatic complexity 21 in recommendations-page.RecommendationItem at line 195. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/recommendations-page.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/recommendations-page.jsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"68b987068425c2443c15f447fab5063c29bbcbf7ca632547e97851e4208a96d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js: ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js changed 2 times in last 90 days, max cyclomatic complexity 20 in DockerAnalyticsManager.generateSession at line 555. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"c273bcec30d495fa53c973a395fa05fc35b532af38e2d699b97b66ccfbf0314c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/mentions/mentions-api.js: ghost/core/core/server/services/mentions/mentions-api.js changed 2 times in last 90 days, max cyclomatic complexity 20 in #updateWebmention 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/mentions/mentions-api.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/mentions/mentions-api.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc9657ec899726f1e577414a284b431c8318a498aa4687229ef585556d901d7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/content-import/import/media.ts: ghost/core/core/server/services/content-import/import/media.ts changed 2 times in last 90 days, max cyclomatic complexity 20 in PostMediaInliner.inlineLexicalChildren at line 195. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/content-import/import/media.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/content-import/import/media.ts"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"22e6d2425e21a1fca862d711484d365c48158f2a94399e8c9fe80d2ab70b8cdc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts: apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts changed 2 times in last 90 days, max cyclomatic complexity 20 in use-koenig-file-upload.useKoenigFileUpload at line 94. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/hooks/use-koenig-file-upload.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9c58f2ba9b45f6160bb390a801850d5d3a9f49b4a18c2dd38712bb16fd4685"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/publish/components/complete-step.tsx: apps/admin/src/editor/publish/components/complete-step.tsx changed 2 times in last 90 days, max cyclomatic complexity 20 in complete-step.CompleteStep at line 62. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/publish/components/complete-step.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":"apps/admin/src/editor/publish/components/complete-step.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b5b9b6c41bcf01cadd6279dc80f80fca6113517f3a250f12379752a898a460"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/components/feed/feed-item-stats.tsx: apps/activitypub/src/components/feed/feed-item-stats.tsx changed 2 times in last 90 days, max cyclomatic complexity 20 in feed-item-stats.FeedItemStats at line 28. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/components/feed/feed-item-stats.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":"apps/activitypub/src/components/feed/feed-item-stats.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ea344a8134381c748b1dd8707b1c17325f2d5445d0b3877d9114bc98c3cece"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/automations/components/email-modal/sender-details.ts: apps/admin/src/automations/components/email-modal/sender-details.ts changed 2 times in last 90 days, max cyclomatic complexity 20 in sender-details.resolveEmailSenderDetails at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/automations/components/email-modal/sender-details.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/email-modal/sender-details.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"29d0ae5b1e92aaf815e71bdc619c3c503a14cc3a9eec09e9ab1153caa89b87d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/comments-ui/src/components/content/forms/main-form.tsx: apps/comments-ui/src/components/content/forms/main-form.tsx changed 2 times in last 90 days, max cyclomatic complexity 20 in main-form.MainForm at line 11. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/comments-ui/src/components/content/forms/main-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":"apps/comments-ui/src/components/content/forms/main-form.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8756be8dec423ebeb62635958e34aebb6030231bfb49d21120d3ebe6dfb773d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/gift/plan-step.tsx: apps/portal/src/components/pages/gift/plan-step.tsx changed 2 times in last 90 days, max cyclomatic complexity 19 in plan-step.GiftPlanStep at line 74. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/gift/plan-step.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":"apps/portal/src/components/pages/gift/plan-step.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3f47b1ed34ae2bcea971f2cfd11f57e5b99cad437ee9e5cef22badc81313901"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/member-attribution/referrer-translator.js: ghost/core/core/server/services/member-attribution/referrer-translator.js changed 2 times in last 90 days, max cyclomatic complexity 18 in ReferrerTranslator.getReferrerDetails at line 38. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/member-attribution/referrer-translator.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/member-attribution/referrer-translator.js"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d64f25c3ec64d73ee7be638deefb9ce85bffaeac864d5cea8b5d5a784b3c78"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/shared/settings-cache/cache-manager.js: ghost/core/core/shared/settings-cache/cache-manager.js changed 2 times in last 90 days, max cyclomatic complexity 18 in CacheManager._doGet at line 121. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/shared/settings-cache/cache-manager.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/shared/settings-cache/cache-manager.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"758762452e4c73e68051e7beab30ac24a03138dfe253d9506ff2058e4148d176"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/test/utils/stripe-mocker.js: ghost/core/test/utils/stripe-mocker.js changed 2 times in last 90 days, max cyclomatic complexity 18 in #postData at line 252. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/test/utils/stripe-mocker.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/utils/stripe-mocker.js"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"b22e026566d022a46c017c4221c031dfe2a63ab913f01f32c4bd95620b24199c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/newsletter-filter-fields.ts: apps/admin/src/members/newsletter-filter-fields.ts changed 2 times in last 90 days, max cyclomatic complexity 18 in newsletter-filter-fields.newsletterAddressing at line 54. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/newsletter-filter-fields.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/newsletter-filter-fields.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03e71013f561aa48bf215bfa6e80adba0260fc301bced2efc72df8885eebce4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/pagination.js: ghost/core/core/frontend/helpers/pagination.js changed 2 times in last 90 days, max cyclomatic complexity 18 in pagination.pagination at line 20. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/pagination.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/pagination.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"5106ec21f9b14291e43d8be7bafd3ea97f3b17ff9d432be2884347e551100cd2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/activitypub/src/components/global/ap-avatar.tsx: apps/activitypub/src/components/global/ap-avatar.tsx changed 2 times in last 90 days, max cyclomatic complexity 18 in ap-avatar.APAvatar at line 83. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/activitypub/src/components/global/ap-avatar.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":"apps/activitypub/src/components/global/ap-avatar.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"207e6f8e04c4ccf6c4fb30b918459e5080da925361ff7fd241488fe3866d247b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/detail/member-add-comp-modal.tsx: apps/admin/src/members/detail/member-add-comp-modal.tsx changed 2 times in last 90 days, max cyclomatic complexity 18 in member-add-comp-modal.MemberAddCompModal at line 47. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/detail/member-add-comp-modal.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":"apps/admin/src/members/detail/member-add-comp-modal.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9be3427671aba372cd73881cc90cd967f415b6c839b60ef65b2fc72384351f7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/meta/og-image.js: ghost/core/core/frontend/meta/og-image.js changed 2 times in last 90 days, max cyclomatic complexity 18 in og-image.getOgImage at line 6. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/meta/og-image.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/og-image.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0a700a684937253d3f0e292b522a1220340fce12f43b4a0452bd235002b031c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/meta/twitter-image.js: ghost/core/core/frontend/meta/twitter-image.js changed 2 times in last 90 days, max cyclomatic complexity 18 in twitter-image.getTwitterImage at line 6. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/meta/twitter-image.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/twitter-image.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e44c0c8631919c33a2f2ba43fbee5ce4b4e811f084c4d2cf75644931556896"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/components/gh-koenig-editor-lexical.js: apps/ember-admin/app/components/gh-koenig-editor-lexical.js changed 2 times in last 90 days, max cyclomatic complexity 17 in GhKoenigEditorLexical.onTitleKeydown 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/components/gh-koenig-editor-lexical.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-koenig-editor-lexical.js"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a87dfb138b75f8b84f5494f2f436e5894d71d751f47f06009a5b24b73f9f795"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/services/ajax.js: apps/ember-admin/app/services/ajax.js changed 2 times in last 90 days, max cyclomatic complexity 17 in ajaxService._makeRequest at line 253. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/services/ajax.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/ajax.js"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ce19c0371ed083ddc2e3a6a747a28f969132615b799fef9ba99d5b39a84eb7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: packages/api-framework/lib/http.js: packages/api-framework/lib/http.js changed 2 times in last 90 days, max cyclomatic complexity 17 in http.http at line 16. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- packages/api-framework/lib/http.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/api-framework/lib/http.js"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"e27ad5b7b542f0a32aff5b080471923149d8b66632ae96f8f0ec2a8d87357eac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/comments-ui/src/components/content/content.tsx: apps/comments-ui/src/components/content/content.tsx changed 2 times in last 90 days, max cyclomatic complexity 17 in content.Content at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/comments-ui/src/components/content/content.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":"apps/comments-ui/src/components/content/content.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"140f3ee44b64614fa830351b4f81487a1e64050b2afd4f6ccd5e5cf187a10e3d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/post_class.js: ghost/core/core/frontend/helpers/post_class.js changed 2 times in last 90 days, max cyclomatic complexity 17 in post_class.post_class at line 9. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/post_class.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/post_class.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6f6655231af7f6c42a1a9210de1fb6635731730657b523d502f13b7d5a6e399"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/web/api/endpoints/admin/middleware.js: ghost/core/core/server/web/api/endpoints/admin/middleware.js changed 2 times in last 90 days, max cyclomatic complexity 17 in middleware.tokenPermissionCheck at line 17. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/web/api/endpoints/admin/middleware.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/web/api/endpoints/admin/middleware.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f3c73fb118ed69d1f7508f1ce8370cded409f13a7cb87c94eeb43959e8f964a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/ember-admin/app/services/notifications.js: apps/ember-admin/app/services/notifications.js changed 2 times in last 90 days, max cyclomatic complexity 16 in NotificationsService._showAPIError at line 168. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/ember-admin/app/services/notifications.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/notifications.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8852fadbefb439cd2b5e0d1f5ecd58019ba0112ec3374ac4bd344b3a2f33b9c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/meta/structured-data.js: ghost/core/core/frontend/meta/structured-data.js changed 2 times in last 90 days, max cyclomatic complexity 16 in structured-data.getStructuredData at line 3. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/meta/structured-data.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/structured-data.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"732e4c340c00dfd6cb0230b47e03460f32cd72b98857e69066c998ec8648e5e6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/data/importer/importers/data/products-importer.js: ghost/core/core/server/data/importer/importers/data/products-importer.js changed 2 times in last 90 days, max cyclomatic complexity 16 in ProductsImporter.populatePriceData at line 33. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/data/importer/importers/data/products-importer.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/products-importer.js"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"dadd227223be45c14171d1b4812af5e711ccd907f57e06afcbbe05685f76d4f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/members/members-api/utils/get-discount-window.ts: ghost/core/core/server/services/members/members-api/utils/get-discount-window.ts changed 2 times in last 90 days, max cyclomatic complexity 16 in get-discount-window.getDiscountWindow at line 71. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/members/members-api/utils/get-discount-window.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/utils/get-discount-window.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"33b677f659d40540f6c45e5f7cae93cd232eb0bfe3262299a885f76ab8bbfd23"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/label-picker/label-filter-renderer.tsx: apps/admin/src/members/label-picker/label-filter-renderer.tsx changed 2 times in last 90 days, max cyclomatic complexity 16 in label-filter-renderer.LabelFilterRenderer 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/label-picker/label-filter-renderer.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":"apps/admin/src/members/label-picker/label-filter-renderer.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea6b9c46b182932df220598e5829348e1917d819b5698127dfc67d882703234"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/tags/detail/tag-detail-edit.ts: apps/admin/src/tags/detail/tag-detail-edit.ts changed 2 times in last 90 days, max cyclomatic complexity 16 in tag-detail-edit.buildTagSavePayload at line 193. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/tags/detail/tag-detail-edit.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/detail/tag-detail-edit.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d552906080842df30c0974ec468ff3a3e17bd365ea79a024db0949cc2f8420b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/portal/src/components/pages/account-email-page.jsx: apps/portal/src/components/pages/account-email-page.jsx changed 2 times in last 90 days, max cyclomatic complexity 16 in account-email-page.AccountEmailPage at line 8. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/portal/src/components/pages/account-email-page.jsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/account-email-page.jsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"25c839596476962a93d57c63ba269d9a7e513fc8530f77a9022aa9f826c31ca3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/frontend/helpers/tags.js: ghost/core/core/frontend/helpers/tags.js changed 2 times in last 90 days, max cyclomatic complexity 16 in tags.tags at line 14. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/frontend/helpers/tags.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/helpers/tags.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"64625f5a4534f78817bb1ae196c325118aa0ce90259ec4202fa139023e0f089e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: ghost/core/core/server/services/milestones/milestones-service.js: ghost/core/core/server/services/milestones/milestones-service.js changed 2 times in last 90 days, max cyclomatic complexity 15 in #runARRQueries at line 197. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- ghost/core/core/server/services/milestones/milestones-service.js\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/milestones/milestones-service.js"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc34c82dd20289b6e70fc268831fa9bfcfb4285bf3396f243d16d5d318625a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/posts/list/components/manage-post-view-popover.tsx: apps/admin/src/posts/list/components/manage-post-view-popover.tsx changed 2 times in last 90 days, max cyclomatic complexity 15 in manage-post-view-popover.PopoverBody 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/posts/list/components/manage-post-view-popover.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":"apps/admin/src/posts/list/components/manage-post-view-popover.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfc9eb0aa6dd2c3e5225f04c21d396b33fc92837a6aca13418659f82a88b3d86"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/editor/date-time-picker.tsx: apps/admin/src/editor/date-time-picker.tsx changed 2 times in last 90 days, max cyclomatic complexity 15 in date-time-picker.DateTimePicker at line 41. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/editor/date-time-picker.tsx\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/date-time-picker.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"b71807dd7e9af1741ff56c1f50c717e87d13e99601937b25ce6f96cab2f080f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin-x-framework/src/utils/currency.ts: apps/admin-x-framework/src/utils/currency.ts changed 2 times in last 90 days, max cyclomatic complexity 15 in currency.minimumAmountForCurrency 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin-x-framework/src/utils/currency.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/utils/currency.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"5956ea9bcdb1055050cefe3725c373ce76033bec22da795e87b9242c3d7ec7a4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: apps/admin/src/members/components/bulk-action-modals/import-members/reducer.ts: apps/admin/src/members/components/bulk-action-modals/import-members/reducer.ts changed 2 times in last 90 days, max cyclomatic complexity 15 in reducer.importReducer 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-06-27..2026-09-25, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-27 12:14:05 \u002B02:00\u0027 --until=\u00272026-09-25 12:14:05 \u002B02:00\u0027 --full-history --no-merges -- apps/admin/src/members/components/bulk-action-modals/import-members/reducer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/reducer.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b93189dae5cc28717c6056100ec4599cd3029a49247ab0119547ec47aeb391f"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 27 significant file(s) lose their only recent owner: apps/admin-x-framework/src/utils/source-utils.ts, apps/shade/src/components/patterns/settings-modal.tsx, apps/admin/src/shared/analytics/chart-helpers.ts, apps/admin/src/settings/settings.screen.ts, apps/admin-x-framework/src/utils/currency.ts, apps/ember-admin/app/services/post-analytics.js, apps/admin/src/hooks/use-unsaved-changes-guard.ts, apps/shade/src/components/ui/code-editor-view.tsx (\u002B19 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e9e79c0cc53cd159d440b7ac4f251a874bbfd68135a9d607cbf9f517dcbf196c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 20 significant file(s) lose their only recent owner: apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx, ghost/core/core/server/services/members-metafields/definitions-service.ts, ghost/core/core/server/services/members-metafields/values-service.ts, ghost/core/core/server/services/members/import-export/export/exporter.ts, packages/metafield-types/src/index.ts, ghost/core/core/server/services/members/import-export/import/email-template.ts, apps/admin/src/members/detail/member-subscriptions-section.tsx, ghost/core/core/server/services/members-metafields/schema.ts (\u002B12 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dfe0e289e190c25bd5d9a023ed60556b673a5b2a98a5d0a72155f901eca91d69"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 16 significant file(s) lose their only recent owner: apps/shade/src/components/patterns/page-header.tsx, apps/shade/src/components/ui/command.stories.tsx, apps/shade/src/components/page-templates/list-page.stories.tsx, apps/shade/src/components/patterns/page-header.stories.tsx, apps/shade/src/components/ui/button.stories.tsx, apps/shade/src/components/ui/select.stories.tsx, apps/shade/src/components/patterns/gh-chart.tsx, apps/shade/src/components/ui/tooltip.stories.tsx (\u002B8 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f5c13e2a2b744160807a1068c953bdeeb19c5caf81122f3daa966108e9c68b82"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 12 significant file(s) lose their only recent owner: apps/portal/src/components/pages/gift-page.styles.js, ghost/core/core/server/services/gifts/gift-delivery-service.ts, koenig/kg-converters/src/lexical-to-mobiledoc.ts, apps/comments-ui/src/components/content/hooks/use-comment-navigation.ts, ghost/core/core/server/adapters/scheduling/signed-flush-scheduler.ts, apps/ember-admin/app/components/gh-members-recipient-select.js, ghost/core/core/server/services/gifts/gift-checkout-offer.ts, koenig/kg-card-factory/src/CardFactory.ts (\u002B4 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"22b109218328d30b07ddbf1bb7241a0b4b4ebd6ee95078bc99e5c07b2456eb51"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #5: If anonymized user #5 becomes unavailable, 8 significant file(s) lose their only recent owner: ghost/core/core/server/services/content-import/import/importer.ts, ghost/core/core/server/services/content-import/import/post-data.ts, ghost/core/core/server/services/content-import/import/row.ts, apps/admin/src/settings/advanced/migration-tools/content-import/mapping.ts, apps/ember-admin/app/services/migrate.js, ghost/core/core/server/services/content-import/import/store.ts, ghost/core/core/server/services/content-import/csv/parse.ts, apps/ember-admin/app/components/gh-migrate-iframe.js. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"27db0ec1015489ae982a9b49d81d3825dd4e5d91c6ef3670f3b2e033169d3fb0"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #6: If anonymized user #6 becomes unavailable, 7 significant file(s) lose their only recent owner: apps/admin-x-framework/src/api/automations.ts, apps/admin/src/automations/components/canvas/email-performance-section.tsx, ghost/core/core/server/services/email-analytics/newsletter-email-analytics-batch-processor.js, ghost/core/core/server/services/automations/welcome-email-automation-poll.ts, ghost/core/core/server/data/schema/validator.ts, ghost/core/core/frontend/services/helpers/register-ghost-helpers.js, ghost/core/core/server/services/offers/application/offer-mapper.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6b4071ad6948dc105a6c6b5851ac166a565ff91a22e47e3fefed606a224eb445"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #7: If anonymized user #7 becomes unavailable, 5 significant file(s) lose their only recent owner: ghost/core/scripts/prune.mts, ghost/core/core/server/services/adapter-manager/adapter-manager.ts, .pnpmfile.mjs, ghost/core/core/shared/config/secrets.ts, packages/adapters/sso-base/src/base.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"680e5c1201d5f110c94e8b4070f83be6ee8adf50e4768ea5d27b5f81ed6f8a3b"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #8: If anonymized user #8 becomes unavailable, 3 significant file(s) lose their only recent owner: ghost/core/core/server/services/route-settings/route-settings-parser.ts, ghost/core/core/frontend/services/routing/api-adapter.ts, ghost/core/core/server/services/route-settings/dynamic-routing-service.js. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"71157c113a2d16a25a7a2bc2ab0d36aebdfe9147dff2caecf9e2503590aa2fe1"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #9: If anonymized user #9 becomes unavailable, 3 significant file(s) lose their only recent owner: apps/portal/src/utils/use-card-tilt.js, ghost/core/core/frontend/helpers/price.js, apps/activitypub/src/utils/screenshot.ts. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f1b756522eed94d8e06900974b912124a1650f719ad1831ffd4461d9497eae95"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 7 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 (115 single-owned of 1508 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; 1508 of the 3944 production source files in this repository met that bar). They are anonymized user #10 (4 file(s)), anonymized user #11 (3 file(s)), anonymized user #12 (2 file(s)), anonymized user #13 (2 file(s)), anonymized user #14 (1 file(s)), anonymized user #15 (1 file(s)) (\u002B1 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":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Ping sentry? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/api/activitypub.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6b16af049a37719fff73d1cee2496ff081fbd60edd0563602c19e313326701a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement dismiss functionality \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/components/suggested-profiles.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"76acf2bb5cfccb2600a6fb5c66845925acf037b96e561c602050b487a8a9946b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add metadata to the post fixture \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/test/acceptance/inbox.test.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"95ce583e75e851d5018447caa5785d1d8634a02a6aae775a8981c612db5ad30a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: The server returns geolocation as a JSON-encoded string (not a parsed object). \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin-x-framework/src/api/members.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5dcfd5b5a59bdd28ce41745be45814e3352582f0922256787a11ed7332df171"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove this when @tryghost/nql is updated \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/vite.shared.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e03c9f7500c9b9b65b905dbed4fb01635067cd0adda295337369e29f952776"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add click_rate to PostStats interface if needed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/hooks/use-latest-post-stats.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f361fb68dd1263e113b3baad5f385111c74e7f8ab25c6a24f5e670fae402bf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove this file after the comment filters migration has safely rolled out. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/legacy-comment-filter-query.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f845163c69aed19d03c72f27ce337f5ae05d2e27e27a0440696fbd41b28779bf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove forwardRef once we have upgraded to React 19 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/components/comments-list.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"baa054f269592f8ff92aeb3862c2e06b00d08c5d6e9c28103cffaa22737b3819"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove forwardRef once we have upgraded to React 19 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/tags/components/tags-list.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3d2c65541fc8759afb3d7e9755346cf0f7c40ab0f8e6aafb4278be138eee45"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove count.replies fallback once backend is fully rolled out \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/comments/components/comment-thread-list.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"03c5d9d0d70f8b86a8a79efe9b72cf582de04d165860726075373fe318dc639a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: pagination \u2014 \u0060useBrowseNewsletters\u0060 is an infinite query but this field \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/detail/member-newsletters-field.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"d682ec67ce524386999e1b7f78aebdcc2d9c98d1d7f6ee4df28369a7332f95a4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: log error message on Sentry \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/hooks/use-pintura-editor.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"d46b81c6a199c2b66d3c2af50060868cf6599ad953712ce9b2c33ec2c3902dd8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: figure out what this type should be? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/popup-box.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"388260b1bd536803c7382586a703e7ca25d404c7b1cb5012a0d9eda47191b07d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: replace with dynamic data from script \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/utils/options.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e09965e9aba24d1d8380232e5f6dbea9731d8be15c8e4a38758185d58792607"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This does not currently handle the case where the element is outOfViewport for both top\u0026bottom or left\u0026right \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/utils/hooks.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"518102f7104db5542c11487339b7bbfc21441dace6d17221bb93d42ebb7da369"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Ideally we should find a way to get rid of this. This is currently needed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/helpers/pages/public/public-page.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"58384d1492e7105efb53b445476440392e83a43ec35e1bd263cec937e1e11bcb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Replace this with a 404 page object \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/tests/post-factory.test.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a27f8f5ef7f9aec4dcbcb61a09960d21be46aec736390ec805d72082b06cc5d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: REMOVE TEST \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/tests/public/stripe-offer-checkout.test.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c411980e96278146d4878d0c895aa52e2d35ab72a61de312ef1bef3d67fafa21"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: REMOVE TEST \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"e2e/tests/public/stripe-donation-checkout.test.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b3a53f83b6f143ea376af957f4cdcef4fef3a5a8e070cc80904570243afa5c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: fix this typing once @tryghost/request has types \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/adapters/scheduling/scheduling-default.ts"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eec0f26269de69e5573e228c76a66af521298ff1aac0606a8a0d9fce4984f95"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: replace with dependency injection once the sentry module is TS \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/adapters/scheduling/error-capture.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f688f0e23c0f66600097f3fa2975f07b0e63a1a7f1fbfd72f171342a224667"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check if mandatory values should be enforced \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/schema/validator.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"49fd9cf80f2a480b7c457af349ca75c889422cdf19468614daaca30bd30364ba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: potentially deprecate/remove as part of Ghost 7.0 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/adapter-manager/adapter-paths.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e816150e53387a2268bdd7f2a68941be01a7825049746008353e63f1c0e1cdb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: come up with a cleaner way to merge these without churning through Array and Set \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-analytics/event-processing-result.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1b246431f12f98ce19e96b8cd98299566c84850c38eae283d26416001e9e7e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: refactor post.published events to never fire on importing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/slack-ping/slack-ping-service.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b3dceb94f2a0737cdc40cf3ac44d0b9fbf86dcc272ff2e0e290de297fab046"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: simulate DNS resolution failures if possible \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/test/unit/server/services/recommendations/service/recommendation-metadata-service.test.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f48acf6fdbf2a387980fe32711d0532e44df1ece165442b55e4d2f8df96b8b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Feels a little too explicit as it will need updating every time we add a new card. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-converters/src/lexical-to-mobiledoc.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5caf16cf7eb602940f90227ab1a8deb7ec9e8c8c9fcb362747954ddecbf8d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: proper email rendering \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/test/cards/callout.test.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0cff2e03a2858b93d79904ebbdd2f5b8b95a709fd74c505a9cc87703b97553c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: can we handle this elsewhere/more generically? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-transforms/src/transforms/denest.ts"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cdb3b72616cb8ba754644eb64a36143e0e955ba669a71fa244bdee1c47a3bd9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // The goal of the test below (TODO) is to make sure that new keys get added to context.json with \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/i18n/test/i18n.test.ts"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cd3e5f36790d15c39f9b76f61e71ac4803c5c9a84a3d481a35e16dc3956815a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: allowlist type of limits doesn\u0027t have \u0022checkIsOverLimit\u0022 implemented yet! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/limit-service/test/limit-service.test.ts"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bbcdee155f3b54cca95c7da7a79e4e1260ff47f6a04d9767951b9d80c37a816"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: allowlist type of limits doesn\u0027t have \u0022checkIsOverLimit\u0022 implemented yet! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/limit-service/test/limit-service.test.ts"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"000f42e763f91b9362184311b1ddc6a6e9acfee3bb950a0ba35374d22cab9437"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The top-level README is mostly branding (Ghost.org links) plus a bare \u0027Quickstart install\u0027 section, offering no description of what the project does or its main value proposition. State the purpose and scope of the monorepo: self-hosting themes, API usage, end-to-end testing, editor support, and shared packages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dbf18d06aa983c06246108610908ba99aae6784280b3aacd1a6655733d71be"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no installation or build instructions: The README has no install/build/run commands for the top-level repo. Add a one-line \u0027npm install\u0027 or \u0027yarn add\u0027 line plus bootstrap/pnpm dev steps, matching the scripts/README.md and the monorepo structure."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa6bfcd5c6ae231d1b8ee99bced50b832d1f61cde9da6cbb533467b879a57db"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: written for insiders: The internal workspace package golden path is referenced without context (what it represents or why it matters) inside the README, leaving a reader unable to tell whether this template package is truly private. Add a sentence explaining what the \u0060@tryghost/{{NAME}}\u0060 packages are and their standing in the monorepo."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/_template/README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d86db19a77484664eb25de6295a161427c4016c021fded438f90ce351c65bf7"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: written for insiders: The document names internal guards like \u0060ghost/core/test/unit/se\u0060, but no explanation of what they compare or why this checkout package is guarded. Add a sentence describing the two outside packages that the checkout package compares against and why it lives in its own guard."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/checkout/README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53f35598964b652e4708476e9a1677a62729088e5002986d804dd0bec74f166"}},{"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":"ce5dfad599485b7660446cefca05ecb66418ccf2370ec5b7526f467935ac9f38"},"properties":{"commitSha":"9339364dce6713b6e97cbdb97808b1718ff37d30"}},{"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":"58211df18bc32358e22e9c585dc37f45bf062dad27380e2d026d284caaebb3d5"},"properties":{"commitSha":"7e499573e5a7b52cbb46f983eb98054b2e3c3e39"}},{"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":"ffc3ce27c49f1d7ab5ffec9d9bb69364114664f5ac6b4ead53765ee91b2e04ae"},"properties":{"commitSha":"7833da83658c873c4b01984aa94da8f6a8353719"}},{"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":"e096cc747a5fc4cac38c38e8d0a685f3edcaa8523d4a049e6fa54eb0f226d09d"},"properties":{"commitSha":"fcd11fe47134c7a2278c2ec41652d644aa9b1c11"}},{"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":"04ff593253c650e6f028194242012788d7bfbc6a844246b879cb65d9a8bda066"},"properties":{"commitSha":"6dc2e7f3fe054eb57dd8ac229ca756c288d56c88"}},{"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":"40eacf4c9661dde5370cef87da9c1e9ecbd3e4c37321ed6a3eee0061349745e5"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"19f2b0f7f0fdbd4ec620a17b9b98906a0eed2dc29f5e89caafa9794981bd25c9"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"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":"ce6e85ed8ca3038c3cc2cd528e4447e006b7e49b329305b41855613a5b85d614"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"74fa994ad53e25f920226f4898b587ae84d719f9f4718ad67833362bb68b37f5"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"63ca2315be55edd0c8e94a38be3e47469c21a7ffe75c16228f77b003655e9663"},"taxa":[{"id":"CWE-346","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-940","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":"d7e6f52374bb3dbeac02a3c1338f9c3583c98be9dfeb79e4d0c4bfe36c2c9e09"},"taxa":[{"id":"CWE-79","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":"93fcdc339958b5ebe1fb83cc0390599594329b16efe7433b9412b49b627af96e"},"taxa":[{"id":"CWE-79","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":"9ceab6e4976f222a2fc7be0ceea0f2c5d7d8cdd6ff467e346017a3b9367c2144"},"taxa":[{"id":"CWE-79","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":"ca1f83321d928f62df88ac24c81e6ec3372eb836cd54cd40d2560753cf04f125"},"taxa":[{"id":"CWE-79","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":"d83063b185a8f4a037cf1ab67efab1dcbac6663db56e31aa2441345c31d63c1e"},"taxa":[{"id":"CWE-1188","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","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":"ad0cc6a1fdbeba08b9d91893c9f84fff686252f3842df370da67e081b090f5c0"},"taxa":[{"id":"CWE-1188","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","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":"85f99189d964cdde824a816d83f2290af0a3f7efe42feb1d6495743a90e33e22"},"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":"1498825690ee691422757d83c6c8726aaf69040fa62a3b6b71a03075f0880320"},"taxa":[{"id":"CWE-829","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":"8d4a0f1929f34b20b8bc2f8f7e48197ce3f563d331ee6b6e6fd51b8cfc75a0db"},"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":"b24403d6273229660acff2ece78b4565ffe82b3cd0aa4b5c79408de219f22ddc"},"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":"b6e2dabd30e79d446e95938d80a6cc117b58cb447ec2550533995701572a520f"},"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":"7748a29dba5c29d065c5a40027776b3b621d66997d98fa5d2f13d9632cbf90bb"},"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":"8de9baf2026554f2a2a83abc0e90195aeff9a6dd86078419bdb504bdb67bae47"},"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":"703f20c98fdd75397b6579772ef3c1c0f1651c2d39ac96372fdd070a98bb6364"},"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":"4ff16aca4309e6bf80647c2851e01d650155b3e26aa3e502c8117b7ddd47bb11"},"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":"52ccd486565aa56024a026d50fc1f2b7de3c36551050ca8ab35b2204edeca5c7"},"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":"d69a5c0de35a890968c602776c25fd4586799126457fc17ba8e1ce3ec1395937"},"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":"3f996d9c37a5e40cc4ed072fc7f844a43f54022d4cce24f8c6c928ec86ffeeae"},"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":"e8041eb5cfe02bbd70354bb74875fe13dd7715043302d086a243c52d0df9e93c"},"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":"55e1cdfd11d3e9f667a972f6b094263ec06bbdff632bc680395cf1c2e3e7cc60"},"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":"177c75f805a67a09d8818ce19f26614daf47db1838f8f5f6f57e9051d99c41ca"},"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":"279b66d8065dc294bf4eb00613787a214a6f4d246979933df770ee11ba4362ba"},"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":"0a678cc95bbe19350008436b3da19dc184c143096e463dbcad21da27844a0955"},"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":"2177ebfe67640eff374d273b665804c077b309b036312c56642564296ee64968"},"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":"844782264b364c3c2b8628e4760ee10a2c4829362939a80dc6f4fb1ea0759605"},"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":"dc8a01a0c49ba9727b65d69562429fe70a948c27a39f91f27be88d1e1a7eb5ba"},"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":"3712e0a023c7d61f21cbb3faf8d511b4c0438dbe08ea0929bf2cf177b17acf0c"},"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":"a356c50f0dd6cce854fc1da2e4c08a8c30b9197590c2458ce3422f7d5caa80fe"},"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":"3a402cc234d0625ffee35a0430a67c190b4f8f4cc2ea0327ed237e7755e5f1d8"},"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":"22966ca17e05b0a69a7149da0dce95b2030f945133a9ab660a936b45b591115a"},"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":"938263b5e3e8cd323827180801ebd1c5fd48cdf8077b16d16ff983d2bf8866c6"},"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":"a94c3a46d916a07049e7fc6c8d00c32894a94cec3b9c85156a5148ce14d15702"},"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":"471bc504d41ee96d32bf71e88a85f7ef0db71a07e174eef84aa4acd605eeb916"},"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":"89b1499f61e37cfde9ea333e2e893ff345fe70e2c2693bfcde20720a5b9e8138"},"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":"0c117cdd59e79df1524cc847ecd78dfff5c932357258ccc251fb180ded986fac"},"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":"2fadeed0db0fcfa1ea93f11a4bf3c9c96786603b43bec76c4ddb42fd0a14c8d1"},"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":"11985caee4ba920a7d465396b2beb5cc2a27840a3d36abb9b90a3b38715f4d5a"},"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":"505c86ee86c27f56983296360cdba65cce210d26270d7bd8a8f49de8e3089c4e"},"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":"c20ba7ffde01dfa301933c625befc7831dddf913bece89150d3a3ffb834e1d41"},"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":"8a004e3d71d347c50661373130b95f2028e2f4bc8d3c61d738acbbfe7709e64f"},"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":"d355922a66a00f5ffde334822903ebf4c635e1dbf38abfae7856184be66cb30d"},"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":"d7aaef77b55f3637cc0840acb91707f28260acf583bb74bdbb32332cb8f01afc"},"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":"37f19d3714f29dfa26d79a37f4aa37fb0d410edd48237f9225627cb6886ee5e7"},"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":"838f21fd64aa34f70918fd9005a7334101b734766892fc177abc45799d3e9e80"},"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":"0453bed2f8b37650a345ce90665ed04eb3391aed4fc5788e930e1f93c9873089"},"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":"17bfcf223d7a6705194ed80f2aa39d9535e3e45e4d500a5a98c80a62c5bbc3c3"},"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":"e71d8e0612aac7d1c1b66e306846eb718fb958bbf03c3ddee906d084b0697d6f"},"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":"4dbf0709b1f76e42a1944012c6a70fe6dab32795707ec73820ea653df2ce272d"},"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":"e875dc0f0855f3ae6c124c430640db972639692116f1e6a26b9ddff1a8d1f27e"},"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":"bdd2aace83a68d99e4bc7f36fea27af8f6cccd291ef2b8d1ce216972985fc53f"},"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":"51c0f72453b34cd2e2db1950276fad8cf68df86e36996838b9719a0ef336b86b"},"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":"04f3dabc8e424e8325c7118d36aa5d711e2962b5edb39428bba8d90cf68ca4bc"},"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":"615cbbcffe389435f2e57da3464998ccadfb97b521f606c93c4d2771d60b608e"},"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":"1ed88a46b0b473cd708887d68ce5cda1757bdc422598f1e1a07d018e3cd49dc4"},"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":"0a0d6e0f50b8f0ef97c404a8df01d7810b3c9a7c122f3dabeb2bfc9614130691"},"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":"ce4edb868fa8f0481eb816ad2dc7248849079214839a6461544e874c4dd0c041"},"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":"094b90ea4d4eb08d6b3feef1e69bc5995595a0af7c1fa899248fb9b98d838a1d"},"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":"7ffddf1d7ea3627db888503cddb5bb9a439e33d3eb948e3ccc93cf3caa82c732"},"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":"229d1cb6c82146907c554253e9a7ff65aceeeea3094c61befcb8ae42121544e1"},"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":"e3c97ae0c4c1b6090272767e475599f615d753249c5de03051937835dc13d01f"},"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":"e42fdcdd454f0a2e1f9e220c35e442b1db84e9ecec79eddae64508ab678827b8"},"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":"b257b44e5afa630a737d35669873d2de43c4cc233aac9eed73203bbd5ed40148"},"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":"be4fe2d66b3e6a457b6c2d77719c5453cb936f0a65965a6fe22cb9f6731d4300"},"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":"fc7bb6d60ac4ed8dafbf4bc60685623e0c8a621ff54580856fc4b52ca6ad7e29"},"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":"419e130bf96aaa9d1c5220391842f1b35116c44dd91110857dcccff7b2dfb466"},"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":"2aa592081c95ee333c63a9913d0b84c62fa4beac48cb2f806d4acf068c7bb1f6"},"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":"6c9d53cb61c20a297a29df7fe4d6d5fcdeff4095c9ad75ec5ba949ec5241dac8"},"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":"06fd47fa4a292540af8841ef53c4baa2729c77143c3db7d8673db5718dd082ca"},"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":"59e649b3c32d1c44b9e5c1d6d4b8cddb978a8ec27c4d0c7577c571fbdedab621"},"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":"4cedc302f852b9fb16abb456cf56b014bc937d83638c3f15f57f048ec03d3556"},"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":"c37d3558b11215b3a785015545f2cf4a708de543d3ebb475b036f4f4258e01c0"},"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":"74be85fd3f231e56f40ece5ee49183526807f9e78eddc4ef4a35ada5adb2de9b"},"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":"ba2acaf428988fecdb17c1300005518b5d096eb292167de6b4eaabf2411e8c9f"},"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":"1f6278e927205393a5c6225c1888c320cd31b605b5fce20821749c4eb6e590c6"},"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":"43fc6c3095fa77de16e2512cdf1457df355daa40844a7a05049befe3f30dc53e"},"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":"e0e57c811d499a69ca04e09e113d77e11d7301eebfb76ae39222e7ff21d5d3ea"},"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":"40b2029f9834add337b3a265e8768e7000002de40d65d5ff1581bad79b21ca66"},"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":"914ed15b1c47a121094552b1611e53b8f8fc111a7b7139c0408f766df73e4c2f"},"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":"b65ca45053956b322bb3d6fc5af3b0d256f95663fc2e918c7c9110ef3b7e6127"},"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":"d0372b7483b95e01f3183f65a3518dd52e0ff805bd0076febc758e61ecf1a0df"},"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":"03a5e326db565cae94f6429f63c0bfb0a1782089d12f81f141612d39df5da53d"},"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":"e35d7c88e332e45de9f3c0ea6611fadbed86c7e00f21d6127277db4987e2bbb2"},"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":"dcab8270a256b78b1456f00ed6a9f8bbc0bb19aa23dfa63a47631a4108993f79"},"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":"7889f7633754d712c578e8f6a59b4269bdf410136aff8ee9fb9e13b4290ce097"},"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":"ed02a4be9dd3c0d324f6cea666c5e3a808dd22c64ff5c4257925020a1af73ffb"},"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":"219726441c419c158f2e63925df7bc8d2db81ffd8972b2f5858a987d1ee0178a"},"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":"3727af3196805e283266420bed6f4ed6936f7b8ed9f576d8d2266ae5d77a760f"},"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":"63e471d21dab282d3724160d50d91ba5dde24ebb35455c75be7b3d2e0c5e2c7f"},"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":"279957fa6bfbabd4edf3ac2e3489626a79688cec05fba1520cffe2df0b806263"},"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":"47b555e82f5f3ebb82e07d728e9063360d98af688ff67106cb8c34d824af250d"},"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":"f7af6b3b5c30c6a48483586e2b3f01454b96680d8b9742fc09ee37ef34016054"},"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":"126637c567f693436c0bf91751d09896e1f640a9e42cef04e34c9896dbdef6ae"},"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":"e8d767db26cdf805233e6cafb1e67f3e4c96c9a01a1861eb70372f427a69028e"},"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":"e2d38fbfb3f703a9e802ad26d11a60ea05bd5bf580e7723fa876fd5570fc37c6"},"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":"921b9ff5e719068d7eb9584f82432468e969830828fc867ffb1e5988d1ac2319"},"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":"31ee3fa3f55b5a36a2e96ed825be4389a51a5d1be1aeed456206bf1eb2486044"},"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":"7ad22b6f7ffe72979602b2be0073d31e6428390d46d6008331ec4220a63c97df"},"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":"9638fcd33b1894fb5424d0e062d2d4aaee0d4fa9b7467b7e3777d2ed37635aa4"},"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":"4df23fb343e4cd08dabdc33ee962df831332dbb32d7cfa7d6e669344b9f7f184"},"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":"9cc52433c216647f85b90d27d5e3793eb369047890cf0464146cfaeca6e783e6"},"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":"f8907d2aea29d8961baa750a3cee43a3ecf4a33b021e476e9f2fd101112cf5b9"},"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":"6cc69f72a0f645761e2de204ad143567bf834fdd8c0221c22ba9f6b9cb4072a1"},"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":"900e277385d06dff690b7e755eaf83af56b3d0f3db37798a14ab56487a636487"},"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":"988fa2368fe0619a3f0da4b789eb5af4d0280443d3d700a880a24687f19143bf"},"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":"66a845bc832840fa90dcb0046f52056357a32eb9bb9888dc951466cfc1074ec6"},"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":"220f4c6bbf3845be41e2be0962b823d3ad5d7297fb0e80e8d9d14f0db2474169"},"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":"06a7ce5d9cac0a211269888fc192fa2e48a328ae57e5c2609e9c2cdc884bc225"},"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":"4eb148db56e0ec8aa35f21d8b2b369888d7825fb5c52f5b1271c7f8c440a8d81"},"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":"f80c22dbe1dc79fd429fa2d87a251bf5ec1d3e45b7913e911200d436f2e06545"},"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":"53beb4cb9b3bc781295b7c25d15f72d3005528ca31f126b78d677ada9aaa6e52"},"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":"7e151093577d6cf65f19ef62499ef3b01e8f599b40d758d55d32569607e51e3d"},"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":"dab2318e5334274609c35223bca28a3d9f81da7c2dcd370cf166cea41b7f6e91"},"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":"5367ace3564ee1778cd2df3bf5432cde23b9e26ef18b36319db256ceb8b8c36c"},"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":"41b059d87f0c9e392ea41370d577a6a119f4b9805a321416d41b5ae793077166"},"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":"2eeaaeb67211dff803173e8cc75ef98c2a1300e703ca0ee5a73a71e71706422d"},"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":"44820a70b253f4eb05904bb421ab8670035f14430d4a647c609a79024bbc2819"},"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":"78de7b98ce6072dc59b5401c4a110cdb2af372d6aa3f6809e8053e78fcaf5a71"},"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":"e1255e4c2f5aebe3f2a518deeef5c790bf882cbe99f5fcab9dadb181b59c8270"},"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":"1ef8ecf8b43096cbe5a855ee033807f9ccb6930134f68d638c56a7ff439742c7"},"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":"30c7311a34023bcc9e74e8bd76240bc1330e119bab42c4ae8bdde01c0dfbe81f"},"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":"11c6bffef9310184076b9455c05bd58e707a8550006633b0b50e69483fc219a6"},"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":"8d25b329c66bba0d6fe22dc5760639f26939a3ceb631ed33003a0820cd7ee769"},"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":"2b838501b4e75e7a39d9eba5cd35af758db5b44a7bd3f66877291c87a31a37e8"},"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":"72372e00c25a8898584f368356b6f32c5859ebc896b85f6ff864362a6ebca30d"},"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":"85354236161160df3f23898aaeb55088473d3beab7bf3ed7edff0caad965d31b"},"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":"6c07f7adc63309c91422ae76fee76355f2cccf4c961b1384c4efa46dbb77fd33"},"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":"aec8f771909e277d25bf15d61eded717276e25ba8c959b25110752f1c4e030ae"},"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":"7983e68ec16a0ea7eae566da025dcd654b74e178bc1493ce068fa5f1b2bc55ff"},"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":"e8b3408d3c2722e9c02a89168ff58734065b9a564a140acb8f14d62eeca88899"},"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":"c3185d5700578af9a8ae7ef0270e2f191d8e78230f2c7ec43a1648600988f3d8"},"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":"7eda0654d4b184e38c34953d3bb91efd5899b2ecb056db9d33518300bf7e4bb2"},"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":"61bf58fa584fe47494ae0e8c9fa09fac76e9babf6c02dff582f74c438062bbaa"},"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":"8abe2be79de6e57cf31a5e933473fcfcde7988705c9222c2980721c19a74cc9b"},"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":"8f7f8a8194f07f954b8bb3d87a931bc584ba80ff3e53d106368b6eeb5a029fcd"},"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":"c645c77b41f29e107854acb7a39445472d7c688c0567b264976e62d9fae3de85"},"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":"e2f33be32dcb5019edc5af74358e3c6d66830f9bc3bd16c27849d4e6bb95b89a"},"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":"214acc166b81dc64a822f14e975e78f88a8c36dd045bea769ab28d6054560bfe"},"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":"0900cde5d7dea7ecdfa2151c2030c69a8c017d9de79b8351703c059d5750851d"},"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":"d0599c314a870fc3803703d98e3540bdd8e8d620f2b28f1733291d93b54f5873"},"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":"f27d1dff226788dbc9f3d09ad4a89f66ae7dc95a7d1701d4bbd7864dc3c3d842"},"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":"daeb52319410739335f123bc6a3404dede6db811329330d1309fcafd79fc4092"},"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":"96dd86e0ac0e7e43b0c9759823fabd3ca4f673b2938017a54c6d9a0453ffc5ba"},"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":"dd4af9ef7244b426dc198b526847941457f9d3e5672ab0b4e3e477af546d9cd2"},"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":"c4ab5bba0039ec1defa69df1dfe0f2b717106b87771ea27bcc4719173dae085b"},"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":"acf08872a0602a6f1a4dbf065b2a7503fdd7cdee0a319b25e070edc6ea3fbb2f"},"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":"ff3688eaad26d419818ed1bde8cf6b425b8e1a71acc097cf4679f2e6a4d1e371"},"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":"5b82cf48a26bb07f35f67cf8dfed8a586742d37f86fc85450445cffab0e92afd"},"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":"558ecd21b9f21da5a1e5de395fcab85e54f7e6709371f0f297c55d0a0d191ea7"},"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":"3b59a00f351b49e8ec65f62d29c72f9d6dc2b8109766a2a3552fa8be117b0d3a"},"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":"0e660c4d79ea6894092794cf58f6bf7ed9551dad0ccca5f2e3bca158c5e5f2e4"},"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":"aa86c4643e45eab92c5b194e827a2334ef00e6422ad006ee766284a09c3e4166"},"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":"d2ba259294ffc17af69c05fc9cc705c9432006f6b55827c6aac9ca30bc63b0cd"},"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":"550e7145a3034b0daa0dab9305bdb8c3ad66d3175b536bccbb9108a9752aaeb5"},"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":"bd2d62d676fbfebcc3ddcd1cf5024bf219563005d4161d1fac144e1feaff1857"},"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":"99247636a1ea6397c5a61bc56f89961c4bf96797028221dc3fd6fdb881f8dea0"},"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":"5aecd58c6633c8b2aec46d0caa2026338e4470f38759b955538429f2857ec07a"},"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":"a6b15e4c901d3cb2f672dcf21fdaa21d20c2e5edf7a61ee02fca7f3807ecf918"},"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":"3b66b3ae49d24f204f2dcc35dbd186193739dea6c87dfd3e698ab9da1120fdd9"},"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":"8e3dd19144aa01182b72d3c27ccec390ca1a42311e50444ca33e1f293037630a"},"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":"ff40b8eb4efabdd08c2e09462f9f26648df1e9a417196d6867e75e0574f7f14c"},"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":"076a6fe80227001e95f6fbf5436404e81a1aba71e8d2aaa46973d186d6dc96ae"},"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":"9c013784211eff38b54ecd34acc378598130f07bba762eeeefd80ee61e43717f"},"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":"875ec54484eec31077c80076ca22cbe0b088268fb1194194fa4555174ca9992f"},"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":"c2c96a715cad856070867206e7fc6f2c3835e10fa9c2c4edba96070a79a62a08"},"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":"fc01d6e62cfea06a9f7116f7476a4fd87794c7a153ad01a7b77ce97078ccfe59"},"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":"1d20dbc0ab8a7159dc496cf15f93f6f8ac3a1370886965c607e032efb744cee6"},"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":"80b82b0b24dbed4bfb6a295c92897b0e715c3cb1747a8ea5f17c53cdf1c30fb6"},"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":"a6dbb6d820d2bc0f7c48858b9b9a325f0c5f3af038aa2847ef2a6d15682b18e2"},"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":"7ef7c9b7c15cdfa98390ac76a7c6608a1691cbc7c097b6f3f9229eb4b3d288a6"},"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":"fbbe8ad4c7523e901b3686f2fd5995b0498c9488f7a04a9a64eaf8fc62bc2072"},"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":"c8ee2111436232ae98dc13d18fd179305eaec8ebd028da5d28ce86cf129525cd"},"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":"688300e56f74ebe6942824d8f05019758058d15558105b4b483867750704f3e5"},"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":"48635d46bb07f7d4725dee5bfaf3c03fda3b312f93b5b24d579a93f8c28b0db4"},"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":"4a84d898d724afe08d0829f9f12b2558d877763b4a6ef1c3ff1049898fb33274"},"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":"ef5f6a95788aaa2fb46403b8441aee3e41a5c3bfba32c4f149967b1f0085770f"},"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":"b0ccfe0b3d57fe14ea595e83015b201a3e1348e4f8221f6cd596ac3ed39b4168"},"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":"98fff377465c8970893a1fc86c68aeca110bfabbc25c39d0decb3b4b12f4a7d6"},"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":"599e5667ae47705853e3c53204a00743e6c522d6f11eb01256e87ac82d5f59b2"},"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":"44af47ff13c1c80fe5c75601fd07ca76cfa8c7a491a9f4c86af77bee55b5af79"},"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":"39559c6405742088b287cb562855df477df364edd2caa04b9f205d7995334065"},"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":"9b8edcb7e9d785974835fa11fa7268b806ac2e7ddb3c55e6cf7e002dba9319b6"},"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":"85b6d52e6d4a33e9a5e03fc8e51c673c84d052010e4177690e352d4654457f34"},"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":"f5bafce354b66a7194dd8db6974bd7281f50643c8d6df095a6a94b6eb5a0e5c7"},"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":"cb200091d36593a9cbbc738a12ce1db79696c65566eb9fd8e1ee4c55dcda1a97"},"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":"2d30257ace824c3c49d022abbaaa2818886e7572f1b77ca5880ea6bcca4e0789"},"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":"98ecaf65b0a8fb744f7fca64d9b866fc65ec4c54e725349845f14469653b848f"},"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":"8c90ffcfd5f87f616b4d571ccb37f4a5618c3f3929f25c2d6a6006682bc33213"},"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":"65c667fd6cb29bf114cbc0c73ecc029ab365772f35a397d732d5eb3a5c4e9fbf"},"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":"0ecfb921aa5e91fd5eab9864ba15b137b66381b3aa71a5d31c2a13bc7520af49"},"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":"83103ebe3ce062e2e87db6908bec8c1a39269b7d9bd875adc1c552ee8193272e"},"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":"ecdd7a9f417ea679eb76a298c260f85bbccff88d55f3d40d95b98ad368605a58"},"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":"76403b1879f77526d081542e9915408d40dfacfbe8c22e7a747392a3de7bb11b"},"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":"908dec3b38d6b75a477570d5e78cf0c279dedfe3dbd3ebdc29481624df511a44"},"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":"37e1d5e836eb0d20e9aafd69a4066ccd3c0b0f72f268e6528c1e2f83bbc05579"},"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":"bca094d8fae7477a1bc3da021f1feec8eb144431ae7aa026152bb3e7291f05c7"},"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":"ace2f400f332526f0d925b10ef1add0e82ead344c6b0eb9cb1224591f2f397d5"},"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":"b85bdf4cf8d2420972b1f6b90a1c5793c4463dcf1d120b58362a19c634da6b7c"},"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":"67ec7dd62beddbc4b71b9da19c231b21aa1466b5984bb8f2887a37fb3e9b371f"},"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":"bb2eb0c5f4c6838ab138341386182ed21f9d2c930c8e9a7fd5f9525b87f4df4d"},"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":"cca311fe8b2970a5f7080fef73ee515287c3955776a67ffc5aac8264a7181770"},"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":"bcb9c2b569d048e959ea5cb863e340adaf12a3b66e64b392dfececcde8771d79"},"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":"0e2f713efadda97617abd7164ab0b919a63a6a1fd66fb0fc3078c2f7d0de2a39"},"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":"414a9cc08b676132f708cd707ad78114032e913888fa1945ebdb74b08d1fe6bf"},"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":"0e1cabd1832561a425aa905926f30a9946d11c81c76bbb53ff1eb733ef82691b"},"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":"aaddf4bf43d70a45cbe8cc19848971ec067fc89e0d2651daba1a82dc6ad74426"},"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":"2aec91f1f708d7716a7d643b502b396ece84e315ba412d734e5fb5fa1297b1f5"},"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":"41e9b33a2c1a128e13687f03c712e89c4719eb0e273fda557174307db5b8d1e0"},"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":"2f90662bbd01ab99dc6e6c0a4dac82f3b20f480aafb7d1263497fd8b36a55e86"},"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":"49000b59defeb30347149a1bda1aded4168ae73e5d5bd5f18e809a016cce26eb"},"taxa":[{"id":"CWE-457","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":"35d22eb90cfeba0b9b33cfe155472d2c5eb3174a967460179852fb5edeaf7443"},"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":"2f5666ea5ba85c7b927dd07cbc00c3e2a5894732303d41652d5f8ae7ace338ef"},"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":"a58af1a3a755a40fef34c2ecedd1758c63a9f289327f137465cde54cb82478cc"},"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":"4161259a56b3d0a9a2ba13a4f49a9f55507200f051e3acc0604d694edbb05bec"},"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":"a3eb7ae19921c6f24a96988739bc6863aa918fd255c7f93e6947eb5474549961"},"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":"78e581fcdb56959105fbed5f9f02b3e60dc65a7727077da955b5e20bb541dc3c"},"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":"c57c3618ba96dc49ef0431ef75dbd6fa42826b825ea4005426dd4ed5ad168c9c"},"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":"7ece6da9fd23409c2bbd57f2f244fd76826c62fdfa58f97f7ee4cbfe0fef53bc"},"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":"afbf81b4e4457d01971bc6d9bb42f4d75f43bc541e938236436db3af8eb18564"},"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":"3abbc341020552de1faf6ca55aadea581ef4f013bfa06d6ad679a73cc02b8323"},"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":"ac64e522fec1b7d53894df8e8c57891276fca3ebdc58dcc52f8e65c263945880"},"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":"048f50bbae5fb151b1d84b560cedfcc8592cf58a2b2f42efcbb12a15aa446e12"},"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":"e130e347ea644e233c97b8895501fa76c9677142cba07857261132e2c4f90b69"},"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":"bf426894e227f721098dfa3ec6b6ad6f3db0a73045992471af265c07efe20145"},"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":"87aac9fc96da5327dbaf7f33596b0b54b84458cb4b9873a76b33e7617e819781"},"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":"3323fe02ecdf44817f38c419d9fa017da6d1510d57d4e0ac9c50db6cfb73b16f"},"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":"4b4830afdc2aeb3906c491c6da3623780bd927454bd5b696c924e9ef41c26e56"},"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":"a91730ae3087c1224a1afb0604539f0e2afc6b9182ee1514fc78dfe1f5eff35f"},"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":"054d860971515264f072004f3df5c7f41f1cb035745717f070200a8426d3fc3f"},"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":"f29389c0fee38cf6ac2c8492d4ce3d4712e25d4cea0ea5adc6eddeaae0480c60"},"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":"33841edae825c1fefeb91aa6119672a2b1b133fc077d41ddd031336db0b84aaf"},"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":"cef2739dc6458909eb333f7c5e6ce61d2bc1956fe23270ef6e93bb42edf14caf"},"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":"8fc1b85b1b12abe3a169f31180d53b749671beb1ffcc1f49ac875030ac996887"},"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":"5399016c2a3af9c9e24b2440948eb7fb3314bf300f003196da5d39c54a64b6da"},"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":"2edee4019235cd501d019afed8089024f8dcd202031c9cb691eb6f4483825a91"},"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":"2925a0f9df2a59b083aa118ba0d76c308be91e9ca6f1676b4786692dd2e2da2a"},"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":"d87e81cc6c2d19a739fa81ecc1b2a397e885330bf08ec45a4f57d3ef0a2b28e7"},"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":"c64a784907dfea4200911a3eec09b3d3c8fd42c60102b5cdc2ad09e86f34bf40"},"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":"9dd4933b194573d518c2b7a3a14efa9f30cccee47f32783bdba2fa190795194f"},"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":"2ffa12c81143775d645871a363bda2d55c2ce1502c85522d1f02906d27b07a3d"},"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":"24c2b080327a3f54f0d11761eaa81045e3cbacdd606b2f530baf12a95a85c2a7"},"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":"3ce553cf0160636c8fadded5424f77f880ff3342c62e6dd55fe4f4b338dbc298"},"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":"4062e6c606a4afb8dd6705bff26f917b3008760f96084169a5ca82b7f89551c3"},"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":"b9ecf03d5ef93c0a39eb253a4331b11d76da4facdab652280865b9d42ca2fece"},"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":"bdda3b9d212de0c7c5765680df74b0b67448164c8cefed1e91d9f2b4d21762e5"},"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":"c4aed60e749418f0edebc7ef71c9c17c0360c7cee451f12e21bb01cb5d429922"},"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":"0e1a6ecce95a47ece6d780f5b49a3121b7c190e453c411d251c853c2752a2377"},"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":"434e3d9fd7ae645f02fa8e42be75dfbc110290e8bedc1064a6bdd7c722c51769"},"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":"be0df784593322eb69c04c4c27821d92afb9646b5a331da9f7a631b10b15830d"},"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":"d647036cc52ff13edf89fa4d0ada7eb9e43d03572448b249fa68d8ba31054eeb"},"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":"3c0d5f5539b1190e970d928bb3bc470d52ffd25a83e1a4d58736757e2d0e09e3"},"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":"9faf55d98f5e926f29e8122a7b9bd428dee578282e5171caef8add267c1f3885"},"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":"782e6737bd25e16d67e0066b088811bfcabc5c44714f9e4d42ef48913beb20b6"},"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":"9d33a2d08a30c9fa5d2502436e80036bb3c516a585d2f78679970d024eb1e887"},"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":"c36afced646a273039f889f7208cf65c54a8a8a9fb7f795e797c2156f9d1bc93"},"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":"81c517b4e6c508f54d620fca0348b67d12698b0ddd70f34e982dac57dd49b84a"},"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":"4ad1ff9d748600fb48e22d2f6fd5f999b2d0338da5b3fcf038816a1340596bf8"},"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":"0d8d05f4a136dd741af97e74f467e80f26715a8600e3b6e2c06a55d56b68f85d"},"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":"eb465776125c54be8a47aec2f9f4fb0b64e101e80507f266b149c53ffd7a658a"},"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":"39834b887fcd0464e9ce1b2786060d310280ab9851849dc349a032b03c02bad0"},"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":"3b7ea99a250f2bbd04904ac064a3af265adbb5a44f37e9a7c32534901e774dfe"},"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":"40ced5ddf24644e61f6f7fe70e9521e3cdae174ae1a96ee721bb99a9b133b358"},"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":"5f896b8623dddcbb2001e61dff72dac78ecb1cf6d0b9dd58e61c7dad6563750f"},"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":"fba90dcb382b8c4fad5f12e3a75d98ece626ec6597ab4782e676a1e6381570a7"},"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":"c40c48fe05386fdf1e0f1385fccba7c795ad4015e0cf62e7f7ef1daf6251088f"},"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":"1e63c3b7d8c965027fb0088282eff5a7eeaf6851cdc7f56f8717394cca4d920d"},"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":"58f3f213f581fdc2431dac3239dc9b3e4201d5ae01dbf0afd033ddb49d07b786"},"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":"98ffaf9919d8a8aa9b0d0481ea8b51664402551dd6f81a742cff7033c78d252d"},"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":"5c99c87c73e060f3827689f3e23499c9922dcaace75f822e40a982eb1b073eaa"},"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":"aeb014e2f38f5782952ef94e13e3d1cc181ac1f66ebf4de3e19d5203dc50ba14"},"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":"75b56faa0a5e082567e3605e23ccb1d8a8b199e706c2fe63d30f39105b045d4f"},"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":"a846e959fc29c8e8e7faceefb1808321c9d8ae63db21651f2db42843a4d4bc76"},"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":"be008806098508adcfcc1ff1275d50b97418256191320627da3609f0edac0139"},"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":"aab5f63e1527d86bd2e6edc0994b432232a16c333c2db80e31c1520c20cc9838"},"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":"ad984635566e58daa22ca813ce5ffa6e9950e624545fbc3ecbd0638fda2e454b"},"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":"917483b20d573810a124c24f59e527d2b5e01974ee598390d207ae803a34e903"},"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":"a40326e6484f6b0dae82e6b2069dd38ff139e9d1180b7a7ab2b338e81d5e1fea"},"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":"bd71a31e6cc233f89cb774460c32e5ef6a3d054b084fbb5afd3850b914b99973"},"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":"e23f2f517acef5224af485f9bf2cd73fdee03158c6027b8658274093841c033c"},"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":"ae79654ec2a4e7d0a732e90d8366f60f6fcb1a7b5f3c3b6b38bc0c95682d4f0f"},"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":"8dfe262217cca1500cbf3c8879006380670b70169a80427bbc7657578ce07051"},"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":"9cf7360ae4cf861207cf392cd2254da33704dfbbdb46ba5197154c2891fd5284"},"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":"92ac7538536a5b10697ef1155f3ea97311555e93c1c9a6d7a8736cf82a175dbb"},"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":"7cc900cd5a1fa95c30dbdf233085fae93c4387880f56f8bf85c482c21ca1ba83"},"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":"c877c820f44659a99d5ed3b22fe6ec0af86d9a672d61017435c5354126857f6a"},"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":"5452ab7bc6fafb32011f0199e5b157e88b228023cb2603d95411aabd706086e0"},"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":"d210d333fb29d8f1cbc0234405a7a539666a2090ccd35162bc26f232e4bbe7f1"},"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":"e3031d2a4a11fe638fcff17c4c06ead1d9df8f1e65b2e6d8d199a21a616734dc"},"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":"e9e4de966d194261a1408c4a4a8a4bc6cce1aa9f9b1392ba7f8892339126f611"},"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":"35448872f40790dcf5a55d2e619d4d6527c933cbffcbf51df25c75153183d73e"},"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":"b8d421e8f4ab5210ec63be71a3d8e15d9924c3556947224b28c2e6391a8991f0"},"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":"d3f85226dac5780a6e75c473f8a18e4a4f2cb463120c6911283228979fcffdbd"},"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":"0f2052dc45ff3b185797da516bed9492e1a37d6d8ed1708b950971be901aa0d3"},"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":"81b78ee6fe4e8a3b8e9e67655bc0a2b892575c50f8d6f9a288b9bc27fc851597"},"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":"e7cd522a6ecfa4a29d4976e07b510ef436b4168b755c79ceaf240833aee06934"},"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":"97663133c226a88452b0ad1d7eb967db436ce318bc2b414011b6e39b51c9e51f"},"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":"f9dabdd32ab9d2fd0157ab55786d91453544c6055fd035c3af5690e65e86d739"},"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":"8f7a6d73cd1a65165119cf65ea26a7e5c3ec09cf0c90b3e7478ec700a856c556"},"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":"d1ad388179ef17a2413502ea790b0a0a13ac9384de621ff8598146d8f242dc4e"},"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":"33247fecab330f9625ffe8887d2a9b3115a639fff085507c324b55631bdee7dc"},"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":"edda0569f550e8ab93ac6a50153ca116021aa79c6e6430b5a7747364dab2ac71"},"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":"1302e979b42aaa8ef750df5fc5eef8f4f28e53d71eedc19a6c7525d8f9514e88"},"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":"f6b97423d2ec4096261d1528aea0a64a2b6847523517df8ff7249fe83bfa31cb"},"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":"8441f0fb28e653007113c1136cc690c8400c84babac36faaf1c7958b69db9b4c"},"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":"a0644e75e490929b331b4ccde88963629da5253ebd8b4a63a357eff315700439"},"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":"54ba5cb6550174eeaefc57cd6d8c4d7bbfca311ec49f9e1e27ec661a3e52bb96"},"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":"ef0e72f28a6494ebd742e65840ea5ff3f4ba06a873b531ee18860c4d62351c4d"},"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":"691237ed9d6f5605762bf05af2f135eb29d4f2aa526e4b4b8cb7e14043209023"},"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":"e8468592977dc157f8a889a56da6a83e1416b2b9b840f898bd3f0eeb6e28cdde"},"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":"6fb956c0bfa26bf05b8aa9f22e2d2d0be0dfa928d3a2e62ffbc9720513d38154"},"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":"29b0a3f2ec94d7859cd294b32040b7e656ba803f312f9970e2dde590c5b8f04d"},"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":"5deab36691a33baa6d5244be6d485d90acf7efceeac970ab2e15d6ad2eb406e5"},"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":"e2e898b3d1885dda8a71a45784197d1a64785a20e4f48a48442f3ec4604cbe07"},"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":"dce7a566c8f93e6c28c16cba49f800f35eb1c3f724b858df408a14a1b3cc7a83"},"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":"cff8608de1c686aa8e52e1edb330a34267273d9b6b5fe6c8cc6a73babecd6626"},"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":"38c7738de46492da1cae5484a9e96bd7e6136fc5207f383b6918b17620825d6f"},"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":"4d09b0990072be75d66025275a60ca84e74b672415def7c2efce3a07fd5810db"},"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":"7f8237004c5f43af7590c8b17a93f69c3a1e1440a40167191afd474373ebc115"},"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":"e2f3f9061754f402c7bccba5e8795fc6f8748effae0acd6f2cce331fee801fbd"},"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":"dcbb3232f185c6122409c05a1d7c51684fdc6362432390edff3345e0f184c1ec"},"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":"19a4e0cfa198f7f79cd280d7fa323ba962810e73eb8662ccee1de10b93ad7525"},"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":"8d88cf7e2b52274813b923ea895426e937050636957a602fa38792193341e3aa"},"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":"7f65212cd90de06c9a6a7bd7ada042535b3417cbfb40983ca8ece10fe5e3b38a"},"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":"9c8aced985e0313295526a8d4fcd0f2d2af30cdbbec0792834766ef5dfacc9f5"},"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":"a804fdc9c51bb20ff93d3bff7e49f6d542eafeb06052f73dcf3c077a993b73b1"},"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":"03651c6960fcfe6e431b5fd13513770b571535ff0f84cb1560722e6093faed3e"},"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":"d2c1570fd8cafdf0d62c7943c6386374deefc4e1aa553d3da2f6454c27375eed"},"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":"e1907da710c5ff9ebd12b013d3b8ef094b220cfc0f9bae15ca7b9da3d1d0a768"},"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":"83f85beb21e47e54e9e191ea7b1dff11c3effd2cf7914542d1f4f12883505263"},"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":"0710c72e0cf9d0a0d72fbed4846b578fd84e0125dfbd1144a441c536c8c19412"},"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":"ab11d66635e0d8d3a1f904d47f35235fd40e0716a8509fb293547a645c2a285d"},"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":"ac5ccd55dfba6fa47038d120849e787607f9ab6c7d64a272652702f615e6f8a3"},"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":"7ec902284d7596cf20619314218d83511abd8b94b84f49572fbaa1e7172d9d7d"},"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":"3769aaafe138bcf8f40006013b2224f2b37456ff496279d4ffed280f390f58ef"},"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":"9dcd4b35ea16948c1bf00f3772575c467fa1d072cc1247ce865e8d2241a2905a"},"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":"a6e670fb3ae5efb1f061c8bde3fcb37828303439e58ece2fb4d2624c8ca7ebfd"},"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":"13dbd236e21f71226eba7dded42dc81a0fbbe96fda1dd91246e050157e1deea1"},"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":"9f450e9b9e5309f01457bf0d81dde3dde388579cd822f019e5a55d1ddcfdd3c8"},"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":"3ebd2c1ae9bbc1a75704f8e44faf63cf2203e2b77bca71a84c1001d7d7c146a8"},"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":"aa3d5d8dab53dc4d49606e39a40e9122286129147b2e6563922bfe299c7adf02"},"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":"35cdad566e0feb01b443723cc399202f91d0404b73e834909173b49d34b869aa"},"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":"921f4225a0738ddd10a4063cad58e07a318ca05ea8767d6760c782292ea7e162"},"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":"1ee74ba221819869737b90be126f4b2b07c2584828a32b38b93a5bbc848acecf"},"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":"7c68c72536dbc48799768f9592390d8c9bd9d1655ce87924946ec7afec0a3461"},"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":"ec27ea36c8b12f58d5ee0def6a7be8e395d652888cb1a79c5edda1a5e3730a40"},"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":"5f11ed37c1d5330211dd4e44200f5e588ea11d6bf682b1b1f7496f105de380ed"},"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":"81d8f129ae41b0f5280bb93b421374bac255ec5d01fba9df8801c9ab3ed5714c"},"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":"e15dcbcf83834f23db4a5dd4e4739e55ace8a4ea6cb621e3342c09510069c99e"},"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":"7c312c25fa9ff7b7e415107fdad7ecdfe28de74ee6ed986b862e73fb8121c81c"},"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":"9ed4dfc4ccae6078526e36e772793d0b3a6d9d134671c83338efa10bc9b84861"},"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":"3dcec4ae9ac301a7b14ba07f0bf099fe93132a1f0166e8c68e56f5b5fc8ff6eb"},"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":"64125e8edd3f2df9423ef2f804645a67fde2b3dc8be5cbce7389182f0c9e5103"},"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":"3ef38fbcb3c6f36cd55dc97380de4d18984b72f71782302b5f513e24dfce624c"},"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":"8990b6344ed46353f2492ed17267c5e9654c403b2ea60d149ea74fbe320e907f"},"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":"6f8facce97803930a1a0b43c1ec26b21a3135f01f91c9034eca42e46af213b24"},"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":"71ed0ea3944b56a377633b0b8adbecd757075fce78ad4d0405c21c05863a7db2"},"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":"3392d4a0c502c81c80304742a05b2af4a3a227fa9d4c580d0f7eb477110e23dc"},"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":"1b3b50b051ea58f5014d48db13dd130ea6e674f4e1364b6602b723a63d6634c9"},"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":"2f35678f4c390b36e8966ef46ac711198a7890b2c3e239dab7bc865e2c192f5d"},"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":"56eeffb5c3823d8ca1d124ac83941e7e122d31fb6353ddab096a5acf86fe0a5f"},"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":"19eb4988887ba895eecd27e95b1c201162198d7980653754c6bf0a9a2b3d0350"},"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":"e0a6c7a2942aa9ab7bff5586ee920936409173c4c234851be51ee84b094ef29a"},"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":"de09d06a184b0df2837805bc237b4649eff42328e64cceb52ba27882f00ef0bb"},"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":"93f3a87ea1bf127f6acd98e14477905e54af7fc8c743c03718846fdefe89a382"},"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":"b04bcafa0427507d1757317818d3a808cd32b3308a57b50b8a4c3e6ee17d4e71"},"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":"bd30dbe265e9aa6df29ec7d4214542e2d76258c0c116c31716ad95981d966fa1"},"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":"5244d5d9046ecd1dcdb2d146e0b631719973eca3b11538bd7b4bdc70a774763c"},"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":"207ede82a0986b7ecdf5b65af58467ea5d99b1ef66d356b83ba38b9183c2678d"},"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":"833e91c818c1a85e1172879b5db408a0d2c69ba1e45d77ec1b178d0fcbc7609b"},"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":"2fdf1968f33ed518c8fbc55e91dd42e88efe9bcf0a46fbb35d7ed2eaf37aa50c"},"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":"07ace5cef77c81ead3814081b3755607d57dd810e48ee5b97cb529a71d985030"},"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":"580e88b0a9a4321e452d764c67ccd948dc096bacaa0c0e366a737b43ab29c7d0"},"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":"99382e5bd3ce35a5a7522afb28ff05f0cf4bc3953452c4c3f282c09f5cd980c1"},"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":"cd52c747f6ef3fe8ad777b4bd59b595104d5297492eb44a6e8564e16b994e903"},"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":"634acd9a7afa9d533550f78c0e1e1cfb53a845354ad74fb79fd7b07d88e6cda1"},"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":"7f2e20b6c7b80014e209836531feebc5727f12bf40e9c17964b308daa8bdd48f"},"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":"c0fdfeae5c09870b3b2c6b51da261f9498b3897f94b4ec4e6f98af5e0b22ad76"},"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":"58bf1e0c19fd9f3d78fc21b2c207e9cbe516ea9a94b176075ecec4b5eab0f3ac"},"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":"39f811d98ab94f55509f9127a1fee334fd7a1018d938d0ca8dfc870c4ce10183"},"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":"0ec1e837be200eb22255389e31d5cef54673789dc81fe8fa1832a6b244859fa3"},"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":"7cc7e01582bbae9eeb45133a94f0cf91b0b6b2f5e396d77d5930219e340bdd6b"},"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":"de94c32458aa4d4743ccf41ef26b48f3d771082496262577c870cb2a98757ea7"},"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":"6164b0b32e124a10c993b3eb31ede7713233f4ab58f7b7e3f60bc28b7078e03e"},"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":"27d2fcaa30add633371dd90e9faae1b812d7d0886cfa4c30c9569c79214a2f99"},"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":"a8573ea1acf59d6ca82ff3b204d236d83fddddc5ecdba6e8f9bd2a6fd5cecba9"},"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":"eab9752d1580b7b388b10ff27341eace01edf599c0a21f9bfc0906f7353c7f9f"},"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":"937eb7f64f147176e9e85c99b7343d757b8bdfa6fc0d4193a6d65d0663ee000a"},"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":"68907409cd0f278ccff3386e0b9e59fd3034760c1953a6264ddc26fb4245dc50"},"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":"f901514d78f6a011f429be09945d1706e33957998e578a69f199a09628e656bb"},"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":"df77b0b3c9c1fb8e8ce91e96400497f448baed8c0600fb5f5e71298cc5cfd294"},"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":"f4f51df01ce9639b252032940feedde315004d5a40d37c10ec8f40cbcf6c3002"},"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":"a607de3372b37446ab1de41d3d56afc4cb4cf4714a2d16b04d0888864fdf840d"},"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":"75c3aad8925793ba5758523e2c2fdee0b0f03879f9f4b614eb7900c1a1263083"},"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":"43e85bb402ee64a106b4939bf7bb17988855d7dae0e36b04d472318d8b0e11b6"},"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":"36e98acbb479a44d5e030b2ecbb9604c3bfb7bc179ab2c32d42967257bf30480"},"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":"91d007253238a12f5b7c1a217cd2328b99d3cee5b0680544be8a543f19773db9"},"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":"8f5dfaeb224c261c4e766bef7d727a784a2f6a49f9815150736d00d6ceeaec55"},"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":"a56944274a448ae5910e623e62f52829d3e5d029e53e3a5ad961ef329bacc146"},"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":"513a9091bdb0b5ce065f26c245e48a8134ffd26f2a92ee2b36eccbf5b82b95e5"},"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":"2ca462628fb94bf3d1c9dc0293044e71026c19800624a6ba9d241425829b3374"},"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":"979904f8bf8f56459b26816ae8eff299253a3943c6b443bdf2a2f6a47f9049f9"},"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":"6b9957ddb1981f096b6f36d88bfb46d365350ed8b9e375fda975b4936e088de8"},"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":"584ad8f154d66f00ca047c67888e5891608d5a34c9becde9fbade3dd515f5d99"},"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":"8c86514b892ff4c8b2d5badadf7b7f63ffda2f66b58a230ca7be0a6c3db081d6"},"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":"8f578dfed4657336594a8863ef14a8effa439623570a1a2f0d58b2c31fa86fd5"},"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":"2f542a1295d9ba72e22216fadedc29cdfed750a79cb040dfb89c03cc99725c63"},"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":"498a865ab3a90aac2dfc3fea35d9b1ea035671f73b52ed38b78bb78408c7682a"},"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":"a1c9011812dbddaf81c61f0b2077c8d523479c3f7a2d3e30434eed9827caf5d1"},"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":"17da1db19780fb7d70701f53d8289983efcaa9430608a534a7c0a0cf56104e42"},"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":"7f568c16ded30e9804af83e1b1c02f718d9ebda1ff9f2cc025c57b35390c0aed"},"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":"45e16e8f13696e251e99747d9c976ae1d20fee0fc5971ec8968eb96b241f841f"},"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":"d59f66c9b8953945e553771c0b63c1ac3afefb2a52b8db3bc54ca69c4e771806"},"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":"e5e2716bf0f0c42f40d20d3376fff76ae05a60720a54d1bc91f90b65ad160af7"},"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":"fab777f978045d47737c11ff74c0b1216a3ad0e978a1ec1316eb1b37185a5e67"},"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":"91554b8da5e41d35843c74c84274bf6a7c6804901ac61bef027c699726098df6"},"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":"fd615a412b6a908c967fbad2f6bb304766d5a6f6779fd2b4746a49452a069a2f"},"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":"097444f9e90e5d488199d8639708bcbd674bb68f025e8b83f75ebede05478d9a"},"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":"a492cf3617db62d455f426273a2113fc5af4c7026ad7acd5d08bf15e0f0e9cb9"},"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":"ea38e1d2616f319150fde50681cf4781ae6f03046f81e975e6fd3c9a8d11946a"},"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":"3675fb137d3a34b995c1321bdbdc703f50c398a2702a8f5c5cc2c039b95c7c51"},"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":"79bbe38559c1ee825ec4d8a293d5c33a573d1b62f25a76559729e4b7adbd147a"},"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":"0c1875250fa99c328bc0fff337b9ee6ffe72ba71232e6a21c92a7f763d916dd6"},"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":"86dda44c337a78d34f07f1f9908819ed8856c5709bebc4aeb5656fbb2841bf7e"},"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":"91b39da05c79a2df48daa7f26e2842bde340f1bd32a29f31c77191692bb23cb2"},"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":"694d089040838135d215d3aaa4af5b7a9c1beb6489a1e82cad9ac3d5abe2fa52"},"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":"1e08384153b0758487521a4264e15b3c4c243722693ba109add3748cceccf137"},"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":"5ea5aa73499ec5a6c0af372abb0cb10ab4028ed3a8093e90d737b2a4af29c245"},"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":"18f870489b3e42fd6d973ab35cc01070928db45ea309b0f9e53bf3603c985bcf"},"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":"a332259637803113e2192228cb4b563fc0ae09a3097c30ca1a97bbad4c10cdae"},"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":"aff83e072a5e3a11bd2bc94069256727501c24a9c00dcd7e5fed41eefed34220"},"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":"fc8fa92545e6ec625fa3861a5fc7c33719022af91902e6bffaa88f9486a5ad2c"},"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":"cc48e5430698d759c5552efdd4be0e4dc1ff03a1578d4c9bc8036df26ff0457e"},"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":"7b09b11d3c3de930b2bec272959ef64142ca15a67a9a9e25379f81dce3162234"},"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":"a25d37c373293ef29ec9e00420eb45ba95807fd26915c2ce748a468022f9b06e"},"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":"28b29c3995650d64b2ee65fc58f67938905f6b963f86d7ea6b8dd8cf68dbc8ca"},"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":"9662ab205a42742c6bbde14db937ae3d2070984957d8940c44ec6e5b83d7590b"},"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":"2f27151558ed643025093a833d6d3243790b10092a2ba8087a88dd7cabf72f89"},"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":"87547d3003ccd381a21de8b42f02bd010067e24af999659d7c3b397e3ef8783b"},"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":"454794f4e6e1bc58d3426fc9e9645e4142fa75770b8eeb228e58a21791a394ac"},"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":"ea24c74c4ac6da872ae6c386cccf2579fb825dd1b5caca3b1704554c9dde8722"},"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":"69e4c2273dc523b2124831fdf35537a9c42ca0049b7764dcfc7bcc6452a6dd47"},"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":"1e2275b7e8411db052c54bc6054b7149802b0ba3e206cc70435dabd9a248227b"},"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":"16bca15636540b99c55d706807842ba5f3660890e59de3e252bd43fdf898e30e"},"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":"71c13774868ef2d709caa70863e0c75b3f5a002086fac05b15e0da7b5d02c860"},"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":"1701591e519e37ad0a09903bca8a04c19400616ad3495323e34c8e5420717db2"},"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":"319fd3bdd30d854318fc455d54899dc390594b2be68cb2da0adee7c148f4edb5"},"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":"ce749c5ea5a6f68cdc805b69f371b7ba80921ec312eac32c445469c5194314c5"},"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":"d29d44f8647d3b1272adfdcdfb91bdd7f51d7c1094f08b9d3f3843875811475e"},"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":"d5d551dcddd695bbe4f8d235c005e4c9b449c4257de82121cae14ad31b518f16"},"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":"a63c430c98aacbdb66d00db6700dcfab6df1717fd9c558e71be3df2db0a7a591"},"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":"ef08a6d58c604ca5a08c388cebe70ba6003374f9d2ea60e66732ff66fb6e819d"},"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":"adc395282adf55b8d2e4f6fe935a2e616e1649cbc91e71e7c406f498b2a53708"},"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":"33d6938683a92421411624706fb8e8a267ab1c5c72601dc727ea081ed5a3d804"},"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":"421f0ad8c0d89ac5200a42604dccdb185fd70f794896b776ef687e6f08dd7415"},"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":"465bb2607a5c6d6ce526d8a361c2d6160ba5aded3c9147aa8a924bdce2693426"},"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":"1c7cd8f76ab3c900b93f4565daa8e8f074ffcba53fe9ea35a163b8fb82977634"},"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":"b49208b2db53d24ea5b7923872622038e3e77f76853329cd560c309d55af7ed4"},"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":"4f59f295b5b0718f087227c46d5e958bf274ae4d9cfd5be55470ab3f378de656"},"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":"dbabbf73ac0513224511dd7761c38733c8114e82fe6711e81d27c913619c59d0"},"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":"3fd0c0a5563b9897daa1c60985bfb4e1f7fc7ed5687789de22e09396a787a88a"},"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":"5faa0f994fccfcb612ae593ccde6141cdaae407fed185c8d4a7be8758e2bd7f7"},"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":"2ac4cf0fbf9380686aa646c80bdc92d63b3ae19982a013ac43541ba602ac0ba2"},"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":"bba1b4cddcc907ea409af435a60faa4fb762ed1cb744ab059d55ea8b584d3174"},"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":"8d901beac8e3a4de5c0483345c04b494c7b7e02a769e6df0e56f5f956a59bc1f"},"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":"4831421f82cfc9cd57a62fbeee74b0f54b7a00d7111d7c6f83d757c6862fb009"},"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":"676231977d8c92bf75f127b0051d3d6725c8365b6e8433186041250d82c26ca9"},"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":"589e7836409d96cf27d8b588e6c0285242ccd7c5d4a13b3a80642a84c849139a"},"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":"f9ef90bff609392e16b73940c696e506c1cf31bf87816f27f712304cc165efe4"},"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":"dbe03738edae44a9431e75cfa74582e3598fd85d15996fc8364fb210133e8fe5"},"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":"673dfbd733befaa76bc25d1caf3df20f8ab35ad4859318a8bd39e8f661532e41"},"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":"8e7d83bc96fef8be54ffa0178cae76c5c278b5ea5da43cba54bdf73e94e1ba94"},"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":"7a00145e6994416d28f30b6b884533ddcf3adc8aa84138601c8bfbfb5cc03982"},"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":"c79b521f2a6f4b32364ebb395ed4b9a995e0fe796b936e705f1c2edbdbe29857"},"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":"56e98eccf6cccc1a34d9cd8e695a014839b80469b1f6e5566e46336a79cd2b02"},"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":"5026404dfd0b0198adc8026e4f5ffd993bc802d0a4c1c56d8f223034050d62f5"},"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":"fc233cbe177d68bb1bea475653640b64dce058f4beccca465cb731e34231c24b"},"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":"c59be18d82cecebbc130f23f521b1193075ab407db28a1910f0ed1018e5230a2"},"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":"51e3fcafdae0d6bd016c5d2e14d1cb298dd9c988e34e040e6026f3e8861068a7"},"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":"9ba5fb1855df72ef843b1b9bbfcb6395fe11d3aa254b0c5c39c64b9ac49ec25f"},"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":"24730c26cd25528848c9f8a9215ae899ca7447e8e27dca69895c52cad088936b"},"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":"18d74bff1557bb20811108ccc118452caa954f459d82813a1f65a52693ca4f61"},"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":"ce4e3c3a2ac1c0672e134b73d0271fb605acfa7c3e576d5b6397512d73e95c61"},"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":"74b7c90ffdb40b1dc1f5fe0302dca36fd89163cfcb99db9fa196984a926a456c"},"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":"5c82767e3372e612f9c26615e60f76a1509de98028b6cbf79dbcef23b0f5303b"},"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":"2a3d50fac208b04203448cc32abf33869f7ff63fac2ef4ac6813d6bf50a47653"},"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":"4072dd25ccb144b60987e81cf34df6698d1457e23d58aa5eaeb8274a03410149"},"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":"110b88e35aa2686943782cd483b57ba17053e23c2f60762683e53690415754fd"},"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":"8145829002fcaa2df646c5715ccbfb7fe8c674397c31bf5b2ebdb1ed1774bb50"},"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":"8f5292f1b56f6c7fd03d12de93082c2b35c09f9d3711dd9f35f6699c69b5a0ac"},"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":"2ad3258251deea6fc4e63ee9fb2f0302af4c6b293e45f404acfe6ed403e2a7d7"},"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":"a30b8a170286d6a22a2c8d3d30ac0a2fe98ddd42db72cf0b9d3547e01313d693"},"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":"f3aa25678751a96b3691eaa6211fb7881a09929e8f6104972cc74953605f9a64"},"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":"efc44be1e4cdfb60b2fd02f9ca891e895b81bf8c8cff1b046627ca55400220db"},"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":"aaf08548742501c233b0f14246b3a777b23ed9983130e0fbe2a46db04b73579e"},"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":"f2557057fd5de626f83b40e15c9ffe84a57a3515fab0d46d259fad04700aa6b1"},"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":"2ea66737c1ee10b49bce9adac4177eafd1a77b7128eda7f7c4a4c84488520aa2"},"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":"f9fea01892c5e132501636cfacf791f9bb17f1db4d9d38340d0dfa05a469e325"},"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":"78e6b2bb821addf3ad11559c01dafd5c11255cef5dc2c944aa14a140ad21b730"},"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":"567cad48d3bfa40fa10f2b5887a0d181f978e52a80d0299331289e8597a0291f"},"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":"12ba81dfab31ec5f11cd41cb409195296b12d0207e3079f618cb00a20f7572f2"},"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":"5a6a1d69885046756f967db83f9a55b68370b090180ea1a0b9b5c157b9223e43"},"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":"d36db569609497ee30cd5c06c8ddabcabaf3adba530da567e93e749fdabe6597"},"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":"2ea54571290694e8ca3a7fd8056007e4a23a7a27c00ad3ade6ae303a0c44ebf2"},"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":"857a19e390e33a86351a4260938db09ca1fa9a94bdfdfbfc13915e5106b93fad"},"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":"49a020f3c15ee4aa37b7fb9cfbf7632e4935d6f566c4ec7b2ed969715c706814"},"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":"33c57943c421a338af326466d19e6df21d39b0be0568847ded33ae5d93d99070"},"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":"2b4a460902db767ad8511d7ed0ce0df753e288aafb2f7f67cf5fc5721765f5ca"},"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":"1c879345eead825deb4b7b3c0d957eba25fbda2c72d91bb3837b0e753d993908"},"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":"9282d441847adf0ad2140182c56ab2d911f1abc539f85afe4ab39dacd3b141ef"},"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":"c09f542695b1c71ce0339b5628c239475224dc2444be3d52499a76bef8adfdb7"},"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":"c770741ddf39e4a3f4ccd3a42c59f447e202df192c066e2a8deb26c6a617c4ef"},"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":"997ec4bd9ce68b68a61c161229971e2a86849491174802e868260ebdd3c7bab8"},"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":"f763cea048f0bd7aeb2f17942b94d4e33aeae9ba3af276bb68e59667cd0a1336"},"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":"a7d6dd21109302fd222b010397ded0930602f26fcaa751b06fb93e61f71924a8"},"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":"937a47ef8d21ce4b3ff5607d13ea76d50d93638c7d2deb551b735ace47ce27ee"},"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":"3876c03b29e41b3c04e89650291cb70bc2082070a8872e65b0d69926922135e9"},"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":"2d54ee99d4b47f67d483a8e14720b1657e4701dfb3aab122d3cb04f4deb2e65d"},"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":"00c207714c37e067542b309e2dda740feaa12fdbc7571a593a50d2ad4190d608"},"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":"6ade550b9bfab9268ab1fd4994bd07beb4fff0665f3635fb3d2125da6136d375"},"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":"ddd02a55813977a5c66190e008a722e2fa74a04853fc97412b9f19cac6bc26bc"},"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":"36eafe2700c7a94ed259719830a37a64c83fa33321c3d7bbe26262da1dedeca7"},"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":"195b6526f555cc450c8f611ce1d63f1b606688d7b9e78ed2822b467c5a9d2975"},"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":"0e91239019743366b37a63f11f7139815da49c9857816aeddfe734adf8385b32"},"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":"a65e6f6b4c10770df06d204cb093be93da227ee8f5a9349534476042f35ab88b"},"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":"078465dd4f23c6daf515a94b8f3afbd91ffe23120a8ffdeed883e80acad3e23f"},"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":"a474be86e05fc1ef74ec293d81777fbe9f6dd4996bf662ad33f0034133b58f24"},"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":"7d66f389a7a95c396de58100d1e1bafccb4ca4d8e1e29d713a904858004998cb"},"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":"fd65854b98cb1aedb9f1d9f4a903d645e1e4049719c99d01819fa6b64928c8c9"},"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":"51b80a6730bc8b5a5a7a840aa1fa06c56deae71a9cca456e6fe108368f9cb20e"},"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":"21c898a597b9c77ef6cf07aa61ef8ff063eefec5cd7bd52a86136f745eaf285d"},"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":"c7642ea4a48b492f1a3fb98d0d8b70d332cb274cb405d9a0da7903965871a94c"},"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":"348315d62f6d1ba65d19e6e9ffb6f2a51f47c285046c3dd40008e25a7030b156"},"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":"71e7ec5a12dd880c85a33f27a4650338d6ea9da259c2e71f35d494d179a83fa4"},"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":"96a00abe0fc30e3a0f63b56397214b4875d40c10fafbabcd750249ffb6defdb4"},"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":"e8008df4a08fd01ece596b8f843b4ddd88d6e3aa10b34553982af3b00cd563fe"},"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":"ad13383c3baffc4eba61e64380de2d09bbecd0edf135a1f9c5876aea7dd36add"},"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":"c556017a39036cb95e55f3be2397d9ca817a77b1f4b6670cf73aaec01c1bfd0b"},"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":"6f49729e9446d6a3ee871bd22fb205708cd96d2fd1a57ff270b34e1659798fff"},"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":"0190f54cf387b7d6ea84d02e1313bfdc59558dbfbd2a3101d394538f19e5c07b"},"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":"ed71331acdaeb2c4057a74eb03613f308d2ffd1af1e1d733e804ef20f8b5d8b1"},"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":"0f959f7611d54b16cdc830d46b90d15dd993749fbd7c092310228dcf8dbdf344"},"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":"63b9fa8116a11fd44d2de0fdeedfae3a48e05a79d8bc1e5d8e6628d99dcebf1a"},"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":"8ab74598ef1c430d44533accc819dd8d9ca393d15311c91d3dd19cfa52444acb"},"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":"3c217c423777e26d5d737e015b5f865729ab3a347ae985687dd5254ddd6a7142"},"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":"6e36b08c7a33f606cb0d67097ffc3af03319873799bc42e11b8c2bca5b279c33"},"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":"09f4b9abbd696181beadd54707c2182f7a66f1673e2170c96c31c39723506da5"},"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":"4ee26849e9765d2b8bf8c2cb90d13efee44160cfd607bc1d7a7bb0c3a1647793"},"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":"1c390ba9155075592d5834f6f3a675f6b01d81d5ed95591511481157dc586a4a"},"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":"f5e9707e4608ad579c92d44508087a87613eda3716e955c8ff6620b78292623f"},"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":"bd91a7ec7d3dd9c4925c420c0c6aa7de7045485c4ed4e0dedbff46fe37136e3a"},"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":"d808a7e047d909899141a0f6683bbca1efd4f716b3880b33692ae875a18a0ead"},"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":"901b67d137b9f2333abf7b8c7b4d3b95d9e53d3f514a2271d48c4d6fe6a7bfe1"},"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":"eb440e4b920cc9a50d43745e9d024f3f7a9b24ba99dc257ce5742c7db621a922"},"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":"235121e573f81175686b6b3ec58ce64c4d3c0f11b16d38b1466367aee57e0c31"},"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":"bbb04893ef9ba92de1a443c85863008db40857a2d4bc45969bfc02e432355ed2"},"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":"7bc757b17d4765aafd632d454ec347784fc7767fc2e85e50c42b0be32ca9ea26"},"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":"89d24a105ee112290b1adb088d01419001f5952986fb5e0dd03ed73e076cdaa4"},"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":"b20425d741b2997c0e695495a7a86e7b563d1d6d4e01f82e5be453871f37ac33"},"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":"c543aa057503e537a90a49243766e4dcb4c1eee747628d954546f0f484f1f479"},"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":"919e7ee1e57bd22bcd651da058e67a0bf11c24be6952e77f53d4c7bfb73e91be"},"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":"eafda96d3994fd2501be9d54516ef228ec705b96ae9c98260918609102decec6"},"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":"14476ba5c92ac0f46eafbeed9190c42f8e951e132ad202c4a771b1a2e5762a59"},"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":"8cee950bf14d4a990585bdd798395115cf07b2b2b8a385b201c19959b180870b"},"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":"8eb7f9831891de8f1e0e9f053e8b7e88d657593aaaf67041af5627d656967962"},"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":"7679395b5296c72fcb5ef8508b72b5d59eedd61501c122ae7f2c37f60596542b"},"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":"e30cadf05199ed36fbea2f37845d3de4b49ff42fb5dd0ef87e8ba1f103d80e69"},"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":"b62d89ddc9b92c0bd197a195005cf639b6db36239dc0d024200ad9133d8f63d4"},"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":"d813b73385309ddd59aff28b5e9210934f1a3c9b2abb83961ec0f026a0010bd5"},"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":"dc9fb0fa17621a7ca8fd3ac40024511c8bfc0876e9286205b8a0ed9a573b090e"},"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":"9bdb2378528fec1025fa8b71e8e315baf5b47bec0304b64b5828f2db711ffca8"},"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":"1548fab52727e8151a132134b0b430b7e5e7115d6fd3e5b7ec3426f7bbe2cb55"},"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":"1e854638e79f3e989392b61ffe2c67a888459712de097242ae3409c2c8086f53"},"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":"e69e0abefa1f14bdf3a0b4e044073db0cace8bd1dbb76ee80622a360cea33e12"},"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":"5d083c6b5398589c577121f745e65303c7fafd3f8d32008f3e8980a23c4c0ffd"},"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":"087a4ca241bcad9d57f474ea5bc0ce50a0c6949ede1fd574d6dbc1acda4f0412"},"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":"c48f7786c8a3a9fac74728830af5c9840d2baf86c691c24bf846febe664b96ea"},"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":"4f50b0c018cc3d8594aa6290321e28556489da5132036d7b3e9fe32d3d7c6d84"},"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":"b7d7f080cae93c2fd11a5c1e8d14cb1073ba724cbec5c99111200fed68878cd4"},"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":"3d20bb3f47e4f4c7c49eedbbeb9db9ad2aab0ff8d928e99182bd82d57b1d0b25"},"taxa":[{"id":"CWE-457","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":"489a3155c5d8e45c9efd37b7e9160319be0f327e045c3f01f9259ea57ffae94e"},"taxa":[{"id":"CWE-248","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-755","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":"da4f2c6ab8a1455a289121f07631f7a72843484e1d4bcd2effef8b790e6c0f48"},"taxa":[{"id":"CWE-248","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-755","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":"fa35bf2b9b9962a0bb8603103b981ce6e39d355fdd5d260b048c48f7cde1f799"},"taxa":[{"id":"CWE-248","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-755","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":"9ec383599fbe12aafeed16f64a126568a6854d3a48fe25dbdba7b3db209f6487"},"taxa":[{"id":"CWE-248","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-755","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":"8e695262c4e75be3df81ad4f69ed374057a1d71e55bcf89c100d05f495851ba8"},"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":"e616ce9c9cd3b037a834c12ff22f478e80e5ada70cbd2fa8e0ce70e1accbf2dd"},"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":"b9e38cdfc885bb22244b32a1147212e05afc07fa325dfa77ae4d4b57184412b3"},"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":"42680c59bd8b671f6a9bcfe07b19b5ca0d91b60e53a3697818d0ac1f3281f5fc"},"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":"ec105bf1fd9b035ab2ea0e3c79ca302f1d1c22ce4b27685ec998e09f8f2c742e"},"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":"d99bbead0354f5de0917d1307c38cfd0cc6e03b53deb70d09b249cc2f13a65dc"},"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":"a303f9b0d59560b21d4bf82e9c2e657d4a753a97ae143086677f5a25897ec09b"},"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":"891caac32799d5a6583370518bb610ee79f1120949fe05825b98145fe06bbe1c"},"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":"8d0c54c54a9b098e9647a39f44f7735cc0bae2dfd37c1e6a78518be3f287faa4"},"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":"681976b439d1f8df68dd313c0fab066c23b3b5ed7bfe253f0cf1a1171e0e3b14"},"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":"3103c66eecb1644727aafb24928c2eb285c3de03d5f518a6183ec7cf23ac5f23"},"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":"858eda4fcdec5ad137923bbf9ecb353cba3a62f779b4f7a2a5296a7a3cb64a85"},"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":"07fda36a4082a81b822349511105cf25bf93fbfcc749f8121eed216ab5f8e7ee"},"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":"d569d5add80609a43e1b2733bec6a13e7914dd6da28398c92c0a019ca66aed9b"},"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":"761713cd5df00af12d9fdbcdab3a1a49c4d5baa61c47a24c6789c62987e70aae"},"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":"ac4e857f2232433e3e0d8e76f08ff19aa1a2fdbfe0a99f87cdef4d04e20c2d67"},"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":"6e9307737ba93461f854e8bd2d87c6fdbb994fd6fa2a4fe8a0539fccc419c8f3"},"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":"c4bbf8c14902dc2579395fb5c31828c570da620ef4032e99ab1773a3db1b67c4"},"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":"4fc87061b89471c359ef5c31359967d26477104ee03cf0d29f24d43d2c2aa492"},"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":"bfb3c2300f0407d852f7b409ebafc7fdcc089fde3e002c344407ce7aa5a89bf7"},"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":"1167a88d9a6e32e8ec953fba836ca51438077b28d89fe0c574f62a63d4c95f51"},"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":"a9924d0cb4ec42c19bf8c9d3b31320ec74eeca994833690122e9b64c46c6d34e"},"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":"78cfd8333cb9e0a026be6482bba0d4311e2e029d6b6d54eb231e988f88941d10"},"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":"2948cc5a16890892f8dfaf8beb15a97e1cb71d7d5e3eaf2e9f57c01bcc0df072"},"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":"a6b0560273ec737566e5c2aaf07c040a776f819f5ffe73ce202483c691195a27"},"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":"82b3d88800bf8674a30014d4f2c2111b3b49d5b0c93fd04249c6e8b2d968f83c"},"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":"94da486dc9ffae8c71eac7c13abc426ad7cdb23c0b348eae80265c66408680ba"},"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":"4f4f601c8bc90646fbf2766e0b4235e10528bb95632cda9e87fedd935fb0ae05"},"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":"a730d370dc2726509e2350d50a2682571e2360f221403cdbbd06264a0090c4f3"},"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":"760770b935404933eca174b1ccaa611ef3328e84b64b5a63a4d97e733ef67ec6"},"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":"e0f8ce80eef6193cd0950c5f8b49fd2e003237e322db84fe3ace0025c400e30c"},"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":"f321dd5a434ab11ad9c9f163f83ea8e0261329852bd85b3351f2873afdf0ea93"},"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":"fe5e38dbcf974a31ec0bb50b5a278f45691ed4c613229c0275541eb37e0cf0b6"},"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":"4120e6390fbf987abc7fe195d97f6a8bb78f94cdc58680f36da8499fd82002df"},"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":"2a35bb394af997204aa8de456529262e81990c2b57977babf7a5661463977f25"},"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":"72602c8250aad1c090471b34c676386863fc10bebf98e2d28adf33b206f7bf20"},"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":"7e21356ee3e01554ebee4091793f40e7ea2a9230047814293a3725b576330ce2"},"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":"f77b4f22eda0334d0cdc4884d2994bfb74f8cd6ebe67ed46b71b864c9a245af5"},"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":"e427415c0941a44fdaa631f40e639a524f4e2372cbf9d060c092255d5e2415a4"},"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":"2babdd1d235528fcf638f5d17d8e171cbeaf761252f24ab7f25c3b61d36b39df"},"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":"8299d3c34315ee37cf7296a5152f4d7e8b47e66791723a00752a0bdee9dd2987"},"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":"b0484253565f36b5d63b0eae8ff2f1002bb99842870ecf67cd07a86d94b05c49"},"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":"6d311ba5fb812d10d667158aa1abf62c3af9e6eef494fcf98f9d2a651c5c2ec0"},"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":"facf2dce0995b5bd7b84baf0018f305c52c43098a54162819ff3f31e36dd4bc1"},"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":"b528f4d3c10f97fcd46148ccdb6c89efb743be582db40c3d8ab01262a2021900"},"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":"35aa58d3b8fdaa1ad3a4586e214614d1595159b6cfc3de1664ff068c202b5e1d"},"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":"04ff46d4f6f07ea39e656658ca05e855c1be9a3a6041dcaa5a7506f2b9ffdf36"},"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":"20f2734c3269632bca20e5ba0de30012022ffd6046eebdefdb9892e1f5b31626"},"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":"91c503bf11c2f34be345325a7d6621f21f03cf286fa60d9f499b449b022a508d"},"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":"e8593ba5bcbc3ff6f29262abd7412df16ff6d27553a2546d1ae9d07ee8dc316c"},"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":"f6ec836f004291475acd1791e8940aa7e2578993857ed66c98b79e90b519f296"},"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":"ffbe73463d6f36395f1dfcccf5e5e8ac8a81120cc78ddbde8ec245f55c8f50cc"},"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":"b58c3f40ed55a32ba31efb005c36b7c894cd284897c98fac774a92f37e5acefc"},"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":"f9ea6d73deb6d3073c79f655d37f3336947d6ed77713a5dd16860ed7cbbd25d2"},"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":"9703269cd27886827053152d2eac8051360d7ce8874dcf0aad91122e0ff54557"},"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":"b6ab2208219faf1d7b7728a56fdd73674f86e8129fcbf71702ba29d6c787ecf0"},"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":"4aef47d48af40dd6dce958f51fc7a35c590d8858adf07499a3d2f78557382bdc"},"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":"649524fd2717cb8b1ce32501bb56278445a60fe2cba83590f683ca8a7a635f17"},"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":"7ca0e182bd71cd9a799b77d3bacc58306639d202b7237a0ea902bda9d9da9d24"},"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":"4b7c28e6d2bd02172373dce2411ee04e78ac2538f7ccf240ad853fe923fb7f3b"},"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":"37464c48c723a13af3981df86bf80f45f08711ebb2d769d10449df5092c55940"},"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":"d26c986bf1babfc010de11e593aef3908e65897dbf124fa9daafb235565b1982"},"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":"1fa9a0c1db46ac0bbf0b454f1535d4a7ffb5c0ceb891db336b7feb878bd88809"},"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":"e4d30cfca04cd2758931ca8c9aa066b8d7a29ba2d10b0ceaba9050182ec7bf25"},"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":"6852e6cf49a458c289ca862ea26b95b03486c7aee8d933e6f23da12e0e9fd989"},"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":"9c5099c76172abf9d27b8c425a16798edb4d4157fb08e3051c7499e628c4b3db"},"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":"1053fc87903c174bfe76f7d9d9fa98b0735591396efcba10bbf598e8f9f2bfb0"},"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":"0cb6b48083ac66ff34be0b3870ef57a6bbab691d4c725ed4bc4f695c94997d4f"},"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":"6e3152639610518fd1af0eabf559df5f22ee6de0d1182f8a6a10324945849bb0"},"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":"ae9d38ad5b64fb7475824dff88d8c2eb26c54cee14ca05ee04b27f7a2dd22dfb"},"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":"afd37ad5d8f1248f811d5c7cbe20cd0e703ee7babf290eb12391c5b2456b5f81"},"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":"145099f748c2e71a9e5d25f18a18e73b9d071384e748e5e7e47e2c396b3e28f9"},"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":"29c2e8de161926366599327ae889783c5037e528c71e69995b0eb752ccf73a10"},"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":"1f7d9f174eaf63e8710c7ed5525074b0820ce376ce421905f97c57a8793a3e9b"},"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":"5773de9ce3996065cb36d5252845ab34152db568eab42aad8174c9f906e13cb2"},"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":"55a71ce30a5cff8563ca392f4559a0ce43b14886949474f3ed0c99b53b020727"},"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":"7e1cee96ab7e55954389f4545f15145375223f7447b402a0988177b9c45dc4bd"},"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":"510c8c68ecddffee8718c409ee6163502cf1abd54aaa03c546b8996706ffc7fa"},"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":"0885d5ddde3f8d606bf874534114b8ae5f8ddd8f34c9b1ced3e582e5c997cf2a"},"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":"e01273c9564f8696611ff321415981bbc9f013fdd27246f2712e7c61e6ff3a7c"},"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":"1d417b0b87260451a4359f4bf3fdd45963090223e294f42a4f053ae20069db45"},"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":"b1957dbe550b6798a48d1f89b15fd32ee2732ced3d36b4f383edb26420f54030"},"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":"a72d368db1f5aa5a0d760827501987a76c1bab28b47e025f6b653c18d811a54f"},"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":"04546c3ad712b2103f54bf097fa4ae6b15dae8cae84191f640f1e2aa9d5d13cf"},"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":"c551f400eea872bd36e3fb8b021026fe7d38a9faa79692e56dd051f663d51d15"},"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":"b244517122910f1baa18f847da1dc1d4e2d225d18fd12254d0b493c79ac4f7a4"},"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":"cb7b328cb1f0a2ce55ff5540e20c21b0898b94a2d064047e374c26923d9d9242"},"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":"3e7aec044e2c5bffaace231caf8cd3baf87e636a670cbe872ea96467349103f1"},"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":"fb314392f8922a3d7b7215a55c5c21eed57d2891dcffb953586b16a737968623"},"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":"53caf088d5c2d28757186144d1decbe31e81fd0d3940d7811527e982e1be4e04"},"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":"7a5b23c471b9d4b1c2a2d938196b0358deed57a7275ecc779be7317cfca5ee4e"},"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":"d1d4cb549e67db4a00875a4a69514cbe8c62852e3d249be8824f0c55367755c4"},"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":"94b36cff1813f65137f3b360926975994b0b566500b886740c816f527c1532d6"},"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":"3a1f84b9d3f83ca77ce13bebaaa524077c2be7267cf518a3223647d33db44ec2"},"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":"31b549affafca332ca66eb66cbe6ad8626befea20133cceb6649584d1cd738ff"},"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":"28d75bfe7e24c70b120a8f0819247e9fe5a1f7ef565a3cbac5d402b091d2a5c5"},"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":"69489682800990115a027244c912e1e650133dc7b44c0654c4173467536df5df"},"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":"a6c100d622e29db35991fcf039e58301f7b4986a1e1810867691879993b49ff2"},"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":"4d591a407c8fcc75759fd7cfcbddaffdd28c600926bc952430ab415180901bde"},"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":"032f353363a4318ee4e2924ebb6390c22e9097da18cd272bd626892f9e773491"},"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":"3e7d22a4511d95506eb4ee489cff1d74f28512214f37a15d33ee246e37b5d4e0"},"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":"218ee7e0e8450f8a875fafc9f39b420d7371705015bdf5629f9bd7fce6e00b4e"},"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":"b8113e3999cab0beb0946eb076c2cf096ee29097e21997a81f30053dad5c6cf6"},"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":"45f36e52adcc55fcdd8889f7a7dd0f9dc9ea76d619bd273e6e33f126245cff50"},"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":"2ad1bea56eaf1e81668fa542e8d68075b179893eaa1551824ad81a9261beeb78"},"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":"60fe5c60fa07f3341dac58f85b8f5a31cecf7e20ca860a9a26f25ed836b5ebc6"},"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":"b098f7b8dc3c5c7a2e3ab22ec5ac10a77820490e56bf90d196ef34d8205d8d60"},"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":"75eca377e286e05b17bdf67934f58581c96d59a35fe5ed1ca6b242cf1adcaf96"},"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":"cd7f8c2d7b12ab168f392eebbe5b6d48ce8ca23660a274a2e91c9c98fa677986"},"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":"66d9345d729fb3a1aa35cb9427f53b62a87860c10ef05d6ea08a31a7be985caa"},"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":"e8d6360c697bbd9a9e4b85d6019a247b38c34bf0f20695958d7dada49dfe2866"},"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":"9e1867e4bd9c96da85be41dac97ac6994e4071e222946b7039bc778708254f3b"},"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":"4c6111c89d96e5059b654c20857485e9293a7e40d7932b2325f746561c2ae887"},"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":"80d4b5492ab5d7e2c753af5f1db0a5d8c8389ffc8cdc4c9e9d1d6be2a6d86464"},"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":"56b6303cfd91eddc2933b1573469d6e31669557b22557cabc12c2e77c68263ac"},"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":"bbdb07685d502eb5409b89a738baee2064b16fe0c273c17c4860d14f180c7591"},"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":"a193d94f8068d15fa933d7671d0e3beaf190aa1faea58bdd2a50d9e90fa2e9f4"},"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":"e8909541d1371950f945b044994fe02388883d9d091321b3cc2d98eab939a138"},"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":"e6f23347456802e76759f709333da07f8204040bfb9c308d2daedf782bbb2c75"},"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":"f09f34aa051f7d030867f197407bf2499cf386b1d4c331666ea954a3825a7d01"},"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":"d0f3eda600ebb3abaeca1a16fbbffc0b86b9222a414b28455a6b7caa26e69f70"},"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":"86881232c2756b705353b3126ebdd3bf36e2bc585f7aa082ed2039648160eddf"},"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":"4ca687aef847fa3d5f9910c1ca203222a490077e2ae31f984a457504b0622855"},"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":"641ef438aec403bc86f13c02b8db63e524f8ad6e3a0b61e21ed708e5f3a60952"},"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":"1d6886325ac840821e709c04fb7d0e08d3fa066f1d6997c0bdcab849138cc620"},"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":"e6130644799b9a5e96fa5815edf4d0ab2b459115eca8b2e1e1ec4d604c340b35"},"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":"55e422f5e1acc145f270403d1785e32154e33fd77bea224a9e9570a25beb16e6"},"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":"f6817a4879dfc51c6cdd4978f820872dbc1e70adc214573e02ca6be749520605"},"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":"2242bcc2d8dabac7c4638dd09d4c7fb8a92099847505620d1dfb5f064ca89066"},"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":"6df415e1d1748366ed66917e17d4bb2b9819e7b62f5f8ab38ffca59c0f3511e1"},"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":"0556b6ec62011d1edb10de408324166605c370324050e5ee29524b81987dd7be"},"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":"f6b2fca1a6fffe28c8181787566c6b05140c4a1af565e2ec269b111d77c9a69c"},"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":"111f48e58c000b098c426d563a86eb7165613826182d1a13d00ab1ecbda2ad47"},"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":"e88ee61dc000762e9c4c94a1ff043aa32718fe2be5adea0eba50c528821a52ee"},"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":"a4eeb6b1d7ba6bc64163b26da08e9986fc9b81f2d6c0990aecaa9889e5a1b6d7"},"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":"aa447e742256c627cfcee5c1fbb1ac8c22a7f4a3f89a40df5d3f612fe9cb478c"},"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":"566b802e3efd1f3da0614bf31ee310a399f9980da7247c9064de950886004810"},"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":"1738f51eb3ecacdcc87e0e76f966ca0c879cb52c266fa124d583e287bf8eb34d"},"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":"7321e018750376747ee4e0b1d60e61e2c59e12c6574de15c8471020a0bec7bd6"},"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":"80992983ec656358ad707e2203b81bf8c904d629299e082307919052f1723e4d"},"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":"5be5e7787abcad40ef35270db04b47886d82511e277d6bdbc221e97855ddf5f3"},"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":"34f93dd5ced07336515330cbefd9ffd3f4e9f339b9163c4d2e4f5ef4fc8b3073"},"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":"858848d013e63b6f81d64332e3008452913f6cd07f3b04701612873fe211ca8f"},"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":"a9cec39ae0ae6d1dd5f335f766b10fe31b390f6ddbb43955b8d6dda3910241a2"},"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":"baaeda2b22de2a1c217e14685f638c5d3cbbcbd010f63f379689728e4e9c291a"},"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":"b8a7e2c4a1fc753ae66f9a296bd0cd9ece0344f9a178baba65c144bc754544f6"},"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":"6771c80dbe3b1446f89ce29b59416b765d24878f7c7091d9d1536bab6382e9d3"},"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":"6ff7bf5b92f709a5f593a809c321dddcafdcaf8a62ad436a1e868bf8fb652f88"},"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":"1df9edcab5fac12ddf5f3d2b97f38b7bfda6eeb2f3e0fca4243e103f6807d145"},"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":"10df199c662db88f3741d9042348a55296e233a9f3b77ae24e4067642b3e7a3b"},"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":"6083b6861bc53d617c8d9dc7b175b571298ac40ed0409b09334ff77e87d3078b"},"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":"e3aa88e790fec9f6576b904d3bb63f06661b64b8f1ce5590f10c36ca654a4f93"},"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":"2c1f3094fb474a47f03388b102ceb8a7e2c460092619f3b1fac80749b22a09b2"},"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":"32f6b1515703d63b9b0e6eb6570d01c18113bf4511ffb10d95faa861b8c3bc2d"},"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":"801fd205d13a6c3fe5fdbe92c506558be6762643a98b00d05a0eef3c93ccd65d"},"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":"075ca5d95642e2cff8399c8dde424270716377132b248169a4b3d32ea8538067"},"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":"f98d677295cdbf05286dc63ab04bfd3bd33f6300c52cc1e97470f484796d57df"},"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":"45f36ffb3381ee2a812e5254c14bccd901ab1d892468eea1f76f9677f0d86816"},"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":"91247536749be5194b6c03d14d7d16d493bbee04a2ba22037653a37ba2d6c2cf"},"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":"82ad20f133ecbc01920b6971baf7ea46bb2e42d24ee2423c6b6563afc123e388"},"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":"28be19754a75b60e501021412ce121e8e3988fd307c7f9fda1a95c88cf0a35aa"},"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":"c455a139c6c47c4a12f3a14bebcab30dd84ec86ae8c54c8d0d4fdb24a96c18f7"},"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":"3b1bb76f40ef19d830efce25fa3a76a2a40200df9f602256cc11e083a0abd885"},"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":"77219e0ef3d586323b5f6a41ea1e0ea0e3b58218f1f765d65c5c05b0bcff2770"},"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":"b577c4b8d3d9c012af5a582ff9d365faef4d9bf5c577c1af349e7141ec84aacd"},"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":"a7715178d7b3cd067891ee702564cc369de189c7ac16307539a4f9f7b225742d"},"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":"78b674e75b57cd03a28639ad7c81a286d03024bda877e702e99a3cd785d2fe1b"},"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":"7395de08169b8a91ae6ebde5f9ed27a34deb255a1e8b5ceb9ebb3b1ddca89585"},"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":"7063018fd821b18f3c1caf007ba00d3a859ace1e0916f07adf5f8f39adb1b623"},"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":"6dbf44f58daa9b8dddc53387da41b8cf159a04cd8a359595758e98731517afd1"},"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":"7e6cda59912cbe4d223b252d7b915ef3e4557aed9625a12f06c85c2f830e3162"},"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":"133c9b22f1e1ce69beb3d2394a9c07acb2b9d26373b6cd3698bc8f7e63e72e4a"},"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":"0d39d2e4f77b2080c8939e0aed566a1ba2f796978ab3e29e83017c9b3ead36d7"},"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":"2c38ee8c5bb60a826f142e684371778cefb2dc1fcc61d89c2ba6f41a77307301"},"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":"27d7601e7e24bdb2def77d6aef4c180b6ad6643494db59696b7387c5f37d8087"},"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":"5eae2fb84efb4f5557a4b93b216a649216dd6d7142372fef14b1326ced3e62b7"},"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":"3e2c64ed66f4101a18e2e1b404a483ec99ba170ae87a79b08cc9ca1ff48cf96b"},"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":"1e9ea31542b530886f56489994086adf86f360495e053e0bbe09062cb7d65126"},"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":"2b7e4b3ae3f8dcab8cab893629739478cea9572c353900cc36305d3054124f88"},"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":"8e6f7c6e2c7667a059535c118ab9fb7b146bf89566f7523456b947d9ae472236"},"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":"3c84c5a4ee93ede954fa1cf844d32b0148dfbb310e095b8db938c10c863bc58f"},"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":"bc87fe06aed6456f2bd5bcdb463fa5753528ff45952964e10d61eac2896a376a"},"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":"11e55617994e94b285ae0b476334fe4d8d4ebd67905602dc3c0fe26e2dc6414d"},"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":"685124056491cf3ac194c7b27f727edbaa60583b0519be627d21bd9fdbfbd2db"},"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":"6d03760595ae94a58471f276fc223f333bea52d12009539d27a9250b0dfcb11d"},"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":"43824fa0329611cd0f2ff839d347396c9afca94b4198e3cc7dfebfd9e805d0fd"},"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":"e73dad20cc4cbb1599cef690df76ddbc48ea76a0ece1689126c71449b89c7c6a"},"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":"0d3231a417a587820875fd1bb94de1f472d45778d5e664ed81f26282beebc5a6"},"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":"943f09649385a84f32cf3da4d5d0a3dcb49c6cf8ae57b3d41e42c8cbdd5e3495"},"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":"2d922d149692e9d1ef52e220febaaf68fac1055c557cec779aab7adffa9a6a30"},"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":"a4fa3cb23680d836feead66191137eab7849cbaef9a65c89e735a22f6a272b59"},"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":"0f43e071ed365296cb15131101472301bfb37352bbfad8d902b35c364b6ad8d7"},"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":"1b33b348fb24ae75b5fdee506ff9a1c51aea7240a377956d4dde409c7462daf2"},"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":"86cc9c894563a4442b9e4f76e0ec9bd822c71b459a80814393f9052fd2b9401a"},"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":"a305fe78399fb24d618a839849609074ff35fe083809612314b944e3ebb204ab"},"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":"37c32814855b70a15b015550450eb9a48bc2067b40250c631e54bf6af271cb31"},"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":"e11494e96764c7420ccdb78d67a4599e667a2c1b0af2796b3eb67ef285108cf8"},"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":"1dd0be6f256f1e568c1e4997b3514aa8d7fd32b10ac43b57344817550480f5df"},"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":"2cd13f36b82728c68c77cb57d783d49288654d3d92c1ed211e55c3b2c0b3ab70"},"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":"495eca112daf851e9965015403539fbd44c81a16e7d6b8caee7b9b5c483f4c35"},"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":"6112a0c24bc4d238ffc832f569c336fe3a0eaf26339d3db9488707d6bd19bef5"},"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":"ed43187b91b8cf4204010898eb82b776870fb5cb15a6868de05f6192797d7019"},"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":"eeb866e45c0430f438840230a541bf6d97a4b2a68e86ed2c9b76225fac19f3eb"},"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":"7a490916553bf9df2933bf5e53f15d65beb0a781c08bdb647ece1cb630efa83c"},"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":"012a1631ee930658df72e7873d59efa985ddaefc71cc7d2ae3312d084cd24305"},"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":"644b7551b6c9079bf3a4b6c7a36b856c259a2763268bd54f8ab0db5ff32ccaaf"},"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":"e6be155e653fd961c5e6cc60bb51367057772c47d9ca51d29d3f0ee27f8888d6"},"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":"23d472801bed16216c55348b7d6969c017bcbad54881261bd70ee5b22775dd9a"},"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":"7da96b7ae2dd4d1692f70031a4fdd310e33e001da32c9119f1def7963fe42c91"},"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":"82581bcf14099075b2442d2bc5600106a58b7af089f70d61d9a0e52d93e3481c"},"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":"fb9f6054c0d56b4f3c294c8008ca2688c407c5897b02c3761ad6b0e639fde0bc"},"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":"2fffb4f4691d98ffc09b1cff1fdc9c522edcad95a89e261b4b3dbaa635788652"},"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":"fcf34e0c18535f057fa916ac26f552cb96e73110b3314a22726d4c8d9adb06ae"},"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":"e811906b815845516592bcdeb091f8b7f47f2cfa1f69ed43500b8011f6a1b14a"},"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":"510fb7816f9ccd7085e9cbdec4359e67122cabde8d2d997266287b88d854d6b8"},"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":"dc283dd3f84877549858ed5bf79aeb112b097272b357d29b5d78c608a99cdac7"},"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":"fa45049da4597d5be045eec1402aa9b413df4a162945bec438816013d01a3dc7"},"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":"d1ee2c844a4e30cc33ea4a1e098795f4a2a5b2aab9737c876540e5813248bb31"},"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":"2f53d4b5cdd0d1bb5678d92d1a131796f99aae571314e242e6a718d1275f2dae"},"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":"ce9d811bcd862e9761f5b1043ef8605e026162d934477849760409d5a2ccdd36"},"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":"5a8d767caa81d63b465269a445dd42549aaf0fb8a1b8528302570df28e51be78"},"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":"e524001b882c07080802d0f8b77fdfb764149a401a778fb5c5a6b8f392f99383"},"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":"1690914b81fb5df9ec186e08bb8c31aba32b97a424492509311f78fc34eb16cd"},"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":"8e86a2772fa7081b07391e69e3f11ef084b4af4e0e1908fd62eaac4dbb7deb93"},"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":"6dabb8787818487fb72d0210d834151b81cc7951c8badf1763f787e069d112bf"},"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":"2635ae23cc8941bb4936c7fe5f8337fa282a8781867a18d7c00734052d84779e"},"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":"cd84db4c157af0920dc501b855d01b2d7e5b48d818e3badf9d5a37a17ad340f5"},"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":"e318f0a43d69676007b6d03341957e093aefd6c21e5d828355ec720722cb72af"},"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":"1093771250f690f7d2a2161743c1da16938f9cae17c685176870831cde620dea"},"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":"32728a006e4c638f1df2a124da62e7d069211da5d20e6494457df645321c03c6"},"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":"c88c5b5a6cfc14528bdf79d8803ed8e925c7cc49d6aea718adc4b39424542133"},"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":"349646aa47e2cd72acc3bdf52c6ead048187cd9527f8168b9d9e95782eff8357"},"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":"c2c9651cc9fb28b61f9dedb52525fba84d9ad4f683a715c3fb8c562c4c83b230"},"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":"56be4a2951940c6f72677cad313f16463e00e3df2134678f7e361aa3e2d8b310"},"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":"041becde7909f1ee93133e9fb7adcefc5e1a9ad3bcd5a46cf3b99a075d9517e3"},"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":"fee6a05ca236e121379d075c29b18455476e1ed2912b769540d67ee3ffd3a7d5"},"taxa":[{"id":"CWE-798","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":"28514a04bf0faf148178a1e24a7b3855ee472a2911921811f30a87b3aea2414e"},"taxa":[{"id":"CWE-522","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":"1bf289d146f132f31d6d06242015bf0dd410af38b3bd46d7314678f75913212c"},"taxa":[{"id":"CWE-319","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":"fa79da2212787d18b80412f41011a25e6403eded66c9094831ffe5d5720e8440"},"taxa":[{"id":"CWE-319","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":"c023ca697e4c16ec211f630b2febddc8ae226794dbc3b5518c5fd63c8b9ae5c6"},"taxa":[{"id":"CWE-319","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":"103f788e243b56cfae6367901d696917b165aba3c88718b5f2aba913e86a72f7"},"taxa":[{"id":"CWE-522","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":"1803d19f667df499a21d4add50d8d476d49cc6a25f9befa843865cce5cd31da4"},"taxa":[{"id":"CWE-522","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":"2763045a7bae8600a22e14c5423fd096b1c1bd0c6b424a675a01427bc76cafd7"}},{"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":"659c4187eb047b98c4e32ec7363ff3e547f32921ec3ead1324fc3be3127bdabe"}},{"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":"2dadf4c9e83162b0be5fe082e10b771d6908a7c83adee546b4e483cfa5f3f94b"}},{"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":"807f7efec94368e1a12461dd812711b04ccb1a1bb87ce8afde59801d73e32c5c"}},{"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":"126a6b28ee96e7cbabb1ac91c5bbbdad484159f439b41ea652d5e7a0a1a4dd48"}},{"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":"3fe63923dd21efe1dc565062116f7789aea53aa3c8f1f8b40514c405ccd78072"}},{"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":"8ceb5a36b71855fb6c323533b844c0b5a2cd468026ef09ff9cabfc67f7f2e432"}},{"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":"68b9749fe3d3f1c73c17082b9467698e0be359bdc3edd17268bb0a5654b40f5a"}},{"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":"f354ed819cc7bc0ff4cf9b564be827a4dbc786a1b81fd9fea0dae187a2a2581c"}},{"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":"a06a701703ad9c9c84688a539a9742fe20d84024e650550d8c933064badfbf61"},"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":"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":"3041508575a53111f964db1f1528ec67faa754bfeb731bdd9fcd5a9567d822ca"}},{"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":"556e7b33bfb91b73792b3c47942dc043aa1332904a9a556c5f1a1601962ad1f7"},"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":"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":"10644f7cb947193003d001de274d67cfe8c66e4cd1e9d3aa40374c68dfb7185e"},"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":"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":"7483f181f9433e6f39c08b99c21b699491ea26380888a6db6ff3864b4111b704"},"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":"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":"0db72d5f1bba1fb54788f28d8e4605702fff1d57ab196e640d0390e3edd70176"}},{"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":"8b03ac3c87a003755819785aa2e5f180539632e8682f1042af4ba23975de3515"}},{"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":"b3f9f666e779e88ac8eb93799d7b1084dbb6521e9f1e572c0044b6e71a09931e"}},{"ruleId":"D32","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":"b5b1b81b3ef309e514b6f53b0934ddcbb5e2070f4c1d59f87e88c7fa59166604"}},{"ruleId":"D32","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":"aea099b250fb92dfdb31923cbb5d1824cc189b5f1bd9a4761172e4c5ded6901d"}},{"ruleId":"D32","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":"472599eb4377cb2deed07d20077d27e2843f295e3498b205ddaf92d66855837b"}},{"ruleId":"D32","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":"784be7e11624a1a9128bd92419525a2db7de6ab2a280e793f13279cd07c729ec"}},{"ruleId":"D32","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":"6e2e7d3c3c4eae10f11ed3c4e2aad10d93a54724469d15f483e39bfdc6b98cc2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 6 of 1508 analysed file(s) have no living knowledge left \u2014 their last meaningful change has decayed away, so if one breaks, no one currently understands it (counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 1508 of the 3944 production source files in this repository met that bar). None is large enough to earn a read-through of its own, so this row stands in for the per-file rows rather than raising one each \u2014 most significant first: ghost/core/core/server/services/newsletters/emails/verify-email.js, apps/ember-admin/app/components/koenig-image-editor.js, apps/ember-admin/app/components/multi-list/list.js, apps/ember-admin/app/components/editor/modals/publish-flow/complete-with-email-error.js, apps/ember-admin/app/services/modals.js, apps/ember-admin/app/helpers/gh-format-post-time.js. Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: settings-fields.ts \u2194 editor.ts: \u0060apps/admin/src/editor/session/settings-fields.ts\u0060 and \u0060packages/testing/test-data/src/selectors/editor.ts\u0060 change together 64% of the time (7 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u00600237ab16\u0060 Added the X card pane to the React editor\u0027s settings sidebar (#30611); \u006078561ea0\u0060 Added the Facebook card pane to the React editor\u0027s settings sidebar (\u2026; \u0060771dde54\u0060 Added the Meta data section to the React editor\u0027s settings sidebar (#\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/settings-fields.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc52e0da1ee59ce682c2026a8476ba870d6e41e66e305a06ac6dc1a4574e1af3"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: feature.js \u2194 labs.js: \u0060apps/ember-admin/app/services/feature.js\u0060 (context ember-admin) and \u0060ghost/core/core/shared/labs.js\u0060 (context ghost) sit in DIFFERENT parts of the tree yet change together 62% of the time (40 of the 65 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 40 shared commits counted here, the most recent 3 are \u0060c2a3ad55\u0060 Added a globalSearchReact flag for the React Cmd-K search migration (\u2026; \u0060791d50c1\u0060 Removed the tagDetailsReact labs flag (#30914); \u006019c48912\u0060 Added an editorReact flag gating /editor between Ember and a React pl\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/feature.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffcb8ee4e996ba6cdb766528902065cb5c71394fa221a30d4b5a5795048849f"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: editor-session.ts \u2192 editor-screen.tsx, post-settings-sidebar.tsx, editor.ts: \u0060apps/admin/src/editor/session/editor-session.ts\u0060 changes together with 3 other files \u2014 \u0060apps/admin/src/editor/editor-screen.tsx\u0060, \u0060apps/admin/src/editor/settings/post-settings-sidebar.tsx\u0060, \u0060packages/testing/test-data/src/selectors/editor.ts\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/editor-session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f329c4c2f09d76eb3f84d217f9bbec961e27a186e322aada3214fa4dcfb079"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: top-content.tsx \u2194 content-stats-service.js: \u0060apps/admin/src/analytics/views/stats/web/components/top-content.tsx\u0060 (context admin) and \u0060ghost/core/core/server/services/stats/content-stats-service.js\u0060 (context ghost) sit in DIFFERENT parts of the tree yet change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u0060cc4eee9c\u0060 Added filter dropdown for UTM fields (#25422) (at that commit the files were still \u0060apps/stats/src/views/Stats/Web/components/top-content.tsx\u0060 and \u0060ghost/core/core/server/services/stats/ContentStatsService.js\u0060); \u006066adb62a\u0060 Enhanced URL existence validation in stats services (#24046) (at that commit the files were still \u0060apps/stats/src/views/Stats/Web/components/TopContent.tsx\u0060 and \u0060ghost/core/core/server/services/stats/ContentStatsService.js\u0060); \u0060bc6de423\u0060 Fixed page filter for Stats \u003E Top content component (#23745) (at that commit the files were still \u0060apps/stats/src/views/Stats/Web.tsx\u0060 and \u0060ghost/core/core/server/services/stats/ContentStatsService.js\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/web/components/top-content.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e735cf43308d22a6bc9a222943633ed48b6ef230f13ef9a99bf09e3f53ea82f9"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: editor.screen.ts \u2192 editor-screen.tsx, editor-session.ts, settings-fields.ts, post-settings-sidebar.tsx: \u0060apps/admin/src/editor/editor.screen.ts\u0060 changes together with 4 other files \u2014 \u0060apps/admin/src/editor/editor-screen.tsx\u0060, \u0060apps/admin/src/editor/session/editor-session.ts\u0060, \u0060apps/admin/src/editor/session/settings-fields.ts\u0060, \u0060apps/admin/src/editor/settings/post-settings-sidebar.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 4 separate couplings, not 4 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 4."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/editor.screen.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a588c97ebf75f922acf60bf81ff88815c45983318bb7164c0ecdb0512d8e9f3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: table-lists.js \u2194 schema.js: \u0060ghost/core/core/server/data/exporter/table-lists.js\u0060 and \u0060ghost/core/core/server/data/schema/schema.js\u0060 change together 82% of the time (14 of the 17 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 14 shared commits counted here, the most recent 3 are \u0060fd4ca592\u0060 Added a table recording which metafields a member changed; \u0060918c250d\u0060 Updated database for upcoming Tinybird automations sync (#30567); \u0060115c9210\u0060 Added gift links service and admin API \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/exporter/table-lists.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce3cec15e56e3072104c18275c90aa08b830e93bec9ea91f93ce26453c4092ae"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: locations.tsx \u2194 sources.tsx: \u0060apps/admin/src/posts/analytics/web/components/locations.tsx\u0060 and \u0060apps/admin/src/posts/analytics/web/components/sources.tsx\u0060 change together 80% of the time (8 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u0060bcf73020\u0060 Ported stats filter component and behavior to Post Analytics (#25641) (at that commit the files were still \u0060apps/posts/src/views/PostAnalytics/Web/components/locations.tsx\u0060 and \u0060apps/posts/src/views/PostAnalytics/Web/components/sources.tsx\u0060); \u0060ff7601c0\u0060 Ported stats filter component and behavior to Post Analytics (#25641) (at that commit the files were still \u0060apps/posts/src/views/PostAnalytics/Web/components/locations.tsx\u0060 and \u0060apps/posts/src/views/PostAnalytics/Web/components/sources.tsx\u0060); \u0060566b7180\u0060 Updated dark mode styles for stats overview (#24164) (at that commit the files were still \u0060apps/posts/src/views/PostAnalytics/Web/components/Locations.tsx\u0060 and \u0060apps/posts/src/views/PostAnalytics/Web/components/Sources.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/web/components/locations.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82690c136e59b498d0c6334ee09cf2c1de40c661b623ce74fb9d545df9a0cde4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: stats.js \u2192 content-stats-service.js, posts-stats-service.js, stats-service.js: \u0060ghost/core/core/server/api/endpoints/stats.js\u0060 changes together with 3 other files \u2014 \u0060ghost/core/core/server/services/stats/content-stats-service.js\u0060, \u0060ghost/core/core/server/services/stats/posts-stats-service.js\u0060, \u0060ghost/core/core/server/services/stats/stats-service.js\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/stats.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2351bd6b5009202835c388326f1338d4e1b334fc10228de470e7b7733daa01"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: settings-fields.ts \u2194 post-settings-sidebar.tsx: \u0060apps/admin/src/editor/session/settings-fields.ts\u0060 and \u0060apps/admin/src/editor/settings/post-settings-sidebar.tsx\u0060 change together 73% of the time (8 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00600237ab16\u0060 Added the X card pane to the React editor\u0027s settings sidebar (#30611); \u006078561ea0\u0060 Added the Facebook card pane to the React editor\u0027s settings sidebar (\u2026; \u0060771dde54\u0060 Added the Meta data section to the React editor\u0027s settings sidebar (#\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/session/settings-fields.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f451190157505ebf9fff28c54aa399b58ead173bd8ca8d4f0b33fea7e9d22587"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: feed-list.tsx \u2194 inbox-list.tsx: \u0060apps/activitypub/src/views/feed/components/feed-list.tsx\u0060 and \u0060apps/activitypub/src/views/inbox/components/inbox-list.tsx\u0060 change together 70% of the time (7 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060d0770050\u0060 Renamed Inbox and Feed to Reader and Notes in ActivityPub (#24115) (at that commit the files were still \u0060apps/admin-x-activitypub/src/views/Feed/components/FeedList.tsx\u0060 and \u0060apps/admin-x-activitypub/src/views/Inbox/components/InboxList.tsx\u0060); \u006081f6471e\u0060 Added like count display in ActivityPub (#23677) (at that commit the files were still \u0060apps/admin-x-activitypub/src/views/Feed/components/FeedList.tsx\u0060 and \u0060apps/admin-x-activitypub/src/views/Inbox/components/InboxList.tsx\u0060); \u006014adecfd\u0060 Added acceptance tests to \u0060admin-x-activitypub\u0060  (#23562) (at that commit the files were still \u0060apps/admin-x-activitypub/src/views/Feed/components/FeedList.tsx\u0060 and \u0060apps/admin-x-activitypub/src/views/Inbox/components/InboxList.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/feed/components/feed-list.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa7c4fb79d1d8889e56c3d07f628d1ae6c09c137b66ac20b10af6f726cf44692"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: koenig-editor-base.tsx \u2194 member-email-editor.tsx: \u0060apps/admin/src/settings/components/koenig-editor-base.tsx\u0060 and \u0060apps/admin/src/settings/membership/member-emails/member-email-editor.tsx\u0060 change together 70% of the time (7 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060225c9793\u0060 Refactored email editor into a standalone component (#26796) (at that commit the files were still \u0060apps/admin-x-design-system/src/global/form/koenig-editor-base.tsx\u0060 and \u0060apps/admin-x-settings/src/components/settings/membership/member-emails/member-email-editor.tsx\u0060); \u00607a3f0ec8\u0060 Started handling clicks at bottom of welcome email editor (#26661) (at that commit the files were still \u0060apps/admin-x-design-system/src/global/form/koenig-editor-base.tsx\u0060 and \u0060apps/admin-x-settings/src/components/settings/membership/member-emails/member-email-editor.tsx\u0060); \u006032cc3763\u0060 Added image upload support to new welcome email editor (#26600) (at that commit the files were still \u0060apps/admin-x-design-system/src/global/form/koenig-editor-base.tsx\u0060 and \u0060apps/admin-x-settings/src/components/settings/membership/member-emails/member-email-editor.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/components/koenig-editor-base.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3faa73f3f338648d8342519ad4e9d1df579efdcdd8a564f8afc604110cecf3f9"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: sources-card.tsx \u2194 top-content.tsx: \u0060apps/admin/src/analytics/views/stats/web/components/sources-card.tsx\u0060 and \u0060apps/admin/src/analytics/views/stats/web/components/top-content.tsx\u0060 change together 61% of the time (11 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u0060fea5fadd\u0060 \uD83C\uDFA8 Improved analytics chart bucketing for Year to date and All time r\u2026 (at that commit the files were still \u0060apps/admin/src/analytics/views/Stats/Web/components/sources-card.tsx\u0060 and \u0060apps/admin/src/analytics/views/Stats/Web/components/top-content.tsx\u0060); \u0060cc4eee9c\u0060 Added filter dropdown for UTM fields (#25422) (at that commit the files were still \u0060apps/stats/src/views/Stats/Web/components/sources-card.tsx\u0060 and \u0060apps/stats/src/views/Stats/Web/components/top-content.tsx\u0060); \u006074205e4f\u0060 Added utm sources to Post Analytics \u003E Web Sources (#24860) (at that commit the files were still \u0060apps/stats/src/views/Stats/Web/components/SourcesCard.tsx\u0060 and \u0060apps/stats/src/views/Stats/Web/components/TopContent.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/web/components/sources-card.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5b4e5e2c8d3443c4883598d9375ae8cde1c93ad08c63ddec993fbb49623a8d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: comments.js \u2194 comments-service.js: \u0060ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js\u0060 and \u0060ghost/core/core/server/services/comments/comments-service.js\u0060 change together 56% of the time (9 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00605fdc8067\u0060 \uD83D\uDC1B Fixed comments on gated posts being hidden from readers without ac\u2026; \u0060e76828b3\u0060 Added comment dislike server support (#28020); \u0060a1143ad6\u0060 Renamed comments \u0060inReplyTo\u0060 relation to \u0060in_reply_to\u0060 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/comments.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b55d3eec790d5b2c24ab214526806969eae102e8386cc53a1ba8a6c6e9e715e"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: stats-service.js \u2194 routes.js: \u0060ghost/core/core/server/services/stats/stats-service.js\u0060 and \u0060ghost/core/core/server/web/api/endpoints/admin/routes.js\u0060 change together 56% of the time (15 of the 27 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 15 shared commits counted here, the most recent 3 are \u0060f9b448ba\u0060 Removed /stats/utm-growth endpoint (#25900); \u0060e62550f6\u0060 Added stats utm endpoints with fixture data (#25068) (at that commit the file was still \u0060ghost/core/core/server/services/stats/StatsService.js\u0060); \u0060b2bf6315\u0060 Added JWT authentication for Tinybird API endpoints (#24133) (at that commit the file was still \u0060ghost/core/core/server/services/stats/StatsService.js\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stats/stats-service.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc1e725f172b6c9b26d93b0db6585b42c8af1321166e48d2d1a174a9a7f2c4b6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: reader.tsx \u2192 posts.ts, feed-list.tsx, note.tsx: \u0060apps/activitypub/src/views/inbox/components/reader.tsx\u0060 changes together with 3 other files \u2014 \u0060apps/activitypub/src/utils/posts.ts\u0060, \u0060apps/activitypub/src/views/feed/components/feed-list.tsx\u0060, \u0060apps/activitypub/src/views/feed/note.tsx\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d2e7f450f2628cd980b864f4f5d2229872ac447ea1632b2552348580fb303f"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: use-activity-pub-queries.ts \u2194 explore.tsx: \u0060apps/activitypub/src/hooks/use-activity-pub-queries.ts\u0060 and \u0060apps/activitypub/src/views/explore/explore.tsx\u0060 change together 50% of the time (9 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00603f756554\u0060 Added topic filtering to Explore view with feature flag (#25438) (at that commit the file was still \u0060apps/activitypub/src/views/Explore/Explore.tsx\u0060); \u006076da41d1\u0060 Added profile preview card on hover feature to ActivityPub (#25049) (at that commit the files were still \u0060apps/admin-x-activitypub/src/hooks/use-activity-pub-queries.ts\u0060 and \u0060apps/admin-x-activitypub/src/views/Explore/Explore.tsx\u0060); \u00609dbdfca6\u0060 Removed follow button from own profile in ActivityPub (#24104) (at that commit the files were still \u0060apps/admin-x-activitypub/src/hooks/use-activity-pub-queries.ts\u0060 and \u0060apps/admin-x-activitypub/src/views/Explore/Explore.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/hooks/use-activity-pub-queries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d958df22013309f37e38d512193f3eaeb2143a270faf60d91e84971c0ebc8fa"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: activity-item.tsx \u2194 profile.tsx: \u0060apps/activitypub/src/components/activities/activity-item.tsx\u0060 and \u0060apps/activitypub/src/views/profile/profile.tsx\u0060 change together 50% of the time (8 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) 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 \u0060065c113a\u0060 Adjusted spacing of activity items in ActivityPub (#22343) (at that commit the files were still \u0060apps/admin-x-activitypub/src/components/activities/ActivityItem.tsx\u0060 and \u0060apps/admin-x-activitypub/src/views/Profile/Profile.tsx\u0060); \u00604d36d0b7\u0060 ActivityPub UI design refinements (#22242) (at that commit the files were still \u0060apps/admin-x-activitypub/src/components/activities/ActivityItem.tsx\u0060 and \u0060apps/admin-x-activitypub/src/views/Profile/Profile.tsx\u0060); \u0060ec327bad\u0060 Used new feed and inbox endpoints for feed and inbox view (at that commit the files were still \u0060apps/admin-x-activitypub/src/components/activities/ActivityItem.tsx\u0060 and \u0060apps/admin-x-activitypub/src/components/Profile.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/activities/activity-item.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21cd1cff379c22a4c7bfb87655d76a6e629234e937ce50f70550bec487140c30"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: card.tsx \u2194 tabs.tsx: \u0060apps/shade/src/components/ui/card.tsx\u0060 and \u0060apps/shade/src/components/ui/tabs.tsx\u0060 change together 50% of the time (7 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060f364a9f1\u0060 Shade component cleanup (#27565); \u00605e02c7a5\u0060 Improved responsive design in site-wide analytics (#24059); \u0060cb9d9a28\u0060 Added state handling for no paid memberships (#23933) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/card.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5a0f20bca1fbba73d75e12c9b2fe40f3d19ee7cd854c009c44990123b5a3bda"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: koenig-editor-base.tsx \u2194 welcome-email-modal.tsx: \u0060apps/admin/src/settings/components/koenig-editor-base.tsx\u0060 and \u0060apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u0060bac54d99\u0060 Removed legacy settings dirty and focus contexts (#29545) (at that commit the files were still \u0060apps/admin-x-settings/src/components/koenig-editor-base.tsx\u0060 and \u0060apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx\u0060); \u0060225c9793\u0060 Refactored email editor into a standalone component (#26796) (at that commit the files were still \u0060apps/admin-x-design-system/src/global/form/koenig-editor-base.tsx\u0060 and \u0060apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx\u0060); \u00607a3f0ec8\u0060 Started handling clicks at bottom of welcome email editor (#26661) (at that commit the files were still \u0060apps/admin-x-design-system/src/global/form/koenig-editor-base.tsx\u0060 and \u0060apps/admin-x-settings/src/components/settings/membership/member-emails/welcome-email-modal.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/components/koenig-editor-base.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f30f1d5a45e9833f2c8a8179f07a8c04dd636c8db45d5f9bbdbebe7ccdcc8718"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gift-success-page.jsx \u2194 magic-link-page.jsx: \u0060apps/portal/src/components/pages/gift-success-page.jsx\u0060 and \u0060apps/portal/src/components/pages/magic-link-page.jsx\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u0060966c1ba1\u0060 Cleaned up gift subscription screens (#27825) (at that commit the files were still \u0060apps/portal/src/components/pages/gift-success-page.js\u0060 and \u0060apps/portal/src/components/pages/magic-link-page.js\u0060); \u00609c0edb73\u0060 Improved gift subscription Portal screens across selection, preview, \u2026 (at that commit the files were still \u0060apps/portal/src/components/pages/gift-success-page.js\u0060 and \u0060apps/portal/src/components/pages/magic-link-page.js\u0060); \u006029f8ab36\u0060 Polished Portal gift card design (#27757) (at that commit the files were still \u0060apps/portal/src/components/pages/gift-success-page.js\u0060 and \u0060apps/portal/src/components/pages/magic-link-page.js\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/pages/gift-success-page.jsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"72aedcd9413f8aa2fe8141309bc10935300a5f08b037ac2a58f1d2ca49c49652"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: feed-item.tsx \u2194 posts.ts: \u0060apps/activitypub/src/components/feed/feed-item.tsx\u0060 and \u0060apps/activitypub/src/utils/posts.ts\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u006015f6da95\u0060 Add ActivityPub sensitive media controls (#29054); \u00603ae1986b\u0060 Fixed social web handle not being constructed from API in Notes/Reade\u2026; \u0060ac625bec\u0060 Added unfollow option to feed item menu in ActivityPub (#24011) (at that commit the files were still \u0060apps/admin-x-activitypub/src/components/feed/FeedItem.tsx\u0060 and \u0060apps/admin-x-activitypub/src/utils/posts.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cddc9b4b6e77d3d1f1c7d1cc131fe1b9ba6aa014ac6fafd4159e22cc0daa007"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ecaffd2462973ee26b152bcd663fc09f0c1530dbc87adfd50c578c612290ae87"}},{"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":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Cvideo\u003E without a captions track: Video with no captions \u003Ctrack\u003E offers no captions. This player\u0027s source is set at runtime, so there is no caption file to author here: give the player a way to carry captions \u2014 accept a track/captions URL alongside the media and render a \u003Ctrack kind=\u0022captions\u0022\u003E when one is supplied \u2014 and capture that asset wherever the media enters the product (upload, import or generation)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af41238e452fea026108bfb8704e050da148d240c2aba8c8f6fcb12b9b99b3c"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6fb6d95a513e3adae891312399eef349dcd8138ff86b3626c0f8cd5d7813ee"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"868bc21cebcce05e8d815c9cf5c0c59fe5d9bf17fba37487863f83f86682dbc3"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Cvideo\u003E without a captions track: Video with no captions \u003Ctrack\u003E offers no captions. This player\u0027s source is set at runtime, so there is no caption file to author here: give the player a way to carry captions \u2014 accept a track/captions URL alongside the media and render a \u003Ctrack kind=\u0022captions\u0022\u003E when one is supplied \u2014 and capture that asset wherever the media enters the product (upload, import or generation)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d5bc6d8450fa61d43c50aa57b000e730fb5e9535f85153f1a662f6359e5a6b4"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"a89d83011ee3403cbace571a25b43ebcdd3c6fc312f3512e3e6382b00fbb8d56"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/global/ap-avatar.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d55317069a792d01c9bfe50a70f399c7fe3ffc2163a1d1bd290e004c75a52d"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/onboarding/step-1.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b63c05d0a8c3ccfdc9826c0179bee2d93f7b1ef81186789335d5d75ecbd017f"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/onboarding/step-2.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ceaff3e078ce2a3600a15107d1761994c885f8f5f45b062b86aa76a9c450646"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Csvg role=\u0022img\u0022\u003E without an accessible name: An svg presented as an image needs a name \u2014 add a \u003Ctitle\u003E child or an aria-label/aria-labelledby."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c48b8c74336e12b0aab8b272b86a97634d5a6d1f7f2095c2529bf75e0c588ef"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Csvg role=\u0022img\u0022\u003E without an accessible name: An svg presented as an image needs a name \u2014 add a \u003Ctitle\u003E child or an aria-label/aria-labelledby."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/bluesky-sharing.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a707dc61b43e4871a042ee39b99952e41e04ad5e387647934d30ffbe60279b"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"32bfb53698da170dea1764dd75bb5d727b4d8a3283c51d3caa156791de47fb92"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d63703d54fa830250abe5f70c72fe4d4bc64306a5a59e379fd9ebba115ce7b0"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"0880bd6b2f2b0284947c340beaa8f4cb41ada839943b20cf0e5a8c737df282f2"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/posts/analytics/newsletter/components/feedback.tsx"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f88e7210eb9054bde99130e4a5d11aa20ea7238592de50ee3df6c24be7b0d4"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/labs.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc3f7acb7d933c27da17d4e9fea9b567a49a78daaf4201a6dffcbabe4028324b"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/explore.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"25cb0ae55483d17139ca877edfbab45d8f91b166f62f5bcb6a426900d2fb2313"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/explore.tsx"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b231c6db1e4a81fbbe33266d9996ae79b894bf92ade1f525f68227c3e18b660"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/growth/network.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e31d78de6bb3a021c0b75587da5416bbc1e2a0aa8f4bcdd913059d78548343c"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/site/design-setting.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aeb093fa165c7a44098841a3f25493a5fb58d63b22c999f70a6f1c8bcb4c21e"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-image-uploader-with-preview.hbs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b53c8ac5ea5264bb8bea7ebe3cd18f9fdb4cad9e6b5b0446cda6017d7edb75b"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/views/unsubscribe.hbs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e9931dd69ba134147647521171b77ebe10b5f497eed077aa78c7040155fd12"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/mail/templates/invite-user-by-api-key.html"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"89485e1741181fad89c89bb76cc4cecc12bc0675971c2cf71a62f51f3deb0daa"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/mail/templates/invite-user.html"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f626f7fc016ce5b76ddc06e98993a1dc1b61533221747243d05ec7b022957a"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/mail/templates/reset-password.html"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"6924f942564a3e664c38dfef5b73157c6870ffbdb9852cce3e2fab22e06c24f1"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/mail/templates/welcome.html"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"566f74f932555cc3b7c69239f6566e3efd5d3ef048dea76fa1c76af3c1424184"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-nodes/src/nodes/file/file-renderer.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a6a686857ec20b924df7b3524be34f845b40b6f02d8090ac97ced1b0732dad"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b0ecd916bb574fd6fad44676ed2552174317efe34b85e49955c67212af7d837"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/layout.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd49bd60915b6bf99dfaac36b994ee99678c9c5db41734fbe961f53cc2a1ec71"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSearchInput\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name \u2014 and neither does anything it renders \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/sidebar/sidebar.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"497ecb2b7d129e8e02a4c75bc4e5a8adf1314f35a2b834ea51b18eefe9466536"}},{"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":"apps/activitypub/src/components/modals/new-note-modal.tsx"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"92451da4d8d38747365b5e2bfa93f3bf7e28c0613eb05c6fe5ef3b74811c4433"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"e187ed6b4fa8836496d555f43a21887437b162e6886538259426f83ac3ec86dd"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0c111d810161900620089dbb00ae3e2278aab5858d3260a82d267973125fe37"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"052b784f48db6445980ddd62b5993e8e44d5da86bff28579d2d16a1f1fc24ef1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/new-subscribers-cadence.tsx"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"43a3f0c4b92d2b32e689cd6d3df0fbaa0ef342d3b7683c548fde0565105642ea"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/growth/components/paid-subscription-change-chart.tsx"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"b00a8d93fe55a8a73d380ec4b89036cf2bac1be5b8dd783fee295764281599a6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CRadioGroup\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/publish-at-options.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf7dad698b6c77b5e44b3512ff4061185573ec20de853deb9bfc5b534c39afc5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CRadioGroup\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/editor/publish/components/publish-type-options.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"8edbb54828347f62dd3357df32f28b07bf8258c572cb616bdfe5aaef284acba1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8acaf45b66ee182a3d061466ec85244df2012df0229f1cc57d1b3166139bcf1"}},{"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":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea11fe85ededd9c6b453c41bb6632f78c861aa6a2f0f7c55a70efb377a4f1196"}},{"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":"apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"a485a9c5e78d5d9a7f644b5ed97dd6acd716093a3756a63011bec3b4ac54e4e1"}},{"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":"apps/admin/src/members/label-picker/label-picker.tsx"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"08aa26d43d32b0ca5b90925984587a2566ab4bee95a0849532427d46c234fddf"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email-design/design-fields/body-font-field.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7fc5a58ed9c6203b57016a9ceebad777c989128b4095d4e55dc9957fb12480"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email-design/design-fields/heading-font-field.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee5eb6ec12d40c1de3b89c447cb4be09a5e9c55026ea95bab4b080fda943397c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/email-design/design-fields/heading-weight-field.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"79bf6a4bd3a23cfcc3690da5dd697289032ac118da95a9e812a00a5416b7b10e"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/content/buttons/more-button.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe255dd1922e548f9a4c7210eb597aa595084c76ea649a6be512267a33945645"}},{"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":"apps/comments-ui/src/components/popups/add-details-popup.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2067f5168cf14bb8ae96e551486153fd22166be3181e1fc4f05e0b025ae7f31"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/popups/close-button.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"48980cb4d3c2b38f2099c0b5eac76bb06579e96624141241678c25b6bf14d843"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/editor/publish-options/publish-at.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac97b90aa395cf765e680aa6ed21e630985db0c6fb7513e218f1dcfee13b914c"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/editor/publish-options/publish-at.hbs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"82fa0ea4b53c7078bea619cf213db98861c937bbec4855ee075987ec4a54a055"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/editor/publish-options/publish-at.hbs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa41c9e5c9ce65ea2333dfda2a33a135c22e7b5c1e28c96fc9b00d7e4fdcc9a5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/editor/publish-options/publish-type.hbs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2afaa0999f19a493b5b06ae5f4fc9850f2b1d122a42e7b63d2e3e663d52faec8"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-input-with-select/index.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c410326449e9ca7290fc9b52055d70abc13b8fef59d8873e67ef3d5ad2d6f31"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-members-recipient-select.hbs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"546cd9209db219e9345aa39762709845226a1f9fec4e0a5678d976639bce9bc6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"66fc5d9246418f8c7579576cef6d5e891ccf9ae8f350d5c5b1ef8485caf8c8de"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6979195163ea598655a132861e8c217535675dea086fab929d4255a546e776"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"80c2327f02afbfcb5ac302575d22d109a1e66d3aced58cd746bb59d7142e6173"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc12d404ea910bd636d45b9a1b84b476cd8507b8526c83bcd61e1bd3eb6dc0b5"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"63389eed04cae6e583aae5ccd3e047681b4d7a9fb209569b2863442a1d2ae946"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5c3d02cfbb7071f1b52eb5c884b893ba24bb912e062449dbd47e0ad7b9343f"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d9fa0c952238e58c607a570cb4acc6636635b0aac702619756aae62539bb7af"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"7990e7c0e9c26ed71104e8dbe2767312a222cb1257492ae987aa3dafae9a7f2d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for 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 for=\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":"apps/ember-admin/app/components/gh-post-settings-menu.hbs"},"region":{"startLine":786}}}],"partialFingerprints":{"codehealthFindingId/v1":"86e44f70f51d2096dcb5495b5540d54fed468546de61a1ea675dbd8c5c48f86c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/modals/custom-view-form.hbs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d104b9c187690687504f8d179aac8ef964fdbc6d8a1ff24a58886186f333a45"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/templates/signup.hbs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d65a589a0209283a85d6a8e7ac4daf33c92fbb4ae88328dc53073d0ae7f078"}},{"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":"apps/portal/src/components/common/date-picker.jsx"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"9afba6cb28ceabe0796618b01a72d1e32430fbb4211fe965a71a963f1bc3668e"}},{"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":"apps/portal/src/components/pages/account-plan-page.jsx"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0c6474d0475b77ad55fcfae21558f6871ee046ce23aa87e6db16e6984f4102e"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".github/embed-renderer/404.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8250333a4352e8dc5ff531316066401200725b74b42f78ae637284beb7f21378"}},{"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":".github/embed-renderer/404.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"77aab17b336c28f80982fe340b84ffd6c660058a94462ff1d9542cb0cbe07305"}},{"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":"apps/admin/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2abed45f40e90ddfed5a485fcb664fcc3c7a8a54cfff893679c14be9da29888d"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/index.html"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"31f937ac451f1a72a0430f5a1a41fe8bd4a23609c2e823a85cd50dc7a87378d3"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/frame.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"12014220826d329fee489d889bb296360293522a83a1e0a8a3ad194d8e12d037"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-unsplash.hbs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f37018fe55a9d9185e3e2de63f9af17937b58fff11b047e9937351606aec6d"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/posts/debug.hbs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b993bcf895dc1ad4c2471096d9efa21c5a0bb5dc22c1f098c8b851bba61e4b"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/posts/debug.hbs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2ce3aebf31e12290a505cd19b73dc61b21ed9431026b38087251c791d5c4ff"}},{"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":"apps/ember-admin/app/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f087f97e4705c4999387405a9b7333041f6f5aa636e3669304991fa1bf26d68"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/index.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd737b1f4528de4efad28ec3a2a0b8bdd2da81d7773441578291769b90cd77f"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/portal/src/components/popup-modal.jsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"53c343d37401b36158a6836d172fd34c3583b7508f1be16ac72a47775ae8e401"}},{"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":"apps/signup-form/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"870e294369611f2c486c2b146d751df3aa96c681ad71dd644cfbf98be42c0c9a"}},{"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":"apps/signup-form/preview.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"02eb6daad8b975334ad53ec48c95d34d9a2bc2af24b3550c8bbf032d978257fd"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/signup-form/src/components/frame.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"68c70f05cefb042f24314e0d757b4175734501d0e65387e4fae012857d66a7bc"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/sodo-search/src/components/popup-modal.jsx"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ba92436c9f4432c8ef2ff92fc1e530ad3d9c79d1599f48aa17b0661608bfb9"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/sodo-search/src/components/popup-modal.jsx"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"177a9d1314417f38c11a4750d85d61aba49a08edfc28c205b3aa0c39172e898d"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"96bee69d8e973d0175fe2a1ef23d34ae06328c49ccc0672634eaa78d05f42e0e"}},{"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":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c6846b837c7049ed06e97da56be7b4363017f9d938e87e636e8ebcbca7783b9"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9fc6d30c5eddc7b461892a21d09bd34731dbcd8023184206cbfbc4469b2851"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2588e47d0670063a5c0b33214d598ebafcb78d5307393896a837ed61f9b15e18"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"632ba19e3dfeabd8febcf4b79dfbcb5cb6dd8944605f2c5d7bd2d0a40e79dc14"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6f6411dfcf28b053b6dc3adde3bb239c381cb8e3b4f35cd4f4e44d863e2737"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"8810ccb994934c0bd48ed9d07c0450ac473595f8afabcdaad2561d083cffe1fa"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment-reply.hbs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"41efbb81518477fe7cd4d2c700883ac28a8ebedf726dda5bbfc1a77d7e75dcd3"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1aa6ddecf834bef60ba333f918827c1e7ac0606f354cc8142ddeef97ee94c94"}},{"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":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0640c7689ee8c3a65a65028cb31ff7df93366b86d76e2b64890a53cf3700d470"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f933042a368a28fef049c0f16f717099e95b6af84a4e31e92f93380f6769a1"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfdb842d4ac1c029ff444a4911c99b569f9c541be89b043a8efb50ee7eda6de7"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"c033777e428d77ba1c9b1e99b1594cc595c57145518b4bddc43be15dbe0d0610"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a95b31463f17925b1f16a1baed1e72ef65bf2148d1288aa50d1a382507d59dd"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"792e3c27a530f927cb6a4f46d19cabba2373194f7b9837b84eab5dfe25138362"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/new-comment.hbs"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa54d58b512fb0d3a5da305e27b8823e2c79c049f8533134a46fb55505a63ca3"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fd0748f9759468937924168f939bdc5dcae6b7199181efb01cdbf0098f543af"}},{"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":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"563c533add915f5f15034c7e156a20e9733a3fbbc854c2181e74872bed19d79b"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf8073a132a95d6fe801df44f9bb8c3d77f180e6a57a2e4d09e9117065dc879c"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"16db4fcd7fc2a668b743090902954d7ca37c7eee8a15c2bbc72707789bc6459e"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"d78bd40df941e781ab04c3db282485078d8730d6337bef03561ca55849aca2af"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3c906dfe1a675be17fceff5fac47808eebc958d8635b7c70fc4ab3bbda845f"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"866ed7a8aba939eb57ad9d02895271cddb6ccb2f2372b7c71e0c349b40edce22"}},{"ruleId":"AC3","level":"warning","message":{"text":"Data table has no header cells: A \u003Ctable\u003E with data cells but no \u003Cth\u003E gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as \u003Cth\u003E (with a scope)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/comments/email-templates/report.hbs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ca0c7b181cd779bab7ee27dd5fce290c47a3f75d7e6436174dff18a8df6bc35"}},{"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":"apps/activitypub/src/components/activities/activity-item.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"8decf824f41a3582995f7f6a4ff4a1808fb09f58b6f14fd0b3d71e1997848050"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cimg\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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"359ff9b469afd108d983e3a0825f281e83c705c6f11578b5f888c9e65dd568df"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cimg\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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"958e27eaf77ee871557340f2a3210995ae5fa151543552f345361382c9f57ad0"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cimg\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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b3171c96da6ad6968358a08a60407502d4aa0f343ac622c4461c313d77162c8"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"3788d5adec1c84253ec2cd889f298c4dce3a11d3ed605b5d67c9a906914c785e"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"d879bd1d19d087bdca33b75f40ce6116342edc86b6265bc463fd64c435787620"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":851}}}],"partialFingerprints":{"codehealthFindingId/v1":"55add66a7e2d05686ee18470580d1983834cebd60cef5e79be15568ee77d7694"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7a18c8f818b098ccd972d44ca70f74cf2108e2bb310f15d2877cb748003e616"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6450fa2213a7f4582500b181cc47fb3fe63e470157c587cd085ad264ad3d8b"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":994}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d117d148aca1c7fc00bbfc3ca6723dfb799a027dd6605a50b9659356367f7bf"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":1077}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c66d5dbb1dd29a90e3381272df23fe80f1e66c440a0db5c89426bf63325629c"}},{"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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"77800236c0fda2d2e2dec40d717508510c348b9c7ab2905ec5f659c3c66771a8"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":1205}}}],"partialFingerprints":{"codehealthFindingId/v1":"620973b0610aadceef990af3be00443872a2e2614f1152adb6cc402e3d84d26b"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":1224}}}],"partialFingerprints":{"codehealthFindingId/v1":"13842b6b73d4567306f4fe2f646e7581652bc4eb3a97cdfb2525fff71cbe4922"}},{"ruleId":"AC4","level":"error","message":{"text":"Hover-only interaction on \u003Cdiv\u003E: This \u003Cdiv\u003E binds mouse-enter and mouse-leave and nothing else \u2014 no click, no key handler, no focus handler, and no tabIndex={0}, so it cannot even take focus. A keyboard user cannot hover, so whatever the pair reveals or highlights is reachable with a mouse only. Bind the same state to focus/blur as well, and add tabIndex={0}=\u00220\u0022 so the element can receive that focus."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/table-of-contents.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"c59015c475aa08fdeafeb1e2fe325e51062ed6ecb6f96a1df8caba1a72034362"}},{"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":"apps/activitypub/src/components/global/ap-avatar.tsx"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"987ee80ad279c648f976fc20ef469be3eecb5808b1dafbab3cef3d0877d0abd9"}},{"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":"apps/activitypub/src/components/global/ap-avatar.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"a673040f2fc7bbf6deacb14ecc653b87ccb5176d036d306874b242f54e5f6012"}},{"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":"apps/activitypub/src/components/global/profile-preview-hover-card.tsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"43eaaa8928f826a919fff9d3c3b3e5d7b40c108f72c2f6bc6fde007f01f19443"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"apps/activitypub/src/components/global/profile-preview-hover-card.tsx"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"812d7f655105b7ed92333d34146938e88361288bc463681bcfc26f37e4790fe6"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"apps/activitypub/src/components/global/profile-preview-hover-card.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"201dea005a47c3a960aa9f4719163103c30b190296dec33ef0d9015af71c5ecc"}},{"ruleId":"AC4","level":"warning","message":{"text":"Anchor without href: An \u003Ca\u003E with no href, role or tabindex isn\u0027t focusable or keyboard-activatable. Give it a real href, or use a \u003Cbutton\u003E for an action."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/error/error.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab6a2db23c3ddcab5aca3e611dca5229b9dff8e15743be385d9e987025d05ca7"}},{"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":"apps/activitypub/src/components/layout/layout.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bdbadccba47688f3c0edbde823b6695187ab0c0a709564e33997c85200216f9"}},{"ruleId":"AC4","level":"error","message":{"text":"Hover-only interaction on \u003Cdiv\u003E: This \u003Cdiv\u003E binds mouse-enter and mouse-leave and nothing else \u2014 no click, no key handler, no focus handler, and no tabIndex={0}, so it cannot even take focus. A keyboard user cannot hover, so whatever the pair reveals or highlights is reachable with a mouse only. Bind the same state to focus/blur as well, and add tabIndex={0}=\u00220\u0022 so the element can receive that focus."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/onboarding/step-3.tsx"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"27fc8e11fe93d7c4afd6940d6e3176273bad24feb6c43819ee1ba4526f5290e5"}},{"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":"apps/activitypub/src/views/explore/explore.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"04cdb2e2cf3c3dd4b861297b47ec39ac1163178b3019fe2e5baab9c837f18a7b"}},{"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":"apps/activitypub/src/views/feed/components/suggested-profiles.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"fadc0b4363913183b9817d1e2054253a681ac23c624dcb1123022c2ca8d12f9b"}},{"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":"apps/activitypub/src/views/feed/note.tsx"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c383f72d12da96a8f3e5e87f1551e46e2d83d3d608c51277b05d882fefeca6"}},{"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":"apps/activitypub/src/views/inbox/components/reader.tsx"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"f068e7a1304849b95a9ea908899c68d518a72e1d9515ffad9d787094b938cd58"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable role=\u0022button\u0022 that no keyboard user can reach: This \u003Cdiv\u003E announces itself as a role=\u0022button\u0022 and binds a click, but nothing can put focus on it: no tabIndex={0} in any spelling, no key handler, and nothing in this file moves focus or sets aria-activedescendant. The role tells assistive tech what the control IS; it does not make the control reachable, so a keyboard user cannot operate it at all (WCAG 2.1.1). Give it tabIndex={0}=\u00220\u0022 and an Enter/Space key handler, or make it a native \u003Cbutton\u003E. If a parent widget owns the keyboard model, that parent must move focus onto the active role=\u0022button\u0022 or point aria-activedescendant at it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/notifications/components/notification-item.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d8d3b7c69b87c453a074a7f3a22693d843f840b4283a516be9f7d3fb61f6067"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab5e066e556bf0fd20bf8e48437ebbab5ffa9f0014de42a893dba886407ff31"}},{"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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"1128a2a7afc2512dfaa61a798b66560b816e9ddcb8ed5150974bd45e09d742ae"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/edit-profile.tsx"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3dd6e375d97b5121049474399ded59e2104149a27cef5e4dca9525a1d282eb8"}},{"ruleId":"AC4","level":"error","message":{"text":"Focusable \u003Cdiv\u003E isn\u0027t keyboard-operable: This \u003Cdiv\u003E carries tabIndex={0}, so it is in the tab order and a keyboard user will land on it \u2014 but its behaviour is bound to the pointer only, with no key handler. A tabindex makes an element focusable, not operable: Enter and Space fire a click on a native \u003Cbutton\u003E or \u003Ca href\u003E and nowhere else, so this can be focused and never activated. Use a \u003Cbutton\u003E, or handle Enter/Space in a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/settings.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7c64dceeb101ec812b7587f73db4674807df25719da1368756620c41bc1d432"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a1fdc9b75067f88f9ebc207795cee663d57ce28374d79b11c85e90831204479"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6f70e42091ed4a7c66f5364039682b6a4d36326bcf5243dce53604651b01551"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e9c4339eb7b2a254e10aba76bb22871505d97f7c5ec328729eb278eb978b57"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3e963c2ca92f05afac2520898ccbe50439cccece24a9e15c33fab3a9d914d3"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"61426b92ae9b20fc4cf998ecf68c9fff51a28caa95031f4b3cea4716493ef219"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b2689ffc0f2cab0e2f2faf9e427077df0285364d5d7624a8f4ef2a25c4c99a5"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a52c697e10d74adf30230e9ef4eaf76266164deea3bf21b78301ebf746141e2"}},{"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":"apps/admin/src/analytics/views/stats/overview/components/top-posts.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"329406efd84d2a8993b9346255424627b29d66735bdc053c57c9c09c06b774d7"}},{"ruleId":"AC5","level":"error","message":{"text":"role=\u0022combobox\u0022 missing required aria-expanded: The combobox role requires aria-expanded to convey its state. Add it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/label-picker/label-picker.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8b7d04c4f9b834070af6dd0568cb4ba772b57c65dadfbe15923c26f142433e"}},{"ruleId":"AC5","level":"error","message":{"text":"role=\u0022combobox\u0022 missing required aria-expanded: The combobox role requires aria-expanded to convey its state. Add it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6d7cbab80940bf3e861056f5cfc83e22372bf86ec628a1646be66277689915"}},{"ruleId":"AC6","level":"warning","message":{"text":"Low contrast Tailwind colour pair (2.3:1): This element\u0027s Tailwind text/background colour utilities fall below the 4.5:1 WCAG AA minimum for normal text. Pick a darker or lighter shade."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/onboarding/step-3.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c336ce1f711d6b394b13c11089165080efafeae49bc77cdf5772a616bc3b703"}},{"ruleId":"AC6","level":"warning","message":{"text":"Low contrast Tailwind colour pair (2.3:1): This element\u0027s Tailwind text/background colour utilities fall below the 4.5:1 WCAG AA minimum for normal text. Pick a darker or lighter shade."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/onboarding/step-3.tsx"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"4758433fc4c390b3971f96207aaddb2a2181f83f6fc61455851af893dc54288d"}},{"ruleId":"AC6","level":"warning","message":{"text":"Low contrast colour pair in CSS (1.2:1): \u0060.kg-header-card.kg-style-image\u0060 sets color: #ffffff on background-color: #e7e7eb \u2014 1.2:1, below the 4.5:1 WCAG AA minimum for normal text. Darken or lighten one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-service/email-templates/partials/styles.hbs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0cc4369ef3443b28fa862f3856b8ad328794a8d3efeb43b1783f34526848a77"}},{"ruleId":"AC6","level":"warning","message":{"text":"Focus outline removed inline: outline:none/0 in an inline style removes the keyboard focus ring with no chance of a :focus replacement. Keep a visible focus indicator."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/staff/email-templates/new-milestone-received.hbs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2202e90e08ee246ffc8db2e6c353aabe76509fff7d962e11aeaeb76e4ac1c70"}},{"ruleId":"AC6","level":"warning","message":{"text":"Focus outline removed inline: outline:none/0 in an inline style removes the keyboard focus ring with no chance of a :focus replacement. Keep a visible focus indicator."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/staff/email-templates/new-milestone-received.hbs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d029d7a6a08060e4889e4d91f7b801ef7eb4847244851b15eb4b8f942a02325"}},{"ruleId":"AC6","level":"warning","message":{"text":"Low contrast colour pair in CSS (3.6:1): \u0060.pagination \u003E .active \u003E a, .pagination \u003E .active \u003E a:hover, .pagination \u003E .active \u003E a:focus, .pagination \u003E .active \u003E span, .pagination \u003E .active \u003E span:hover, .pagination \u003E .active \u003E span:focus\u0060 sets color: #fff on background-color: #428bca \u2014 3.6:1, below the 4.5:1 WCAG AA minimum for normal text. Darken or lighten one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/styles/components/pagination.css"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"14df4043b93f7da37a9d7bcb3ca711de62396b16d6eefc560baa168ecc1fb1f3"}},{"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 1102 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":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add CodeQL\u0027s javascript-typescript pack, \u0060semgrep --config=p/typescript\u0060, or eslint-plugin-security as a CI step. What was searched, so you can tell an absence from a miss: the 197511 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"R1","level":"warning","message":{"text":"Type Safety: 3034 typed \u00B7 2796 plain JS \u2014 the untyped files are apps/admin-toolbar/src/actions.js, apps/admin-toolbar/src/auth.js, apps/admin-toolbar/src/components.js, apps/admin-toolbar/src/config.js, apps/admin-toolbar/src/constants.js, apps/admin-toolbar/src/icons.js (\u002B2790 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d00ee7953f55325a823d27e5db9657c80ca9b9861c0c0abf8fe487cd3fa586d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 14 sibling directories (90 clone groups): 90 duplicated blocks under apps/admin/src/ have copies in at least two of the sibling directories analytics, automations, comments, editor, global-search, hooks (\u002B8 more sibling(s) not listed) \u2014 56 of them are reported below, and 34 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 90 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 90 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 90 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":"apps/admin/src/automations/components/email-modal/email-content-modal.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2afcd45d5556c86851cccbfb8c5a5c0b5382db0393f130843f9a11d9e73f8c17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 11 sibling directories (80 clone groups): 80 duplicated blocks under apps/ have copies in at least two of the sibling directories activitypub, admin, admin-toolbar, admin-x-framework, announcement-bar, comments-ui (\u002B5 more sibling(s) not listed) \u2014 55 of them are reported below, and 25 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 80 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 80 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 80 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":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a8ba5656239d734f94370aa7b19ec2e27416827c0849038e83717b79c2a0708"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 39 sibling directories (59 clone groups): 59 duplicated blocks under ghost/core/core/server/services/ have copies in at least two of the sibling directories audience-feedback, auth, comments, content-import, donations, email-analytics (\u002B33 more sibling(s) not listed) \u2014 28 of them are reported below, and 31 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 59 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 59 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 59 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/newsletters/newsletters-service.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"88eed63109ea89466ce3df6dbe1ca312caf4c5cbeef7fe96df7a210e5d647bfc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 9 sibling directories (50 clone groups): 50 duplicated blocks under apps/admin/src/settings/ have copies in at least two of the sibling directories advanced, components, email, email-design, general, growth (\u002B3 more sibling(s) not listed) \u2014 25 of them are reported below, and 25 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 50 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 50 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 50 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":"apps/admin/src/settings/advanced/history-modal.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b901a9a256f7a742b87d319cdde22a380222c253dad0a94a97e69bdde5e479"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 40 sibling directories (31 clone groups): 31 duplicated blocks under ghost/core/core/server/data/migrations/versions/ have copies in at least two of the sibling directories 5.0, 5.10, 5.100, 5.102, 5.11, 5.113 (\u002B34 more sibling(s) not listed) \u2014 19 of them are reported below, and 12 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 31 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 31 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 31 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":"ghost/core/core/server/data/migrations/versions/5.3/2022-07-06-09-26-add-ghost-explore-integration-api-key.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"dffceac558fa2c025c2d48e843fedbdfc18e6aa2b8e7a7cd87f4ce504f96bae3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (15 clone groups): 15 duplicated blocks under the repository root have copies in at least two of the sibling directories apps, ghost, koenig \u2014 9 of them are reported below, and 6 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 15 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 15 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 15 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":"apps/comments-ui/tailwind.config.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b654e38da6bdfa434ae0855a47c1b79eeb1b0ae5ce5ac16f3220a7079fe5b55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 7 sibling directories (15 clone groups): 15 duplicated blocks under ghost/core/core/server/ have copies in at least two of the sibling directories adapters, api, data, lib, models, services (\u002B1 more sibling(s) not listed) \u2014 4 of them are reported below, and 11 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 15 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 15 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 15 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":"ghost/core/core/server/models/user.js"},"region":{"startLine":1021}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6041f5448d12e23b5c97293b135a305cde95f22d9cd3128d16a18120e4aa98e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (12 clone groups): 12 duplicated blocks under apps/activitypub/src/views/ have copies in at least two of the sibling directories feed, inbox, notifications, preferences, profile \u2014 11 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 12 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 12 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 12 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":"apps/activitypub/src/views/feed/components/feed-list.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"306ba5256dd2455a952e8bc0c43408de5d31f9a8ab233be0186c7ef1aa2b4ecd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (9 clone groups): 9 duplicated blocks under apps/shade/src/components/ have copies in at least two of the sibling directories layout, patterns, ui \u2014 3 of them are reported below, and 6 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 9 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 9 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 9 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":"apps/shade/src/components/patterns/filters.tsx"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a393c30f62ca8c5166a519e4fefa92339b1b3f1e48f13914c3283087f1682b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (8 clone groups): 8 duplicated blocks under apps/activitypub/src/ have copies in at least two of the sibling directories components, views \u2014 5 of them are reported below, and 3 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 8 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 8 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 8 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/global/suggested-profiles.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3322fc9eb098f5cf65ba3ffbb27d1477cf03190254b6f12c17cc893f6d4b90b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (7 clone groups): 7 duplicated blocks under apps/ember-admin/app/ have copies in at least two of the sibling directories components, controllers, helpers, instance-initializers, services \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":"apps/ember-admin/app/components/editor/modals/re-verify.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"252ff9e6e0542f89c2927a598187b823c1c203d88414d8a8c9838e6676ab232b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (7 clone groups): 7 duplicated blocks under ghost/core/core/ have copies in at least two of the sibling directories frontend, server, shared \u2014 4 of them are reported below, and 3 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":"ghost/core/core/frontend/services/data/match-permalink-params.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"214a76f4139585b4bcc84edd59421abc55da166ec9d4d406a4bd4f28c24b85e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (6 clone groups): 6 duplicated blocks under apps/admin/src/posts/analytics/ have copies in at least two of the sibling directories growth, hooks, newsletter, overview, web \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":"apps/admin/src/posts/analytics/hooks/use-post-newsletter-stats.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9b102541e430a4b660a6bd8040fb4d612494502c7422dd171855b2850b841d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (5 clone groups): 5 duplicated blocks under apps/admin/src/analytics/views/stats/ have copies in at least two of the sibling directories growth, locations, newsletters, overview, web \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":"apps/admin/src/analytics/views/stats/growth/growth.tsx"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"c11053664f198e55d74981fd4039c6849fa212c223f440675dc238cafddc1fc8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (278 matched lines \u00D7 2 locations): apps/admin/src/automations/components/email-modal/email-content-modal.tsx:33 \u00B7 apps/admin/src/settings/membership/member-emails/welcome-email-modal.tsx:35 \u2014 the two spans are one implementation copied and then locally edited \u2014 1388 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":"apps/admin/src/automations/components/email-modal/email-content-modal.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"29a8b0a86228889c8d3ebefa8119254a96e915cbcc59bc03b583caca7c9a64cd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (241 matched lines \u00D7 2 locations): apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx:126 \u00B7 apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx:201 \u2014 the two spans are one implementation copied and then locally edited \u2014 1167 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede09e9401e3c228c2efd90b9d6c60ccb372082bce816a854cdd16008dd70d91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (167 matched lines \u00D7 2 locations): apps/admin/src/members/detail/member-detail.tsx:75 \u00B7 apps/admin/src/tags/detail/tag-detail.tsx:58 \u2014 the two spans are one implementation copied and then locally edited \u2014 847 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":"apps/admin/src/members/detail/member-detail.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"f274ddd2ef928452546cd72dbd3f524dcb176315ba3d5d09d3a8402791e67095"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (144 matched lines \u00D7 2 locations): apps/shade/src/components/ui/context-menu.tsx:8 \u00B7 apps/shade/src/components/ui/dropdown-menu.tsx:8 \u2014 the two spans are one implementation copied and then locally edited \u2014 875 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":"apps/shade/src/components/ui/context-menu.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3911d4f079059b2716c71304819faa00a0cab9f00816bfe3cc4cfb52e9491c2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (141 matched lines \u00D7 2 locations): ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js:14 \u00B7 ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js:14 \u2014 the two spans are one implementation copied and then locally edited \u2014 1005 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":"ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f3ca55a13171f9904f3cb6927f843f6f726b68e409d05e52065dc384320f1a5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (137 matched lines \u00D7 2 locations): ghost/core/core/server/adapters/redirects/S3RedirectsStore.ts:30 \u00B7 ghost/core/core/server/adapters/route-settings/S3RouteSettingsStore.ts:38 \u2014 the two spans are one implementation copied and then locally edited \u2014 919 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":"ghost/core/core/server/adapters/redirects/S3RedirectsStore.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9331ab0626c9b71d70a2421ca7c7f23b19b7e1d0def274b5f74a9972e8d767e"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (131 identical lines \u00D7 2 files): apps/comments-ui/tailwind.config.js:1 \u00B7 koenig/kg-unsplash-selector/tailwind.config.cjs:1 \u2014 these 2 files are line-for-line copies of one another \u2014 131 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/tailwind.config.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b05036c7450f316e97418fc654dc1d56ecc7480a959d3f4d64059a778c10c88"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (120 matched lines \u00D7 2 locations): apps/admin/src/settings/email/newsletters.tsx:21 \u00B7 apps/admin/src/settings/email/newsletters/newsletters-tab-content.tsx:20 \u2014 the two spans are one implementation copied and then locally edited \u2014 685 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":"apps/admin/src/settings/email/newsletters.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"765c2ea13efef88495f9b89e721d0d7476c3153e0c04d5d415a47acdad72847c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (118 matched lines \u00D7 2 locations): apps/admin/src/members/detail/member-event.ts:136 \u00B7 apps/ember-admin/app/helpers/parse-member-event.js:87 \u2014 the two spans are one implementation copied and then locally edited \u2014 615 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":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"970417d93d64399f363911b580472093435a96a6f4efa7cb5530ba9d503fd777"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (114 matched lines \u00D7 2 locations): apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx:94 \u00B7 apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/mapping-step.tsx:425 \u2014 the two spans are one implementation copied and then locally edited \u2014 611 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":"apps/admin/src/members/components/bulk-action-modals/import-members/components/mapping-step.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc541e3d1729dbf9285e2e8e9774d8cf9f43fc9f6a0766516552f8fd4ff3d5c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (104 matched lines \u00D7 2 locations): apps/ember-admin/app/components/editor/modals/re-verify.js:9 \u00B7 apps/ember-admin/app/controllers/signin-verify.js:12 \u2014 the two spans are one implementation copied and then locally edited \u2014 551 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":"apps/ember-admin/app/components/editor/modals/re-verify.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"40557a50cfb215e087b1fb74917102cf006b4c820dab60e9c4db8e0afc817ec6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (100 matched lines \u00D7 2 locations): apps/admin/src/automations/components/email-modal/use-email-preview.ts:20 \u00B7 apps/admin/src/settings/membership/member-emails/use-welcome-email-preview.ts:23 \u2014 the two spans are one implementation copied and then locally edited \u2014 618 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":"apps/admin/src/automations/components/email-modal/use-email-preview.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f5bdf0de923052a0632aec288b8ac6ccdb6160854499c28324bf669ee7cf89"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (99 matched lines \u00D7 2 locations): apps/admin-x-framework/src/utils/source-utils.ts:43 \u00B7 ghost/core/core/server/services/stats/referrers-stats-service.js:7 \u2014 the two spans are one implementation copied and then locally edited \u2014 580 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":"apps/admin-x-framework/src/utils/source-utils.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc88c0c3b2ca22abacef172d1e5c96ebb1e80e816221be876896842ac5dbab8b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (98 matched lines \u00D7 2 locations): ghost/core/core/frontend/src/cards/js/audio.js:1 \u00B7 ghost/core/core/frontend/src/cards/js/video.js:1 \u2014 the two spans are one implementation copied and then locally edited \u2014 683 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":"ghost/core/core/frontend/src/cards/js/audio.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"915c62551a69d8bb05238a27b1fddb51103f1a98f88416bfd644ccc6252bf115"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (97 matched lines \u00D7 2 locations): ghost/core/core/server/models/label.js:14 \u00B7 ghost/core/core/server/models/tag.js:73 \u2014 the two spans are one implementation copied and then locally edited \u2014 644 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":"ghost/core/core/server/models/label.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"decb9086014b7ad28612ebefc0bee74b13a4a6a7d04c0950cef431023aca8d6c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (96 matched lines \u00D7 2 locations): apps/admin-x-framework/src/api/pages.ts:46 \u00B7 apps/admin-x-framework/src/api/posts.ts:63 \u2014 the two spans are one implementation copied and then locally edited \u2014 681 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":"apps/admin-x-framework/src/api/pages.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79816f2ba9496b25e439793ad872ed9106a2fc34373f0b1dbfc1c8098edc9db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (94 matched lines \u00D7 2 locations): apps/admin/src/settings/growth/offers/add-offer-modal.tsx:245 \u00B7 apps/admin/src/settings/growth/offers/edit-retention-offer-modal.tsx:370 \u2014 the two spans are one implementation copied and then locally edited \u2014 553 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":"apps/admin/src/settings/growth/offers/add-offer-modal.tsx"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e2783db4864109d49cfd1c9c6fa4ff89045d80dfcc64ef57dc1d6ae7f69191"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (90 identical lines \u00D7 2 files): apps/admin/src/automations/components/email-modal/preview-frame.tsx:1 \u00B7 apps/admin/src/settings/membership/member-emails/welcome-email-preview-frame.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 90 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/components/email-modal/preview-frame.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce83f9792ec8c63054ebd4812b251766cb2772b3c7353f2f1b0b7569f35ba91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (86 matched lines \u00D7 2 locations): apps/admin/src/analytics/views/stats/web/components/sources-card.tsx:83 \u00B7 apps/admin/src/posts/analytics/web/components/sources.tsx:76 \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":"apps/admin/src/analytics/views/stats/web/components/sources-card.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"71679da50123ba8d407b9dd26781077146f24be5fc65141ab345f990a4de5620"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (77 lines \u00D7 2 locations): ghost/core/core/server/services/stripe/stripe-migrations.js:305 \u00B7 ghost/core/core/server/services/stripe/stripe-migrations.js:395 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/stripe/stripe-migrations.js"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"be5842164131eea72d10acb424a02225691b240d7b071c25a3d7ab8a8e56e4c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (76 matched lines \u00D7 2 locations): apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx:35 \u00B7 apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields/import-members-modal.tsx:61 \u2014 the two spans are one implementation copied and then locally edited \u2014 474 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":"apps/admin/src/members/components/bulk-action-modals/import-members-modal.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c108d6d822d4bd5d18dde65ed6fae8a5be4b4696b23db9b1b991c200479bc49f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (76 lines \u00D7 2 locations): apps/comments-ui/src/actions.ts:310 \u00B7 apps/comments-ui/src/actions.ts:418 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/actions.ts"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba6207ec2fc6a4df20751582e70d7e50997741b0a41984bde8e0229a7f2b26cf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (72 lines \u00D7 2 locations): ghost/core/core/server/api/endpoints/labels.js:36 \u00B7 ghost/core/core/server/api/endpoints/tags.js:20 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/labels.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e94ae55b8c96b3a135d4b766b75fde84ccdda1ab338c5d686cd40e82a01d11"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (71 matched lines \u00D7 2 locations): apps/admin/src/settings/growth/offers/offers-index.tsx:108 \u00B7 apps/admin/src/settings/growth/offers/offers-index.tsx:202 \u2014 the two spans are one implementation copied and then locally edited \u2014 299 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":"apps/admin/src/settings/growth/offers/offers-index.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"0485c00d92f8f49e365c59165bef5b6739c392a85993cee0b7aa657b32be4573"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (70 identical lines \u00D7 2 files): apps/comments-ui/src/components/popups/delete-popup.tsx:1 \u00B7 apps/comments-ui/src/components/popups/report-popup.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 70 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/popups/delete-popup.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a4fb2c2099548273f9fbd7cf4112dc1a6c59b14014645ad8704fdfda9b1b17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (68 lines \u00D7 2 locations): apps/admin/src/settings/general/seo-meta.tsx:252 \u00B7 apps/admin/src/settings/general/seo-meta.tsx:333 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/seo-meta.tsx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ece03b0c05a6715c4c3668bdfd852bd6373819f0b48e4061cb4f0d51b033e1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: apps/admin/vite.shared.ts:33 imports mingo/dist/mingo.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/vite.shared.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fbb18b7d72e8e367524c963a6a805888b7b166badac350660ce8a5c5b647404"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: apps/ember-admin/app/routes/posts.js:2 imports ember-infinity/lib/infinity-model, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/routes/posts.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a533c7a4e3c634928b342689c15730f4c55cd707e7b6b20564f6d52169781ce8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: apps/ember-admin/ember-cli-build.js:7 imports ember-cli/lib/broccoli/ember-app, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/ember-cli-build.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"b652b2750999124cf4ba5541fac99eb0ff7dfa0bda6b39382c66e8bee19e4836"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: ghost/core/core/server/data/db/better-sqlite3-patches.js:199 imports knex/lib/dialects/better-sqlite3/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/db/better-sqlite3-patches.js"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"20409c7ffa46d668e18c1ff1edce5a609e03eda0b63e9c287dfd27699dc2f724"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: ghost/core/core/server/data/importer/importers/data/data-importer.js:18 imports @tryghost/string/lib, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/data/importer/importers/data/data-importer.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9de4e8e37ee4cca4078595f65a2786095193edae02ab1202d4daa7a1ee1132a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:test-suite-dependency]: ghost/core/core/server/data/migrations/init/2-create-fixtures.js:1 imports ghost/core/core/server/data/schema/fixtures/index.js, 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":"ghost/core/core/server/data/migrations/init/2-create-fixtures.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a775c7f7bea8cfe8ae79244661dfea506434e1de73a188697806e6ad657c921b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: ghost/core/core/server/models/base/plugins/overrides.js:1 imports bookshelf/lib/constants, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/models/base/plugins/overrides.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10db93dab82e7f225d1945681917f9dca1900ae597395d613c9917b843766816"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: ghost/core/core/server/services/email-address/email-address-parser.ts:1 imports nodemailer/lib/addressparser, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/email-address/email-address-parser.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d062f7c17cf2a058e2a2c46e7f571e98abb88d46664c0cbaaacab7ecad4270"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: ghost/core/core/server/services/users.js:7 imports @tryghost/domain-events/lib/DomainEvents, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/users.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf6b357cf4ca660a1fccc537773f953f8639360f56194c7a1f17d91771afdfd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/audio.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/audio.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec48e1164508d5feed86c0dd2344f53250fa538ab3fb2f2f4d64aaecf7fe70f7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/before-after.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/before-after.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c73a8d8448ed40fd9b4628d28a218c4fd6e3d1315861275c37f658dd558ad04a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/bookmark.ts:2 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/bookmark.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d57f9c02c0a751de651f07e2e0034848010b7e51c6b15ba2bf29e9e6fcbff2de"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/button.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/button.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac8355cde988af700f6f4fdb85a42eb454318bcf83e4ef6eb48cd34ba33491ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/callout.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/callout.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a968c6ac732e3f88902f13536f05cc2fbad9775b8d046b3fdee7dec4cfbb587d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/code.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/code.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34df98c1278dbc6d363151edab5de68bd0f5c620e0f9a215a62c5def292d102f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/email-cta.ts:2 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/email-cta.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"faa6df45c6805a363b055f5019833153975bedf2e956cec97f8f47359f47aa8f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/email.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/email.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"424e349c3cd0c56c2ac6bfeabea17b72cf64a691ca2203a8784ecf74450ba30e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/embed.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/embed.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b43be3774eb35df23dd93a75fd11167f45e287d984bbba1cdb94006815797d4d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/file.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/file.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cb310a4d55e5d4ebe548bf3e523f92afad3f52a760d0862a258ab91fb68250c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/gallery.ts:8 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/gallery.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f76d779f7c9545be169eec3d57d21547a9af3e411e73638bd200bc76576efe8b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/header.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/header.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfbc30092c3847358e6b571ae1396d33a0b3484f4f849e2d38b2d27d8216e40b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/html.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/html.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b2f00542923c0bca8acb53dffc63669a7b6f51d5417dd2aab1041377d3962a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/image.ts:8 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/image.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"27e06307c3b3b22572d1810075802ea330350a3696e81a94d92e6de84f7cd851"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/markdown.ts:2 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/markdown.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b75926020ab5a3425ce5b918d86d5957615bec76c8966c607dffa38114dc9d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/product.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/product.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22f12d499ab6020172b374e1b3e54c2f296c971ed8e6955b0b210eeb9a27794d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/toggle.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/toggle.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a5a10bdc41063b9a7d5faf99e362473720d2d7af11862d8572bdb21f274bbb8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [package:third-party-deep-import]: koenig/kg-default-cards/src/cards/video.ts:1 imports @tryghost/url-utils/lib/utils/index.js, reaching past a declared dependency\u0027s public entry into its build output \u2014 that path is the package\u0027s toolchain layout, not its API, and a minor version bump can relocate it with no semver signal. Import from the package\u0027s documented entry point instead."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"koenig/kg-default-cards/src/cards/video.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5970b3407d9684f661b84cba07178f97b18302d95f9a3edde5b064e050eabed8"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function linkSubscription (cyclomatic 124, cognitive 179): linkSubscription has cyclomatic complexity 124 and cognitive complexity 179; 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":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":1223}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd6779e93f0381d85f54b0730d28772d595bd142ac11bc569b86acdf1d69c4b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function onSaving (cyclomatic 113, cognitive 123): onSaving has cyclomatic complexity 113 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":"ghost/core/core/server/models/post.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3e4cc8746bc609cab80a761a8467a25d05dfae59ac7c27f82b322a60a21d61"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 98, cognitive 99): (anonymous) has cyclomatic complexity 98 and cognitive complexity 99; 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":"apps/admin/src/settings/email/newsletters/newsletter-preview-content.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0c20e8f046317e29118737f7db3ad2587fc13c11db56c85a9179bf785fce32a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function FeedItem (cyclomatic 82, cognitive 102): FeedItem has cyclomatic complexity 82 and cognitive complexity 102; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item.tsx"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d1ec1582c2700b67f2a4b75ce036ab3fbe6988ae309ad2940d5e29510fda72c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function Domain (cyclomatic 66, cognitive 57): Domain has cyclomatic complexity 66 and cognitive complexity 57; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/views/preferences/components/domain.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"c988d9585b40ccafd4a05ea30cc383a26951fec13fe6915fe83ea34ebebd3e72"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function PostPreviewModal (cyclomatic 62, cognitive 46): PostPreviewModal has cyclomatic complexity 62 and cognitive complexity 46; 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":"apps/admin/src/editor/preview/post-preview-modal.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea9d9d00ade1b3383f775c1546650b4023760bc8a5e4ae87e70140f9b804073e"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getDescription (cyclomatic 61, cognitive 56): getDescription has cyclomatic complexity 61 and cognitive complexity 56; 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":"ghost/core/core/frontend/meta/description.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e9f18cee31729cb45acc85ded8a32a61f8175bcc63d601b876c8e02fe6af8cb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function update (cyclomatic 55, cognitive 79): update has cyclomatic complexity 55 and cognitive complexity 79; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/members/members-api/repositories/member-repository.js"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a4b7fc44728c13fcc3601237de6dda60c5db31873f032fccb5abe17d82c0378"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function MemberDetailPage (cyclomatic 52, cognitive 46): MemberDetailPage has cyclomatic complexity 52 and cognitive complexity 46; 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":"apps/admin/src/members/detail/member-detail.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"300ad218064429fc04932814131975d4f6a36f3adb2ac608b854d12597a58e91"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 52, cognitive 43): (anonymous) has cyclomatic complexity 52 and cognitive complexity 43; 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":"apps/activitypub/src/views/notifications/notifications.tsx"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce87c2ea1e5e2e577f348561343c6a26a64df44dba1dec481956cf07d064969d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ghost_head (cyclomatic 51, cognitive 74): ghost_head has cyclomatic complexity 51 and cognitive complexity 74; 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":"ghost/core/core/frontend/helpers/ghost_head.js"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc737f942badc8fd5e27deb8b4bf4549f1a33c90ed3b863ea902d2ca36358c2"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function fetchQueryStrData (cyclomatic 50, cognitive 57): fetchQueryStrData has cyclomatic complexity 50 and cognitive complexity 57; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive 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":"apps/portal/src/app.jsx"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"e66eb1f86b0b94d1cbe4904418f0f19b3c430f045a5fc1da5a87c0e2d9d4c003"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function fetchLinkData (cyclomatic 49, cognitive 68): fetchLinkData has cyclomatic complexity 49 and cognitive complexity 68; 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":"apps/portal/src/app.jsx"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"01edb80e638ea6e2afa972b5ee581635c602ee352eb177833bc1ac3abd95a2f5"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function TagDetail (cyclomatic 49, cognitive 35): TagDetail has cyclomatic complexity 49 and cognitive complexity 35; 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":"apps/admin/src/tags/detail/tag-detail.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"5724f5a3b5a2a39ebac9ffbb5eec0b451197eee63ffa760838ae4ee1fc15e0e5"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getAction (cyclomatic 48, cognitive 61): getAction has cyclomatic complexity 48 and cognitive complexity 61; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive 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":"apps/admin/src/members/detail/member-event.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6228ca23313fe4d87b8e86217c50792308edae8df37e2b54a2baffb035e2fc"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ProfilePage (cyclomatic 46, cognitive 40): ProfilePage has cyclomatic complexity 46 and cognitive complexity 40; 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":"apps/activitypub/src/views/profile/components/profile-page.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaeb3fc7d29c4ea6b6a59ce5a129df55f9fac5143bd18f32a2b6a97fdf5d0a03"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 46, cognitive 33): (anonymous) has cyclomatic complexity 46 and cognitive complexity 33; 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":"apps/shade/src/components/patterns/settings-modal.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"a77baa6cf12c0caf805eca50c94634ad881fb97305331133633bd94bba68ab76"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 45, cognitive 42): (anonymous) has cyclomatic complexity 45 and cognitive complexity 42; 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":"apps/activitypub/src/views/preferences/components/profile.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb57c1f8835aab3f0edfb0908d53523475b9f75bbcf3077f49d8fdd93749b8ea"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function toggleCodeBlock (cyclomatic 44, cognitive 118): toggleCodeBlock has cyclomatic complexity 44 and cognitive complexity 118; 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":"koenig/kg-simplemde/src/js/simplemde.js"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5778d38253656ca9e28fa2231c96347c308278bc0cf1b3fa4947a7e44159a5"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getAction (cyclomatic 43, cognitive 56): getAction has cyclomatic complexity 43 and cognitive complexity 56; 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":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"385b43b330248048bfea1005434e3b8167a929a51332e3bd107fd2bdaf8a711e"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: ghost/core/core/frontend/services/theme-engine/config/index.js:2 imports \u0027./defaults\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":"ghost/core/core/frontend/services/theme-engine/config/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56acb0548f41905b7fd8f009ef5a4d0a008934068c911fe0b4fcf2dd2192e7b5"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/generate-decorator-node.test.ts:2 imports \u0027../src/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/generate-decorator-node.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b17fbc2bdaf2c99801150861f564f8e7f04d841ee571ef0a4904537a9722b7e"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/aside.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/aside.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df05db20749fe77aac7256b190b4acfd567ae000928ab732fbd1bc66967f173"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/at-link-search.test.ts:4 imports \u0027../../src/index.js\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":"koenig/kg-default-nodes/test/nodes/at-link-search.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fb257aad1dae7bf1a5256b02960d8e0feca2604ece9a5aab516632898915c77"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/at-link.test.ts:4 imports \u0027../../src/index.js\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":"koenig/kg-default-nodes/test/nodes/at-link.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bf6f95823f40749e8f69d64d183a9fee422e4f133e1ef20ffbc67ab8c25d9d9"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/audio.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/audio.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0999e04fe5f35ae3148b60d232fd28732e4c7499d2d4e2dee90ea807460eba5d"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/bookmark.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/bookmark.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d58b4e0c4215581aee5d9e7ea3779780229861fc8907c2c134cbb5ebafe2c9"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/button.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/button.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"896c4d03a8ed3a9eb7930ba4faf3c88f7d5f497271b8981b22b1a5c7791feac8"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/call-to-action.test.ts:5 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/call-to-action.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7b8cd543d3afadecd6daa2f01976454d09f56130f79921dadab5674d3ea7df"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/callout.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/callout.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29bf56349e37d55c683b58b61b1cc71179624bcade7a518cae212de7ae7fbc8e"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/codeblock.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/codeblock.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58cd7b3996f212393cdb2c7f4c8379956790957df8481b11ed01fdc2a0d1ecca"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/email-cta.test.ts:3 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/email-cta.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b57f407c1f264307cea7307da5b4075fa268bf204be10b66a452bb1709e9570"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/email.test.ts:3 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/email.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ececafaea0603cb21c550199ce041d9482062fb22d099a5d9f27e583e453dc60"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/embed.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/embed.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca73069c830f4b98f7b6326f130355229cc5b14ac5d9f5af95167ee8d78b4162"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/file.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/file.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced647a92f150c89689d957cbf460d800c0fd9cc052bd0eac0605a63e1408282"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/gallery.test.ts:1 imports \u0027../test-utils/index.js\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 (2 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/gallery.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0665d293a0d4fdf615a035199bab5448450c8a0d1646a9ec5a953196ba8b75d"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/header.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/header.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"78d9d6c2d55b93ba346c77411dff9fd799320c77baca8852ea1a1e7ba8e35f3a"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/horizontalrule.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/horizontalrule.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d5f98c3426a6c08b02e6318485b29986fb31a27e439d0bc0aaf13b53ef88029"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/html.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/html.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1072e3b16553f32510acaab0b22e259d8d1af5a475f2adc0a0df64eb43fb77f3"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/image.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/image.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9e8dff2fc59441726bc67211dc1081e844b6f74ec0e5c26d6bdfb406c84886"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/markdown.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/markdown.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16df4cfbcd94d429f72b0910a8a9dc0be5659fe6684819ce4f7e5d7815f79175"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/paywall.test.ts:3 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/paywall.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f1339a03b16cae777900e4b04379a18e967c4bffac236d888ccc3155e943c28"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/product.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/product.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2828c6beae58d0f28e969d19ea24e0ea8be0a62ec939584cd414892a48d761"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/signup.test.ts:2 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/signup.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1448b30aa20489fe0f743c38d242e5a609e4bb616dafebda7efc3de25550ef3"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/tk.test.ts:2 imports \u0027../../src/index.js\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":"koenig/kg-default-nodes/test/nodes/tk.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c8e795a65d66f70193428b7eea78bcc024060a01b2287870df1ecced575fbf6"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/toggle.test.ts:4 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/toggle.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92fb6eb3620e46982c5d0febd6b34fe5147e8ba78c594be9e35716e7e7484c8a"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/transistor.test.ts:4 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/transistor.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c027adab5729725be386de872127583458590e183283a94536525bff83b28518"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/video.test.ts:1 imports \u0027../test-utils/index.js\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 (1 further unresolvable import(s) in the same file). 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":"koenig/kg-default-nodes/test/nodes/video.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f28d48af1618cd6325670e7d966d5edc28cb1fe487eb1ca48b1a40cf550563"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/nodes/zwnj.test.ts:2 imports \u0027../../src/index.js\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":"koenig/kg-default-nodes/test/nodes/zwnj.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"070a0c9b1d7eb547ea4241cbb38e1a2a62adf6a11469e0d13e2f6ac583292a07"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/audio-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/audio-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1858642c42888ffd050c4b2af8a65b23b1b56970b16c4af4e6bbd8c80f032658"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/bookmark-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/bookmark-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d26ed5887034f62aa730a75473dd66295600df0953d2759db8e6802060ffe84"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/button-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/button-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eefc6579d0056544a31b5738b3b26cbfcbe5915a67dc18304924483c9e9232d7"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/call-to-action-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b0abfcff2fafc7b5552a117641e26a119146c78c919764056e07ca0a388080"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/callout-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/callout-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e14bbe496d381d2ae933b82632fad35888d257202cb4221850fd4d4ec63626a"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/codeblock-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/codeblock-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7edfe8d541380eb033a86e5aaeb299410093863969753b6b168d1b3a03ccfdc"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/email-cta-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa4a01e97af5bcb89607692b53a535c6c30332cde790a466241c97e615912e12"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/email-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/email-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1efbb1d9ebd168a0b5e60e5c6db4468c3b0917de6f1b31b02da92936e6e896fe"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/embed-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/embed-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c593ddd900278ec14e9897f29b340e43cd97f517e430aa3f697ab72e4c35657"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/file-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/file-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d8951ee91ce6fabe27842a030d7ed9fded2b0fe21ee1173419cc35144a1b968"}},{"ruleId":"R4","level":"warning","message":{"text":"This test file cannot be loaded: koenig/kg-default-nodes/test/renderers/gallery-renderer.test.ts:2 imports \u0027../test-utils/index.js\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":"koenig/kg-default-nodes/test/renderers/gallery-renderer.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5766a86f4ebc0ca6fd30c81de74b535e9237c27beb7772e2d576df2d685bb5a"}},{"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 ghost/core/core/frontend/services/theme-engine/config/index.js and 190 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":"ghost/core/core/frontend/services/theme-engine/config/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2242e14ee9956f074067acb0c8c72925b939be2f497f0a7ce19a0be0415653f7"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~1632 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/controllers/lexical-editor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e02007f993916e6805c86ed5922222ce0b655ff6549122bef06e9f9ccc06782a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~745 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/billing.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8059a19ae3a7f27b637f538499a58fc5d5bc47c3a5bb258353d7f0b0e92d0725"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~661 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-post-settings-menu.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9857c69ab7b810ac74415e9d2a398f56a226fa10066ceabdcd1e70d180dd2e6"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~538 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/koenig-lexical-editor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e98c79f3c66fa97a5960449331ed30baa4b153a6c92c843439a5e3259c9320"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~476 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/helpers/parse-member-event.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c0cd93444524bb7e0fb99fc2c9e318d9eea9d1907b43ae0a7a823ee0f4de43"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~454 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/ajax.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f4c4021d6e52fe590b321ae969003d712653b204cb289553591cd9391c15b8"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~440 LoC): no import path from any entry point (480 application, 477 tooling, 4262 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/ember-admin/app/helpers/publish-options.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/utils/publish-options.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c1720ecc24bc7011b59321da418f291496c7277abc5886c6c52fcd5206af4ce"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~395 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/state-bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db4abc8a2d9071c55e5af698f0d17b8f87e4c7d285c5ca93fe8b6cbdef22136"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~389 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/posts/debug.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7666caa249487a8328d3bd7f8562c8e6813d998be1ca8ad9abd4acf09f3e8c72"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~370 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-uploader.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e243016278f635c1a55e2e8df6bbd075bb0a06280dc13fc0404e9b92c7b49760"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~325 LoC): no import path from any entry point (480 application, 477 tooling, 4262 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/ember-admin/app/components/editor/modals/publish-flow/complete-with-email-error.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/editor/publish-management.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79a8045b0fe774a3a7d7a36f93969b2b60aa0c77cc1cf67511ff6c4a3403a90a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~321 LoC): no import path from any entry point (480 application, 477 tooling, 4262 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/ember-admin/mirage/routes-test.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/mirage/config/members.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fee0a50a5f8acffe174e563e2a9de82d77cbb26a8b514d866ddf42ffc9ed8ca"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~319 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-image-uploader.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e7758e66e023b98cbc0014198d62fb5b76c47a461cfc717a67edec1cc09c1b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~318 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/routes/application.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e34c032baeb92a8dd6f7a340d76f5d7cc8723f8322bc59957e9941e82c1b1004"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~299 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-date-time-picker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c6b7670aabf12389a968ea45e81e5a96c7afa8090edaa865ae2b1e5423c2f2"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~291 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/ember-cli-build.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd7d9cdd3c57a614fe84c9a492b76f7cf62de4e600fd79021525b5d5132654c"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~286 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/feature.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d514716bcfd2ac8e9a9dd3d68160c7a4f644deabba672a710c2bf5e79c181b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~281 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/multi-list/item.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2871a5f078c171066dfdf802757bd123f777b018645ca53e88ea6a16ad7e1247"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~276 LoC): no import path from any entry point (480 application, 477 tooling, 4262 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/ember-admin/app/controllers/lexical-editor.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/services/notifications.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68634cbc254e653b81b852e961315d422ed51208ed320f0827efba13718ed9cd"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~274 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/local-revisions.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c30cc1d407bfe7123f8f76db7e01ad21c4ec0cd0a4d25f5121e0eb9f88e0aa"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~272 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-koenig-editor-lexical.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5461de707deb85fd2ffbcb7004d735520c810fb740d7f4c1e0364b5b663104"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~263 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/unsplash.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a58b5707d1cfe3688dcedd06f8fe5323dff73cc673f35841ce21ff4c6dc475a3"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~262 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/koenig-image-editor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb6ca4d81b23c687616ce1e0c67fb545d6f9410e6070fb106ea97f22581237d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~251 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/custom-views.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf4b1b9305f17ee6f0e956cc80c94930ba5dedb62b7d49d94ed81815b9b6c7ba"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~243 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/adapters/embedded-relation-adapter.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e383d7c11b9406040bedfcea253f147701ac00fab9331f9108ed9403166095"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~243 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-token-input.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12a3dc4e429b5fb4aa9dcd8314723fd6e28bd0463361b0dffbb2fa3975e3e3ff"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~240 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/members-stats.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"148823f0bf375428a805d523b93197ec2bf6db961a2e57e32d78c06d3ad981c5"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~231 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/routes/lexical-editor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9353972937dead41fe76750f16cf332218a3543c71996abc9797f83744987568"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~223 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-task-button.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e23a395bff481fe50919fba0f5a30b8176e90b9e006a4b25d6368db7af20436b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~214 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/gh-context-menu.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa3661f35e33704324d14724c84dcca332d2a04486bb03ce7760ef83ccf27413"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~213 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/validators/post.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90a006e37ccab57cea6238f87d4a19fd76783ca0eb00f02334dfcb18aabec37d"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~212 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/components/editor/modals/preview/social.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae8c11e610e3ec074a121ce0647c96bb43c8eb48411203725b49c552e1608e9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~211 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/ui.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbe500e0cd521b9e9696f7b8385b7a1598ad25362d4ab5eb036ed8ae5b47b9d5"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~208 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/utils/currency.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a4b2536f49444191554509ca103bbcc0d25d35a1cf34a8c84dfa2bbd485037f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~207 LoC): no import path from any entry point (480 application, 477 tooling, 4262 test roots considered), but 2 in-repo import(s) from 2 other file(s) do name it (apps/ember-admin/app/components/gh-paginated-filter-select.js, apps/ember-admin/app/components/gh-paginated-token-input.js) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/gh-paginated-options.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be7086f237d9c90e7631076033db3a7e182f2460636932f0fa521b8b4386efc1"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~206 LoC): no import path from any entry point (480 application, 477 tooling, 4262 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":"apps/ember-admin/app/services/session.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88acb8e814c9dccb77d1408a8f2006034d9315d2004391f9383656ce95333dae"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027@ember-data/model\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/models/post.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1224341086409eae82f4418c0d381a72fff328c5e355811741f3b37c8113753"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027@ember/string\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/modal-post-success.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c7c6ec1edb6a36ac890564719d43333b0e417bd6402e482546087bb07b9283"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027@glimmer/tracking\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/components/editor/modals/publish-flow.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b67d4b2b996b675b9c91fae8fed7b6cb0c94842b3acf7d8a8261b76277a3a7"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027ember-basic-dropdown\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/integration/components/gh-basic-dropdown-test.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c63f49e40a1e76bd6fcef1720aa3aebceb1d2ff2d6f0a21069f8fdf804ec18d"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027ember-inflector\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/helpers/humanize-recipient-filter.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cdbe31e27fca872074e9e7ec259714a6fbc2b0813484a7b7b48bfcb4a0417fc"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027ember-raf-scheduler\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/test-helper.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0371c48c6792671bc1d3e3fa1eb365bfcdb50acd77786a2fb41aa83b8f19acdc"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027jquery\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/integration/components/gh-image-uploader-test.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1f233aca9ee0fb4f3d8b2950fb40e6d3dbdf89edbd68e4609804c4abfd89cc3"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027mocha\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/acceptance/authentication-test.js"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9225bcd519589ce116e3c4c0d783bf413f6e145f954ed59b7ed6f1ae92fdf8a1"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027rsvp\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/app/routes/posts.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"02178e4b068fc1782c94eb9dc1de8a1b036d3e1fb85f29ad6412dde3d9feb450"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027sinon\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/ember-admin/tests/acceptance/content-test.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d555cdc87f3a4b4cd2ed557ebffae8d23f01070290cf1977694d1279466e80"}},{"ruleId":"R8","level":"warning","message":{"text":"Unlisted import \u0027express\u0027: Imported only as a TYPE and declared in no reachable package.json. The import is erased at compile time, so nothing is installed and no runtime resolution depends on it \u2014 but type-checking a clean clone will fail. Declare the typings it resolves through (or the package itself) in the owning package.json."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"packages/api-framework/lib/http.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8035a04a3cd2f2d12f80fade52b62d42bbea91edcc4e944fd8a94c01101c69c9"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@ember/jquery\u0027: Declared in apps/ember-admin/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b9e39445ae3db8c4463175d32b33a8d2a0bec47011d3099b5f86231138e234aa"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@ember/optional-features\u0027: Declared in apps/ember-admin/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1574b96455c54610676afdaf156a17f2049e598f9c706db68a481c7b7da166bd"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@ember/render-modifiers\u0027: Declared in apps/ember-admin/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ee735d7e98090336719b5ffbd10194cb48202db2f3459e3127c92996f46e7058"}},{"ruleId":"R8","level":"note","message":{"text":"Type-only dependency \u0027type-fest\u0027 in production deps: Every import is type-only \u2014 move it to devDependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/frontend/meta/og-type.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7411493ec5a20298abb5ee84f55533f4fc111a66dbbc583bf8f23d1cc96fe5c3"}},{"ruleId":"R8","level":"note","message":{"text":"Test-only dependency \u0027react-router\u0027 in production deps: Only test files import it \u2014 move it to devDependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/automations/automations.test.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83d413c3aea58b1a13e805315290961306077bb5957a69dedcb4f574a7c5eed"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): apps/activitypub/src/components/feed/feed-item-stats.tsx \u2192 apps/activitypub/src/components/modals/new-note-modal.tsx \u2192 apps/activitypub/src/components/feed/feed-item.tsx \u2192 apps/activitypub/src/components/feed/feed-item-stats.tsx (one verified cycle inside a mutually-dependent group of 4 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/feed/feed-item-stats.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a2a54aa51fb440844a7fed819028ae1224779b5245cb762e117c79088ab63b7"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (7 files): apps/activitypub/src/components/layout/error/error.tsx \u2192 apps/activitypub/src/components/layout/layout.tsx \u2192 apps/activitypub/src/components/layout/header/index.tsx \u2192 apps/activitypub/src/components/layout/header/header.tsx \u2192 apps/activitypub/src/hooks/use-active-route.ts \u2192 apps/activitypub/src/routes.tsx \u2192 apps/activitypub/src/components/layout/error/index.ts \u2192 apps/activitypub/src/components/layout/error/error.tsx (one verified cycle inside a mutually-dependent group of 27 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/activitypub/src/components/layout/error/error.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacfbdd6a71d0f025297927ca4aa3c63387cfac703034256d18bdfb6bdb0ca53"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (6 files): apps/admin/src/analytics/api.ts \u2192 apps/admin/src/analytics/routes.tsx \u2192 apps/admin/src/analytics/views/stats/overview/index.ts \u2192 apps/admin/src/analytics/views/stats/overview/overview.tsx \u2192 apps/admin/src/analytics/views/stats/overview/components/latest-post.tsx \u2192 apps/admin/src/routes.tsx \u2192 apps/admin/src/analytics/api.ts (one verified cycle inside a mutually-dependent group of 60 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b26eb25008c87025ee5c49730d1520843e8dbc1bd897f305c9da0b55f0f33333"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx \u2192 apps/admin/src/analytics/views/stats/newsletters/newsletters.tsx \u2192 apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/analytics/views/stats/newsletters/components/newsletters-kpis.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6aa34292caef5e76cfd6c66d50b672bad6fec60a860cebee21723db36845a3"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/admin/src/settings/advanced/integrations/zapier-modal.tsx \u2192 apps/admin/src/settings/providers/settings-app-context.ts \u2192 apps/admin/src/settings/advanced/integrations/zapier-modal.tsx (one verified cycle inside a mutually-dependent group of 4 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/advanced/integrations/zapier-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2040993070d1023605170f49fe5f498396097e52953433a2fee16304a06e20"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/admin/src/settings/general/user-detail-modal.tsx \u2192 apps/admin/src/settings/general/users/profile-tab.tsx \u2192 apps/admin/src/settings/general/user-detail-modal.tsx (one verified cycle inside a mutually-dependent group of 3 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/general/user-detail-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7b8f815ad1742077162f365871785adcae9adfd9b297de882072048d475448"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx \u2192 apps/admin/src/settings/membership/tiers/tier-detail-preview.tsx \u2192 apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/src/settings/membership/tiers/tier-detail-modal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31f9ef3be7879ff0ffc3da981aefd0ab5378a9b497bf9de6bcb3f44e14cb3141"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/admin/vite-backend-proxy.ts \u2192 apps/admin/vite.config.ts \u2192 apps/admin/vite-backend-proxy.ts"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/admin/vite-backend-proxy.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"228a5b5f41193e62b2effa902995757c507e5831859082c6500713a998e2c093"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/comments-ui/src/components/content/comment.tsx \u2192 apps/comments-ui/src/components/content/replies.tsx \u2192 apps/comments-ui/src/components/content/comment.tsx (one verified cycle inside a mutually-dependent group of 4 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/comments-ui/src/components/content/comment.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"927602ac0e352d4b7cc97acf3cf0719636ffcc6898feab79049fdc1d8d612a90"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): apps/shade/src/components/ui/tooltip.tsx \u2192 apps/shade/src/providers/shade-provider.tsx \u2192 apps/shade/src/components/ui/tooltip.tsx (one verified cycle inside a mutually-dependent group of 3 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/shade/src/components/ui/tooltip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af56c25a97f747e22a9805243b740b0757fa2daf699f3f3b05741360079486c"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (3 files): apps/signup-form/src/app-context.ts \u2192 apps/signup-form/src/pages.tsx \u2192 apps/signup-form/src/components/pages/form-page.tsx \u2192 apps/signup-form/src/app-context.ts (one verified cycle inside a mutually-dependent group of 6 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/signup-form/src/app-context.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b5158513d1aa70f15391983447d49fe9826bef6dc08e69bb57797bb98c0a031"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (2 files): ghost/core/core/server/api/endpoints/index.js \u2192 ghost/core/core/server/api/endpoints/authentication.js \u2192 ghost/core/core/server/api/endpoints/index.js (one verified cycle inside a mutually-dependent group of 113 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/api/endpoints/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f3c6836933b0b8c87787e1d5d6c73982f162d53c66f168c62cffac324d8feb"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (4 files): ghost/core/core/server/services/permissions/index.js \u2192 ghost/core/core/server/models/index.js \u2192 ghost/core/core/server/models/author.js \u2192 ghost/core/core/server/models/user.js \u2192 ghost/core/core/server/services/permissions/index.js (one verified cycle inside a mutually-dependent group of 111 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ghost/core/core/server/services/permissions/index.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc1b097283970d52fb3bcacfe38ca9c22859223cfec415636ea07690901546cc"}},{"ruleId":"S1","level":"warning","message":{"text":"Third-party script without Subresource Integrity: \u0060http://localhost:2368/ghost/assets/signup-form/signup-form.min.js\u0060 is executed by this page with no Subresource Integrity. Whoever can answer that request \u2014 the CDN, anyone who compromises it, anyone on the network path \u2014 runs arbitrary script in this page\u0027s origin, with its session. The URL also names no version, so it resolves to whatever that origin serves at fetch time \u2014 the executed bytes can change with nobody touching this repository. 6 such include(s) across the repository\u0027s markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/signup-form/preview.html"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d24382d92fd46dcf6aa2f4f7df704c3e5d9a16f2a8026e0d850386f36e4a53c"}}],"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-1188","guid":"90b5d93c-2e8f-7d58-b831-915e7ee4a150","name":"CWE-1188","shortDescription":{"text":"CWE-1188"},"helpUri":"https://cwe.mitre.org/data/definitions/1188.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-200","guid":"b0ce3b1d-7a29-fe50-8aab-9aba899d2988","name":"Exposure of Sensitive Information to an Unauthorized Actor","shortDescription":{"text":"Exposure of Sensitive Information to an Unauthorized Actor"},"helpUri":"https://cwe.mitre.org/data/definitions/200.html"},{"id":"CWE-214","guid":"b10ad120-fb22-1351-9348-aa23b453e815","name":"CWE-214","shortDescription":{"text":"CWE-214"},"helpUri":"https://cwe.mitre.org/data/definitions/214.html"},{"id":"CWE-248","guid":"64b58946-d244-a556-a48a-f82fcd4f4186","name":"CWE-248","shortDescription":{"text":"CWE-248"},"helpUri":"https://cwe.mitre.org/data/definitions/248.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-312","guid":"96724ece-b0b2-a45c-83f9-0869fa3f6bea","name":"Cleartext Storage of Sensitive Information","shortDescription":{"text":"Cleartext Storage of Sensitive Information"},"helpUri":"https://cwe.mitre.org/data/definitions/312.html"},{"id":"CWE-319","guid":"7af97476-9f0d-4458-9163-3d2043918a1a","name":"CWE-319","shortDescription":{"text":"CWE-319"},"helpUri":"https://cwe.mitre.org/data/definitions/319.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-346","guid":"07c355cb-45b6-d05e-8a2c-9f686bc45618","name":"CWE-346","shortDescription":{"text":"CWE-346"},"helpUri":"https://cwe.mitre.org/data/definitions/346.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-359","guid":"b7dfe5b0-0351-645b-a311-b936102c2929","name":"Exposure of Private Personal Information to an Unauthorized Actor","shortDescription":{"text":"Exposure of Private Personal Information to an Unauthorized Actor"},"helpUri":"https://cwe.mitre.org/data/definitions/359.html"},{"id":"CWE-457","guid":"b62874fe-6222-8b5b-8ade-9527ad1cbb4a","name":"CWE-457","shortDescription":{"text":"CWE-457"},"helpUri":"https://cwe.mitre.org/data/definitions/457.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"CWE-522","shortDescription":{"text":"CWE-522"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-532","guid":"1cd8877a-76e8-ce54-b40b-779af23364a0","name":"CWE-532","shortDescription":{"text":"CWE-532"},"helpUri":"https://cwe.mitre.org/data/definitions/532.html"},{"id":"CWE-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-755","guid":"ac8136dd-f77c-1c5e-bdcc-3905bbad9bd9","name":"CWE-755","shortDescription":{"text":"CWE-755"},"helpUri":"https://cwe.mitre.org/data/definitions/755.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"},{"id":"CWE-940","guid":"75819a47-7665-bd5a-8873-2eebffae7d6e","name":"CWE-940","shortDescription":{"text":"CWE-940"},"helpUri":"https://cwe.mitre.org/data/definitions/940.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":860,"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."]}]}