{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D11","name":"Test Reliability","shortDescription":{"text":"Test Reliability"},"helpUri":"https://codehealth.canine.dev/dimensions/D11"},{"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"},{"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":"D18","name":"Solution Shape","shortDescription":{"text":"Solution Shape"},"helpUri":"https://codehealth.canine.dev/dimensions/D18"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"D24","name":"Comment Value","shortDescription":{"text":"Comment Value"},"helpUri":"https://codehealth.canine.dev/dimensions/D24"},{"id":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28"},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29"},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30"},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31"},{"id":"D32","name":"Data Compliance (PII/GDPR)","shortDescription":{"text":"Data Compliance (PII/GDPR)"},"helpUri":"https://codehealth.canine.dev/dimensions/D32"},{"id":"D33","name":"JS/npm Dependency Vulnerabilities","shortDescription":{"text":"JS/npm Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D33"},{"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"},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37"},{"id":"D38","name":"OSV Dependency Vulnerabilities","shortDescription":{"text":"OSV Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D38"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"PeakLimsDbContext.OnModelCreating (cyclomatic 35): PeakLimsDbContext.OnModelCreating has cyclomatic complexity 35 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Databases/PeakLimsDbContext.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"df97b2077a6e6d4c241ba916cfb2d878ee5f1c2431685947761d4672547963f8"}},{"ruleId":"D2","level":"warning","message":{"text":"PeakLimsDbContext.OnModelCreating (cognitive 34): PeakLimsDbContext.OnModelCreating has cognitive complexity 34 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Databases/PeakLimsDbContext.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a4512524de792733ca4e724770ac4603b309a1ed7a114993a38a3de4f70d3a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PanelTestGenerator: ClassTooLong \u2014 464 lines, 9 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"a76a60ca0e392b71240aee434036312e8b54c185f58327ae1ee13a78bdc7a505"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: RelationshipType: TooManyMethods \u2014 252 lines, 35 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/RelationshipTypes/RelationshipType.cs"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"45300d3dd232842861dd469f8310b93993a9ca81ac8e29aca86408a20d268873"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (48 lines \u00D7 5): PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:208-254 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:275-322 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:343-390 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:411-458 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:479-526"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"d01f3f42ac7e87d0134dc889ec482238f266f6c349ce9601f900edf5fad9611a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 6): PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:104-135 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:191-221 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:258-289 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:326-357 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:394-425 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:462-493"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c478b2a4305cc21ab6d3abea6f36bf2aa636b3db2a8f774f306d2f3ed232cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2): PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:546-576 | PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs:620-650"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PanelTestGenerator.cs"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b596d2533ae24d279cb2802d2c2ac14f99e18fbf1f368aad06d996b6c6a8547"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): PeakLims/src/PeakLims/Domain/DomainEvent.cs:53-67 | PeakLims/src/PeakLims/Domain/ValueObject.cs:74-88"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/DomainEvent.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cab184c8713c7b8aa62fe58af82d0d12d2750177661731aac575c913fa15817"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): PeakLims/src/PeakLims/Controllers/v1/AccessionsController.cs:36-49 | PeakLims/src/PeakLims/Controllers/v1/AccessionsController.cs:66-79"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Controllers/v1/AccessionsController.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"38397ee5bd0f996c0332db1e97b150d4398d59f0e17b48202f608b47ba6de565"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): PeakLims/src/PeakLims/Controllers/v1/PatientsController.cs:30-43 | PeakLims/src/PeakLims/Controllers/v1/PatientsController.cs:59-72"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Controllers/v1/PatientsController.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"df9171eaa1d77c7260aacd94609c847e9b438afdc993c0f102595174bf3534eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): PeakLims/src/PeakLims/Utilities/PeakLimsUtils.cs:30-41 | PeakLims/src/PeakLims/Utilities/PeakLimsUtils.cs:65-76"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Utilities/PeakLimsUtils.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f4bd39991d2f09670aae1914ed3900bf0c0e822feecc1769eb59d3774a50a0d"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: PeakLimsIdp: PeakLimsIdp: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9f77d31c4c710f1d3a255da6a4333ae7f0004b3e58afb24ff0668010cdf9053f"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: PeakLimsSpa.Bff: PeakLimsSpa.Bff: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ece7ebddec11505379c085850f7b5fc4b0ecba57cbda26e586d5ee7832471255"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: PeakLims: PeakLims: abstractness 0.06, instability 0.20, distance 0.74 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"82a08a3ae91c75a7c6fb8b8675f609fa30e7e613e8ef94155f5f962f469822e3"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: RelationshipType (LCOM4 33): RelationshipType\u0027s methods form 33 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/RelationshipTypes/RelationshipType.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ee36588f120b1cdc1700f851d237c16f43b7b0cabfa000042f821c2f1d367ff"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AccessionStatus (LCOM4 12): AccessionStatus\u0027s methods form 12 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/AccessionStatuses/AccessionStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"050306b152ab3ddba77905b186c46b9bbdb039d334e370727990128c10d94bd8"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TestOrderStatus (LCOM4 12): TestOrderStatus\u0027s methods form 12 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/TestOrderStatuses/TestOrderStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c42a4134de4235282941ae328ac330a7b6c81f17c503785e49ce7de5ac05652"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WorldBuildingPhaseName (LCOM4 11): WorldBuildingPhaseName\u0027s methods form 11 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/WorldBuildingPhaseNames/WorldBuildingPhaseName.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c64d2f11023dea903eac83a6bd6f0f5df38d55991d5d374786605a0ebba0e7ef"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Race (LCOM4 9): Race\u0027s methods form 9 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Races/Race.cs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"d17de7ac2f4a9367ab5e47b18d537a1cf2197cdf55832bd770f1cdf0aeaf3743"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SampleType (LCOM4 9): SampleType\u0027s methods form 9 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/SampleTypes/SampleType.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b7050f8ba367e08999f42ccaa7e97182fc16fc646c37f0a70b5b5e0a877cebc"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PanelOrderStatus (LCOM4 8): PanelOrderStatus\u0027s methods form 8 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/PanelOrderStatuses/PanelOrderStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ff689110c0f2b991982c2018e2343c5d2b710c8730530cc4d09c00bbbc8a3b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ValidationException (LCOM4 8): ValidationException\u0027s methods form 8 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Exceptions/ValidationException.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5c2cca1a37010156f36c66b819e3b0c10b748fe7e0c08c9cbee75f6190e9b2"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AuditLogConcept (LCOM4 7): AuditLogConcept\u0027s methods form 7 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/AuditLogConcepts/AuditLogConcept.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee5f3693f7e5dbb8661b1562dcde3f48645c1d72894b3f646408b8a5158af2f9"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AuditLogAction (LCOM4 6): AuditLogAction\u0027s methods form 6 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/AuditLogActions/AuditLogAction.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"11871cd7e972c0f5e4423b9d44b6ef9e3dc1d1f8888a868b4bff61174923dcfe"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Ethnicity (LCOM4 6): Ethnicity\u0027s methods form 6 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Ethnicities/Ethnicity.cs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"797b98dc788dba6189dd18e550235cf8b0e65f3df9238b7e8773827c2d06a783"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WorldBuildingStatus (LCOM4 6): WorldBuildingStatus\u0027s methods form 6 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/WorldBuildingStatuses/WorldBuildingStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7e800cafe36eaa3b7c2dbcb48aec05c3e62521484c406ee2af6eefe8c398cb4"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AccessionAttachmentType (LCOM4 5): AccessionAttachmentType\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/AccessionAttachments/AccessionAttachmentType.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"81eb750048a4b4ea687958dfc8e833a89a4cc929b26604c7778c0c84e7be1dc1"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BaseEntity (LCOM4 5): BaseEntity\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/BaseEntity.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e19b47e3823aa16f418e68ee7b3e6973b9e237d450a27d9904a4dca565c37686"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: MonetaryAmount (LCOM4 5): MonetaryAmount\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/MonetaryAmounts/MonetaryAmount.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"8246cd239a12aeb6e70846dc470992ab4afc667b73512f294345096ead0a5367"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PanelStatus (LCOM4 5): PanelStatus\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/PanelStatuses/PanelStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a592ed677ab3654f4ad8b494595f7c9e362f0c51da9f5689f4e15c7c40c0e6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: SampleStatus (LCOM4 5): SampleStatus\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/SampleStatuses/SampleStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"534c15d742c79a3a44617fec78dd846a692af06bf7dfc7e12fc928106f5e6373"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CancellationReason (LCOM4 5): CancellationReason\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/TestOrderCancellationReasons/CancellationReason.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"c84fc5415fbe39d639ed32d023bacc95e0a0f2568f72c1ffac6f36d53a7d8fc0"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TestStatus (LCOM4 5): TestStatus\u0027s methods form 5 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/TestStatuses/TestStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f01f69f65dec5257361038058f41539dec8e13ecc1ea9dd3f5888e4ce4bd5d9d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: HealthcareOrganizationStatus (LCOM4 4): HealthcareOrganizationStatus\u0027s methods form 4 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/HealthcareOrganizationStatuses/HealthcareOrganizationStatus.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3faa9d5ebbcceca795204cf94bf923ed3f7eaf0caac585f5e2245b3a41e8b7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Role (LCOM4 4): Role\u0027s methods form 4 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Roles/Role.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2c44a995bc9cd9f72851b8860e10502aaabfe1618ca5c5b894f2847121625d2"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Sex (LCOM4 4): Sex\u0027s methods form 4 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Sexes/Sex.cs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1079d35eb4e6992803612d99b8345dd5b06e797be2d52a168d963c60121c75"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WorldBuildingPhase (LCOM4 4): WorldBuildingPhase\u0027s methods form 4 groups that share no state and don\u0027t call each other \u2014 a sign it may have several responsibilities. Review whether it splits into focused classes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/WorldBuildingPhases/WorldBuildingPhase.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"640d7157877ab1e87942a982f348dbadcfc24921023ca28f2ce387bacfef2f35"}},{"ruleId":"D7","level":"note","message":{"text":"No checkable ADRs to assess: No architecture decision records were found and the project graph is acyclic, so architectural integrity could not be assessed. Add ADRs (with \u0060enforcement: analyzer|test\u0060) to make the architecture\u0027s rules checkable."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9bfa095522c5f2e53a7c1c0405fd8830d318409a6fb74f4288bab05aaf716e52"}},{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured: The test suite couldn\u0027t be built/run in-image and no coverage report is committed, so line coverage was not measured \u2014 and it is EXCLUDED from the score rather than scored on a LoC-ratio proxy. Commit the Cobertura/OpenCover/lcov report your CI already produces (anywhere in the repo), or make the suite runnable in-image, and real coverage will be measured."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D9","level":"note","message":{"text":"Unit tests: 140 unit test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3067d72f6515925eded797ae6deb86f74d157d3bd0b8e2d3a80edaa12ea95d24"}},{"ruleId":"D9","level":"note","message":{"text":"Integration tests: 230 integration test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b8ce5913e7f0487c282aa29038cefc209006d3bfe4e8418292f03d5a2d9bc5b9"}},{"ruleId":"D9","level":"note","message":{"text":"BDD tests: 0 BDD test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2335ff4716b8a3faefb3014515ddf9f836e46276f415e6cd56462b6bf7742991"}},{"ruleId":"D9","level":"note","message":{"text":"E2E tests: 0 end-to-end test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9a982d279a9674eceb951bedcbe3f8d344879045f8bee5f9f6f059139e0ed590"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionAttachments/AccessionAttachmentListQueryTests.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"b90addcd1c6b0e58f89fcb767666943b77e5372be011921eca0ab1b73271809b"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionAttachments/AccessionAttachmentQueryTests.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d11245d8948c4bb7609aae9b4e63ec5464ad3bf78eea5bc932f7c955549124c"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionAttachments/DeleteAccessionAttachmentCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e17450f56f482e73fdc4d8ad5136130c63006655a0d8acc41c8f66c39ae95d"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionAttachments/UpdateAccessionAttachmentCommandTests.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"0092fb74207f302ab3d16e7c1fa25915b9c20a45e3c78336d4d38eb62c1e7f02"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionAttachments/UploadAccessionAttachmentFileTests.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3063a56f518472c43789ef1d98b5a57eb629a674e9f8400d4093ee94fe5f203a"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionComments/AccessionCommentQueryTests.cs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"2349b1d2f4dcdc84241e99d0ea814f36f9ff8a84a86b8f7651a5793045fc0db6"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionComments/AddAccessionCommentCommandTests.cs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6934f0114f8d27c90def48914baa63a70cfd3aba2683d20f1fbff0688190656"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionComments/DeleteAccessionCommentCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d695bbeef3174c72fa3f53518cb10680406290eadb1c91b73c9b7991ec273fa"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionComments/UpdateAccessionCommentCommandTests.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c975f52ba85626b68fd0fe147c2de43a8df594f8687938cbaa25fc1e6a3cf8b"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionContacts/AccessionContactListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5279069706cb9d3e080aa58abaeba41f3d2b34fe29713f5541b5fbbe7f2ca57"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionContacts/AccessionContactQueryTests.cs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d29501f5c06e7984bba4cd5a6e07572939e399ae49851dc0d78d1a2a2a54b6"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Accessions/AccessionListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5e3d402eb5d61a6b6005ae9c91b0ed8e9c95dcb25716a2740eaf37e4dbc94d6"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Accessions/AccessionQueryTests.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a891f32d7f667047d3e61d694549febf219885eb19d25c12da734479ac09ed54"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Accessions/AddAccessionCommandTests.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"6476914d9fbc9dfbcb41f2b768eee35a8cbb32dd51a47ffae025568601798d6c"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Accessions/DeleteAccessionCommandTests.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae219553bca44876fc4b836a153f0646120782474b658c6e4ec051b6b1a9ea6"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Containers/AddContainerCommandTests.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a350d8069aeb5f86931212dbc834a5c1e393b24f35b529df80c1e336122013"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Containers/ContainerListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"222effedd82bcfde6e649fb98119d79e5d39b5d187a9e432c3741164420d5cf0"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Containers/ContainerQueryTests.cs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"d38650a3bacb65d3994d37b87be4f8136971ae22030a8cab91eeee14314b6a4a"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Containers/DeleteContainerCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"4daee60b4cf18b8331561e821444014eb116c0dd7cfd61acedcd3e54682b4499"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Containers/UpdateContainerCommandTests.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"730b7314bb8742544b86ec81c21885ad44dcb1925857a1ff2b64c176afd32c18"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizationContacts/AddHealthcareOrganizationContactCommandTests.cs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac6bd92658ce6b737ab9d6cb83b01e1f4a4bc7ed70aacdaabd350719c12e4b9a"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizationContacts/DeleteHealthcareOrganizationContactCommandTests.cs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"1acc145f0b9a704a881a77aa9a4979359c103b7ea8db5b8077c113b8541affbd"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizationContacts/HealthcareOrganizationContactListQueryTests.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"0caffa04421d9d48a7fcf60b5e3abf75cf6555f3d11122a6391b86eac0594b87"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizationContacts/HealthcareOrganizationContactQueryTests.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"c722b2545a989a34afad4d9621b26eddca988eb7ec4a996f5d81e4c68f0a859f"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizationContacts/UpdateHealthcareOrganizationContactCommandTests.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c837c9f104401a0d81b1f590d19125ade848773757c22c0f72d853416d31003"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizations/AddHealthcareOrganizationCommandTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"2367e42aff1269ee3fbd887e256ac4bfb3c732dfed5a513e569657639f2257b2"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizations/DeleteHealthcareOrganizationCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"446fad5666f45dee8a4a77dcab55971c4116e0e6a3888229e16f26b0b228ecec"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizations/HealthcareOrganizationListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c573727076055babf32c80e108d8946bb1f93606ca4b6c1ef666139ca038ba35"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizations/HealthcareOrganizationQueryTests.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"55e369ac65214b261ff6855f60434e0e7cc0b8d524f44857655dc52f48467af5"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HealthcareOrganizations/UpdateHealthcareOrganizationCommandTests.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d777f5bb5a3ddbf6a3724276870814dac23605370404e4a90fe996d1df7c84a"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HipaaAuditLogs/HippaAuditLogListQueryTests.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4dbb55eaa4113eefb976985a4cfc5fe38d9e5ec90b9c9ef7b2d6ce82c087c14"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HipaaAuditLogs/HippaAuditLogQueryTests.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"399575c31dddf3442c733f8f94c77c19ca76a3017b7ca23581816c7124fc9c0b"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/HipaaAuditLogs/UpdateHippaAuditLogCommandTests.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2a9939f728ff38ca664ab8744bdc85daad2d5c3ee3fede9734325841bb78b6f"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/PanelOrders/DeletePanelOrderCommandTests.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d05ba64191e077a20c9a76ce10ca0f8e6b25037a86de22ec75e21c05a7b1bd0d"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/PanelOrders/PanelOrderListQueryTests.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc60a596c505722af0a73269d39012a32cffd12a4a7ab6fdb7d78a2d48da95a1"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/PanelOrders/PanelOrderQueryTests.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8aefd4445fbd98d84171ca1dbfb78866c20590c7a62dcb03df77057699ca73d"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Panels/AddPanelCommandTests.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"8608627bde5b916ea9524ab1b497e588c1de31255ca5de686f213a18a634f805"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Panels/DeletePanelCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5479aa4879b8ac8f45e383f60bb5ab0dc3159632a4718125ee829e591eee90"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Panels/PanelListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f628453794557b93eb750c64a5ec8add354cf48f7399c6a6a80b78c192b54e0"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Panels/PanelQueryTests.cs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3af3e6056c62ebf6bad249c9f0a5f8d18332b7f1d8f3de693c12d3fb3dd1e0c"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Panels/UpdatePanelCommandTests.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"34837b11d6037dac5a663a05176eea4fc9ddb06ea7f528c796635d602e578b95"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Patients/AddPatientCommandTests.cs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1b1672093adfd6afcee2800e3590a3fc8900f4c222207a36612439c875c75aa"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Patients/DeletePatientCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd97c05ca7fe0fe7b481bf89e0f6d6356790d16fcac7d739c47bf4392e7cebfa"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Patients/PatientListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ddad0cecefa26333b9b331fa86748a720f3d9b60d284845ce67c3f0c7fc46ec"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Patients/PatientQueryTests.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfce1365af94e91f7463a3f47ea7916dbc292ebee73110b6abd82316aee5b9b2"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Patients/UpdatePatientCommandTests.cs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"05967168dfd892bb7ec08488afec2c635681c03173c131bfdc2af031ae2a6cbf"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/RolePermissions/DeleteRolePermissionCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a1b8b0e00487df9923989f1ecd3e7cffc6955f8e30dd4efa8b1cdbfa52bf496"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/RolePermissions/RolePermissionListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae7c02ed71c2d5922b5b92f610affe52100ec23328bb205e556c90a396333c1"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Samples/AddSampleCommandTests.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc3968962581fd70b6f3e25e45d3e69be0c11d850c677a13161bf094c487c18e"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Samples/DeleteSampleCommandTests.cs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b29a81fc5ef03f3a94708bf1db10f71095482c89a640fa61fe81d14dd42b5b5"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Samples/SampleListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ad782e43ee6c3ccc0ceee4c7e8d5449faad948cd236b46e2a86edf8eef7623"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Samples/SampleQueryTests.cs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ea3bc53051310def165c33231ea90ae726525e357414238980a4f76045c42cc"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Samples/UpdateSampleCommandTests.cs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"877a18c4f9214b25980b1d0eb6336b6ede55b05b27cc8d94ae0af665be40ba30"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/TestOrders/AddTestOrderCommandTests.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f713b4bc8faf6b9fac25165b25b2db250f761b9d47c1d32a2d6b62899a1ef74"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): can_get_orderable_panels_and_tests: Skipped with a documented reason \u2014 a deferral, not lazy debt: Need to redo panel orders"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/TestOrders/GetOrderablePanelsAndTestsTests.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b5bb8b6c8c2c910e387540cf3120042bb566c1af199faa0a1ce6703ec256fa7"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/TestOrders/TestOrderListQueryTests.cs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"376065a2c42a6d34da8ef667a8753d40c592f16e16c1940ece04550c8b55ea19"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/TestOrders/TestOrderQueryTests.cs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"889e7e34d1a3932aa1ddf799a5244b483014d1e2e5c054785816c97e0ea5d04d"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Tests/AddTestCommandTests.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a0cf9a581cc0082a08414f48cc6590a346bf3fdada9a0f23357b87086f2a182"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Tests/DeleteTestCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc1addbcf2a49028b5b92d2bff689f09ccda917f0ddf00a2da5c2bfa91a54847"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Tests/TestListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ed03e857fedd5d3fbd6991cd070afa0d5d708cdf59720a2e1c17b61e5d18aa"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Tests/TestQueryTests.cs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"2040ccfd5f48b7549d60aa22b61b79c2d78a1b12dff6eb4da927ac6a6ad9668b"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Tests/UpdateTestCommandTests.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"e646ecc8f008937143f0d634ae8c46225bb2096f1c14d47c168e09e84b1ce8bc"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Users/DeleteUserCommandTests.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"c767615a10758b48ac2fd5a0688fe662ec67a963ece56cf3f44288c3a2944104"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): must_be_permitted: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to redo permission granularity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/Users/UserListQueryTests.cs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"09d48ca9ff415a7f598c02971fe5c2798a9b1342e19dd09558a39f8e4bb0ee45"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): can_upload_attachment: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to resolve tenanting issue for testing"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.FunctionalTests/FunctionalTests/AccessionAttachments/UploadAccessionAttachmentFileTests.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"497a7a54cf60f31089b0fae51c6d30fd2987f86efa5eefb91127aa7aeef30ecf"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): put_accessionattachment_returns_unauthorized_without_valid_token: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to resolve tenanting issue for testing"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.FunctionalTests/FunctionalTests/AccessionAttachments/UploadAccessionAttachmentFileTests.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d8d94e9fcddba74f26a0433872e218f4698c150d3e54810c0bd6a357de4cc9"}},{"ruleId":"D10","level":"note","message":{"text":"Skipped (documented): put_accessionattachment_returns_forbidden_without_proper_scope: Skipped with a documented reason \u2014 a deferral, not lazy debt: need to resolve tenanting issue for testing"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.FunctionalTests/FunctionalTests/AccessionAttachments/UploadAccessionAttachmentFileTests.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7344998bc7bbf23e401d2a664fb155792dbcb599e072c7a3e04e8bad92c9fdd"}},{"ruleId":"D10","level":"note","message":{"text":"Mock framework: NSubstitute: PeakLims.IntegrationTests references NSubstitute."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f7a00103b900edf7e4be8c5cb3d32d7475832a80a5a9fb7f1f0784e5799890ed"}},{"ruleId":"D10","level":"note","message":{"text":"Mock framework: NSubstitute: PeakLims.FunctionalTests references NSubstitute."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f7a00103b900edf7e4be8c5cb3d32d7475832a80a5a9fb7f1f0784e5799890ed"}},{"ruleId":"D10","level":"note","message":{"text":"Mock framework: NSubstitute: PeakLims.SharedTestHelpers references NSubstitute."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f7a00103b900edf7e4be8c5cb3d32d7475832a80a5a9fb7f1f0784e5799890ed"}},{"ruleId":"D10","level":"note","message":{"text":"Mock framework: NSubstitute: PeakLims.UnitTests references NSubstitute."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f7a00103b900edf7e4be8c5cb3d32d7475832a80a5a9fb7f1f0784e5799890ed"}},{"ruleId":"D14","level":"note","message":{"text":"Licenses scanned: 62 packages scanned; 4 distinct SPDX licenses."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d29d66daec20840f6831f63c1b66b87c40390635ef3e9f728002964c77e88d4"}},{"ruleId":"D16","level":"note","message":{"text":"Small-team knowledge concentration: 70 file(s) are concentrated to one author \u2014 the ambient state with 2 active author(s), not 70 separate risks. The signal becomes meaningful as ownership spreads; no per-file action implied now."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8aa75b6daa18f1b578387fa04036c50b3163d47f957c8f5601bf083ed4489b0c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: [e-mail redacted]: If [e-mail redacted] becomes unavailable, 70 significant file(s) lose their only recent owner \u2014 the largest single-person knowledge concentration (weighted toward the domain core). Pair, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"560712e84f132aa325fa62cd548567a8234f353b0641984291d1b4e6a4ee9221"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO unit test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Accessions/Accession.cs"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"16509271c31cfb4ad56aeab19986a93475cbce9a19b107ef08adf249a218daca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO unit test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Accessions/Accession.cs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"16509271c31cfb4ad56aeab19986a93475cbce9a19b107ef08adf249a218daca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO if test order status is not in one of the pending states, guard \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Accessions/Accession.cs"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"16509271c31cfb4ad56aeab19986a93475cbce9a19b107ef08adf249a218daca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO if there is already a patient, clear the accession info \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Accessions/Accession.cs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"16509271c31cfb4ad56aeab19986a93475cbce9a19b107ef08adf249a218daca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO unit test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Accessions/Accession.cs"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"16509271c31cfb4ad56aeab19986a93475cbce9a19b107ef08adf249a218daca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO unit test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Accessions/Accession.cs"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"16509271c31cfb4ad56aeab19986a93475cbce9a19b107ef08adf249a218daca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO country validation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Addresses/Address.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"673f72ae221cbf64fb1aa8c0766ef2bb307a2d1553bdf019a0c8e4aecad81d45"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO audit is failing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/PatientGenerator.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"26f395e9cd45499366ef1a62d582bc81f9c873258552494047a0ea1f7b66e572"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO add role \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Gaia/Features/Generators/UserInfoGenerator.cs"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08af92e3621934e722d8c5e5621628dfc325bb29faff6ce51aa7f3fa99f1fdf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO readonly collection is causing issues with joins in aggreagates when joining org to things \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/HealthcareOrganizations/HealthcareOrganization.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79140760d585df7c8e45d6601b8e1330ca4c1da6d37e8c4263012c7b8fa7a54"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO age band \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Lifespans/Lifespan.cs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"152939366483a91211e2113ad90900e54ac788787fc1712fc1be138e450a2eea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO phi friendly string (\u003C 1 year, \u003E 89 year) -- NOT MAPPED \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Lifespans/Lifespan.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"152939366483a91211e2113ad90900e54ac788787fc1712fc1be138e450a2eea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO figure out how i want to bump versions on updates and based on state of the panel \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Panels/Panel.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"985962930f180cc097a94de0fa8b755d37bc3df06491ffadb201a63b7aed22be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO unit test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/TestOrders/TestOrder.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"862228da835f7b291c4dda749cc6b743c6ca5023273b59795bfa6c0d6d1b0ceb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO figure out how i want to bump versions on updates and based on state of the test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Tests/Test.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d01a5a35c03e2aed43285e36c84a2af72c736cf558a6995461451541b5296b2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO update origins here with env vars or secret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Extensions/Services/CorsServiceExtension.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bdc3154351fe40b74e04d2c1eb436c664782549b797daaf94880c06301cf38d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Setup an exporter here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Extensions/Services/OpenTelemetryServiceExtension.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dca4c9d258c3761aec29d0825c2ca1c6200562c1d83d04695343e0306016727"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO update CORS for your env \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Extensions/Services/WebAppServiceConfiguration.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d309e84defa672394c2a3819ee2ebc73074c4ed3bc079de728e7b668cec5ec"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO alt -- add login handling with cookie handling \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Resources/HangfireUtilities/HangfireAuthorizationFilter.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4f68f6ca1fd62f9b0b6d7137ed83edbae41f02df9a477523c83455d45c5c0a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Resources/PeakLimsOptions.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"033346388dcfc70f078fc16cdacf4141dad2ff4145a933ed420721e4854b3f26"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO do some caching to avoid getting a new token every time \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Services/External/Keycloak/KeycloakClient.cs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b7b1310b34770a8d91ce8898318805ad45d4b11dc3c7875dd8646dd473c4707"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 12 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Services/External/Keycloak/Models/UserRepresentation.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c8f3678ecd515e7d7a22eb7b8e8f427808b976c29898b120ef27bd27ec7b911"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Utilities/PeakLimsUtils.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c016d3a270ab31a6491117df25d5b7783dea8e37b795fba22d4cde76b430838"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.FunctionalTests/TestingWebApplicationFactory.cs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aa6d79f54f5286ada0c3c80c963bc56ee21ee101caffb9f751285d328781921"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.SharedTestHelpers/Fakes/AccessionContact/FakeAccessionContactBuilder.cs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01c350ab60294bfe00dc7bcc2c30e0c2eebd4d6f944c26556993ec09be49487"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.SharedTestHelpers/Fakes/AccessionContact/FakeAccessionContactBuilder.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01c350ab60294bfe00dc7bcc2c30e0c2eebd4d6f944c26556993ec09be49487"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO move to integration tests \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: PROJ-123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc31113b4e28eb0004602a62ff077cb47d4bc01657bf8ed4ca0346a23a3abd6a"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 16 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 8 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 8 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 8 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/ServiceTests/UserPolicyHandlerTests.cs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb3e7b5b2631201543fb484be9252e1606979b295437f1285e3452c29ca0461"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1701"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1702"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 8632"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1591"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1701"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"note","message":{"text":"DuplicateNoWarn: NoWarn 1701 is listed more than once in this project file \u2014 remove the duplicate."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5149bc035f74b13fb745931a1aef9ea282322c3f44030a675e9ed9be8d0e71"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1702"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"note","message":{"text":"DuplicateNoWarn: NoWarn 1702 is listed more than once in this project file \u2014 remove the duplicate."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5149bc035f74b13fb745931a1aef9ea282322c3f44030a675e9ed9be8d0e71"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 8632"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"note","message":{"text":"DuplicateNoWarn: NoWarn 8632 is listed more than once in this project file \u2014 remove the duplicate."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5149bc035f74b13fb745931a1aef9ea282322c3f44030a675e9ed9be8d0e71"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: 1591"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc36e5c8f8017ecfb30890dbc3e254edae060131d2096c7b6bc84a18af6e039"}},{"ruleId":"D17","level":"note","message":{"text":"DuplicateNoWarn: NoWarn 1591 is listed more than once in this project file \u2014 remove the duplicate."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5149bc035f74b13fb745931a1aef9ea282322c3f44030a675e9ed9be8d0e71"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: CreateLifespanFromAge: Method CreateLifespanFromAge \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Domain/Lifespans/Lifespan.cs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eabfbb324507ea9237f2a791446b60d5bb39be0823e7481ad155b36f8f52975"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: Program: NamedType Program \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLimsIdp/Program.cs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a10d084c4d201c03b7250bad6960ae3ef2bfa236644dc0c70c518b2623a5fcd"}},{"ruleId":"D18","level":"note","message":{"text":"Shell project: SharedKernel: \u0060SharedKernel\u0060 contributes only 0 significant line(s) \u2014 an empty/placeholder project is structural noise. Remove it or fold its contents into a real project."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SharedKernel/SharedKernel.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6578df69b9974181dbbe3f1a518779138b11460bfc86cb354b8facb1cd931d8c"}},{"ruleId":"D18","level":"note","message":{"text":"SharedKernel (Production): 0 .cs files, 0 LoC (0 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SharedKernel/SharedKernel.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a1e895f9f8fa8c7069650accb98ef237761e2bb5786e6dc005ca9cded46e8b7"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLims (Production): 497 .cs files, 41587 LoC (32291 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"075198a7720a2eef3a9eb6366e8a1066de4ec975b95afb5765cca745f8de271c"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLims.IntegrationTests (Test): 110 .cs files, 6685 LoC (4897 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/PeakLims.IntegrationTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe9e636b69cd76816e5fa84237e23b7a80fea9ce42819c55ce752270d4c47a7b"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLims.FunctionalTests (Test): 8 .cs files, 603 LoC (490 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.FunctionalTests/PeakLims.FunctionalTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58de6ebf2ddebde0cc4cf9e39ea023424a51afd53bc55cab4b3f6f8fc6395006"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLims.SharedTestHelpers (Production): 79 .cs files, 1894 LoC (1589 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.SharedTestHelpers/PeakLims.SharedTestHelpers.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e857762c73590fc35662085009e46e15bb34c1de1f1332a5f2d7e2b6ea7fb2"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLims.UnitTests (Test): 59 .cs files, 3536 LoC (2365 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.UnitTests/PeakLims.UnitTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5e93a2c6fdda4ff55b2696fe45286fafd040a665779b3cae525f1cef425d7f9"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLimsIdp (Production): 6 .cs files, 283 LoC (251 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLimsIdp/PeakLimsIdp.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d042f1565bf7f90fa62d1e66f54f90475ef95fd981d404952d9ee280a25db7"}},{"ruleId":"D18","level":"note","message":{"text":"PeakLimsSpa.Bff (Production): 3 .cs files, 215 LoC (157 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLimsSpa.Bff/PeakLimsSpa.Bff.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3edceb2c56a4a0fe73d2e60d0827377c9b0956ee5033676cf3caea39f8d5714a"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: SharedKernel: SharedKernel: 100 % XML-doc coverage (0/0)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"SharedKernel/SharedKernel.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e4f5da94acf17fc4c66a335e442a77258264463670ea10cb5ceaf35064edfa6"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: PeakLims: PeakLims: 5 % XML-doc coverage (164/3207)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/PeakLims.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a2192b4902ac9f1507e1dc0c092cbb8d5b38535d2e70c56807d4a7491ca42e"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: PeakLimsIdp: PeakLimsIdp: 0 % XML-doc coverage (0/12)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLimsIdp/PeakLimsIdp.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"882cc035b83cc4ea81db0010079a2541302c4465157e29b712ae18d4395f3686"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: PeakLimsSpa.Bff: PeakLimsSpa.Bff: 0 % XML-doc coverage (0/4)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLimsSpa.Bff/PeakLimsSpa.Bff.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f18b078ffab43d0630aae800abdb0bb587a0d51266f15a60af1150933dddfd"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found at common paths; consider documenting architectural decisions in Docs/ADL/ or similar."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D22","level":"note","message":{"text":"No exposed public API: No intentionally-exposed types (IsPackable or .Contracts) to evaluate."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2712d35e1d1ba8e91a90125d29842b77d4ca65e0eeaa52476c739f7165820a6f"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: A codebase of this size and complexity likely contains implicit architectural boundaries that require explicit declaration to effectively assess cross-boundary coupling. Declare architecture.contexts (\u22652) in config to assess cross-boundary type coupling."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1c7e276c9c682731f01819ed5378b90ca320cde1b583c90920172911598362b3"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// endpoint marker - do not delete this comment\u0022 \u2014 Remove. This is a meta-instruction about the comment itself, not the code. If it\u0027s for a code generator, use a different mechanism (e.g., partial classes or specific file headers) rather than a comment."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Controllers/v1/ContainersController.cs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"c023171aca38cd6a7db39fb192edbacb7f9f6d546b32157854a1db36c1ed9020"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// example for a more complex value object\u0022 \u2014 Remove. The code following it is self-explanatory or already named well enough. If it\u0027s a template for generation, use a template file, not a comment."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Databases/EntityConfigurations/AccessionCommentConfiguration.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f211491f8aeac31e882b732be3be67ce9aa029c4adbf2a10f971c42b8eca8b5"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// Arrange\u0022 \u2014 Remove. \u0027Arrange\u0027 is a standard AAA pattern. The code structure usually makes the phase obvious. If you need to mark test phases, consider using a dedicated test framework attribute or method naming convention instead of comments."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.FunctionalTests/FunctionalTests/AccessionAttachments/UploadAccessionAttachmentFileTests.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a12b6a3345979533df434d69fd5c1459b2f99165326536346d999706314ebea"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// Assert\u0022 \u2014 Remove. Same as above. The assertion calls are visible in the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/tests/PeakLims.IntegrationTests/FeatureTests/AccessionAttachments/DeleteAccessionAttachmentCommandTests.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"53b77d2d37b408e281a67356ebb0427eb3e6d030e9b7fb54135e843b7d11305c"}},{"ruleId":"D25","level":"note","message":{"text":"no ADRs to check: No ADRs found, so conformance can\u0027t be assessed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5f96235c58be08aaae505ba823e9095f206fbc6a447f646e346ee9bd81a5f481"}},{"ruleId":"D26","level":"note","message":{"text":"Split PeakLims: The project is excessively large and spans 177 namespaces, indicating a lack of cohesive responsibility and a high degree of structural fragmentation. Suggested: by namespace clusters or bounded contexts"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"184663f8a98478260bb11f36a8b71372ae40c40d22c94c4614a07d3c0d7ce64c"}},{"ruleId":"D30","level":"error","message":{"text":"Critical CVE: System.Text.Encodings.Web 4.5.0: System.Text.Encodings.Web 4.5.0 (transitive) has a Critical advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4e4448b31e8b4dd1a6489e264df38146de5afb770ee8e6556d999f07ae5800a8"}},{"ruleId":"D30","level":"error","message":{"text":"Critical CVE: System.Text.Encodings.Web 4.4.0: System.Text.Encodings.Web 4.4.0 (transitive) has a Critical advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b868550b58489e0b379cd9b14cc0cd1a4e530bdd52774e0e385cbf0a9ce0b4a1"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: Newtonsoft.Json 11.0.1: Newtonsoft.Json 11.0.1 (transitive) has a High advisory; affects 2 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"165f0e39d55927e001892f9a59b099ef6f3b8d1c9a1dd944473936e47ebbce65"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Text.RegularExpressions 4.3.0: System.Text.RegularExpressions 4.3.0 (transitive) has a High advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b96b7173c4377d5bea4d6fd7b52323631c631c44172b743bec6f266c10a4e538"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: OpenTelemetry.Exporter.Jaeger 1.5.1: OpenTelemetry.Exporter.Jaeger 1.5.1 (direct) has a Medium advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dd55c4ae97ec52c2e7051dd23d5610849f711f9abb7c2d83537ab4afd99423bf"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: OpenTelemetry.Api 1.11.2: OpenTelemetry.Api 1.11.2 (transitive) has a Medium advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4a9fe616efc5437778854e47597a30da634ef249e2ba5caf8128f66d98eafd5"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: SharpCompress 0.29.0: SharpCompress 0.29.0 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b2c771b78d1242b6d61e0bf345856c50c83769beeb5a5bc301911ed38a733232"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Duende.AccessTokenManagement 3.1.1: Duende.AccessTokenManagement 3.1.1 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2b034eda579d260b0a165b09514917edc710a15342571c214318383bda2bc660"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0002: Image user should not be \u0027root\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85d0bc47c60393d89dda7c52057acb11b970d63e1bb6b4686d90c4ef5130cdcb"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"PeakLims/src/PeakLims/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d97b3f0640710f6a669eba634b9ffe12e5270084cb1f2cd63bae9e953260dda"}},{"ruleId":"D32","level":"note","message":{"text":"Not applicable: No PII/GDPR-handling patterns detected (p/gdpr ruleset) \u2014 no data-compliance surface to assess."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"df51e593e9b0b9805626d04fe36a3d12c504b5d7d5da30dc59b5b0f134b5753b"}},{"ruleId":"D33","level":"note","message":{"text":"Not applicable: No JS/npm manifest or lockfile found outside bin/obj (package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb); no JS dependencies to scan."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f46a134eeb447d8c90511e3106af3dac20b26868f5143d77eadbb96ed8f220c6"}},{"ruleId":"D34","level":"note","message":{"text":"Dormant codebase: 66 of 80 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 66 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"ruleId":"D36","level":"note","message":{"text":"Not applicable: The CI pipeline builds and tests but publishes no released artifact \u2014 no package publish, container push, GitHub release or deployment step. Supply-chain provenance, signing and SBOM attest RELEASED artifacts, so there is nothing to attest here. Add them to the release pipeline when this repo starts shipping artifacts (a NuGet package, a container image, a GitHub release)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"383f97e2d2c3d8c6d4adffc68d228db0928a3a8f5c3df1214c0f646687d2dbe9"}},{"ruleId":"D37","level":"note","message":{"text":"Not applicable: No vulnerability-disclosure policy file found (SECURITY.md, .github/SECURITY.md, docs/SECURITY.md, .well-known/security.txt). A coordinated-disclosure policy may live off-repo, so this is not evidenced rather than failed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e748a9b8b3d154964dfb621b8675d34a302dda266d0196c5d83eb8ba4071d61c"}},{"ruleId":"D38","level":"note","message":{"text":"Not applicable: No JS/npm lockfile found outside bin/obj (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb); nothing for OSV to scan."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6ff7301b610918095afd57ac1c89dabddab1d8fdb34c0f0d687159a5a0df0b8e"}}],"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":0,"secretScannerRunsExcluded":0}}}]}