{"$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":"OfficeProvider.CreateSheetFromDataTable (cyclomatic 19): OfficeProvider.CreateSheetFromDataTable has cyclomatic complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Office/OfficeProvider.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c5e27a280eeaef72b188f87fd98a73e1c659de5937530e652ba0f3a82c753a"}},{"ruleId":"D2","level":"warning","message":{"text":"OfficeProvider.CreateSheetFromDataTable (cognitive 29): OfficeProvider.CreateSheetFromDataTable has cognitive complexity 29 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Office/OfficeProvider.cs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"05c600426ad3d82067e3c0303ab31dd830dbef9bc6d9a7e3516166a7ba8188ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): Src/DDD.Services.Api/Controllers/v1/AccountController.cs:215-241 | Src/DDD.Services.Api/Controllers/v2/AccountController.cs:215-241"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v1/AccountController.cs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"541dbad0dd8909347ebf1a378d3b2c7687b1fd1ce9aaf25e507991c50c10c9b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): Src/DDD.Services.Api/Controllers/v1/AccountController.cs:103-126 | Src/DDD.Services.Api/Controllers/v2/AccountController.cs:103-126"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v1/AccountController.cs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8df2935ed3b95de2a4196c51318ce826b54a61d449149fabd8ed49653dc21a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): Src/DDD.Services.Api/Controllers/v1/AccountController.cs:155-175 | Src/DDD.Services.Api/Controllers/v2/AccountController.cs:155-175"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v1/AccountController.cs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a584a7c63017d7e5d97e2480bb6f9dc285fa81bef9c00a8e91a5475efdd2611"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): Src/DDD.Services.Api/Controllers/v1/AccountController.cs:67-83 | Src/DDD.Services.Api/Controllers/v2/AccountController.cs:67-83"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v1/AccountController.cs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cd3edf1f5dad323bfa1f4e13aacffb5b7dcd58b832aa93e18616e909622873a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): Src/DDD.Application/EventSourcedNormalizers/CustomerHistory.cs:62-71 | Src/DDD.Application/EventSourcedNormalizers/CustomerHistory.cs:72-81"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Application/EventSourcedNormalizers/CustomerHistory.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bb23eb5c6a7095c65f30c8076545458e8bc6b3b69e093a87191bc35680f674b"}},{"ruleId":"D5","level":"error","message":{"text":"Layer violation: Application \u2192 Infrastructure: DDD.Application (Application) references DDD.Infra.Data (Infrastructure) \u2014 dependencies must point inward (Web \u2192 Application \u2192 Domain; Infrastructure implements inner interfaces, nothing depends outward on it)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e27aca6f791fcbe2465e67f515025cce032234649858060654062cf706cdb54c"}},{"ruleId":"D5","level":"error","message":{"text":"Layer violation: Domain \u2192 Infrastructure: DDD.Domain (Domain) references DDD.Infra.CrossCutting.Bus (Infrastructure) \u2014 dependencies must point inward (Web \u2192 Application \u2192 Domain; Infrastructure implements inner interfaces, nothing depends outward on it)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"81c20e569dfe9cdb0ffab71d4cf00294810e93d164dd98368cc8879c692906aa"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: DDD.CLI.Migration: DDD.CLI.Migration: 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":"8fe9c56771b3a2c2bc3179ea8578d7ea7cf0f0471bb5321421cab75252ba4a6e"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: DDD.Infra.CrossCutting.Bus: DDD.Infra.CrossCutting.Bus: abstractness 0.00, instability 0.11, distance 0.89 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"804e641e096b36b8cb16a2b09676aa1761f1c2cdb17d4d707db6f8695ddf6586"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: BaseSpecification (LCOM4 6): BaseSpecification\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":"Src/DDD.Domain/Specifications/BaseSpecification.cs"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc14f2023aec8b1207b9f5032b17ff80b2951930d433ac12bb48d40afa789bf6"}},{"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":"D9","level":"note","message":{"text":"Unit tests: 1 unit test method(s)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3067d72f6515925eded797ae6deb86f74d157d3bd0b8e2d3a80edaa12ea95d24"}},{"ruleId":"D9","level":"note","message":{"text":"Integration tests: 0 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":"Mock framework: Moq: DDD.Application.UnitTests references Moq."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"73fecfed0c3032ded0d3446adbea832a077888cea2ae1e5f94659577d9c5590f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock framework: Moq: DDD.Services.Api.IntegrationTests references Moq."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"73fecfed0c3032ded0d3446adbea832a077888cea2ae1e5f94659577d9c5590f"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: AutoMapper: AutoMapper 14.0.0 \u2192 16.1.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c31fd8db76c535ee00b664fa648189351576c63c0d5403c7648ff2a267cc3609"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.Configuration.ConfigurationManager: System.Configuration.ConfigurationManager 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"59d0555d8f505adb3d565a868548c6c80db0bed1f0b82af3a312f178e19902d8"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: FluentValidation: FluentValidation 12.1.0 \u2192 12.1.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cccb73c624602bf750e54c68d0d7c0c94c1c76245e5db9a95611b4ff77609524"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: MediatR: MediatR 12.2.0 \u2192 14.1.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0124487aa08113c6c28616fa62403bb86bbc9336f488c192d0de2988819b3b11"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: NPOI: NPOI 2.7.5 \u2192 2.8.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1438c9bfbaacbb10ed0d5bc5746837de4f64afbd485f858a9a57b9a216f808d5"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Quartz.AspNetCore: Quartz.AspNetCore 3.15.1 \u2192 3.18.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a7cd0077cc0de8e3da506dff500c9d5751fc4b168fe715fd1ba4d62140728759"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Refit.HttpClientFactory: Refit.HttpClientFactory 8.0.0 \u2192 11.2.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cf72f1e87bcfe1788565a8e0fba74c988116d0a383395fa316f597df177176dc"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.Authentication.JwtBearer: Microsoft.AspNetCore.Authentication.JwtBearer 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f3f32aca35b9f2bce59fe364cd5f9f329a8794586827406d6d886ee25017cd7b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.Identity.EntityFrameworkCore: Microsoft.AspNetCore.Identity.EntityFrameworkCore 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9abc23507b021d94fc7a3e0c491dd925b2f891f91c663d42544ce9e932475b63"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore: Microsoft.EntityFrameworkCore 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d6bc2cfd10f7debbe91b72d5c6f7efc119f7ab6934ee550f9b52ebd81d514ebe"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Sqlite: Microsoft.EntityFrameworkCore.Sqlite 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ca1f26ceea81e25ff353f12edb9683cd25576659307f775be3350af4c8f46ce2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.SqlServer: Microsoft.EntityFrameworkCore.SqlServer 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"937054724777e95f02b0cf71e7f6c536b9c54ad74128487d9f2e2a723becb2ef"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.IdentityModel.Tokens.Jwt: System.IdentityModel.Tokens.Jwt 8.15.0 \u2192 8.19.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dd511ba2c5b237bd4227729986865d25bb6646c6fb629b8eb7281557e1de800d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore: Microsoft.EntityFrameworkCore 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d6bc2cfd10f7debbe91b72d5c6f7efc119f7ab6934ee550f9b52ebd81d514ebe"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.Sqlite: Microsoft.EntityFrameworkCore.Sqlite 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ca1f26ceea81e25ff353f12edb9683cd25576659307f775be3350af4c8f46ce2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.EntityFrameworkCore.SqlServer: Microsoft.EntityFrameworkCore.SqlServer 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"937054724777e95f02b0cf71e7f6c536b9c54ad74128487d9f2e2a723becb2ef"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Asp.Versioning.Http: Asp.Versioning.Http 8.1.0 \u2192 10.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9e55ffb7089c38423f10092f81875766c80b850627591bbcfa02ba448565bb8d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Asp.Versioning.Mvc.ApiExplorer: Asp.Versioning.Mvc.ApiExplorer 8.1.0 \u2192 10.0.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7000cb35decb6c90220015c1f02b79a43113efab5fdd34297c100cf48ec45517"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.OpenApi: Microsoft.AspNetCore.OpenApi 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"025dc7c0217feb228b75eaea392c70fe83ab95d0d1792231fc25b08a032ae7fb"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore: Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ac61446709b7d86164ff8678311346482ec17aa865b23b01c1895e8532d30ba6"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.Extensions.Http.Polly: Microsoft.Extensions.Http.Polly 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c60e25816239f905ffa6232abdd5b555ff157eff0d54b613d34f5fa83fb1e04d"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.NET.Test.Sdk: Microsoft.NET.Test.Sdk 18.0.1 \u2192 18.6.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e92dcd48f7ffe19d959e6b8961b53cbea7b17fb2d62d0f9d1f5c4c7b07984fab"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Moq: Moq 4.20.70 \u2192 4.20.72 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"42946f5ed16f6a0c4101b8b1c1ed79fe3ab39ea782fa2d0bf1e00c260f2aed36"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: coverlet.collector: coverlet.collector 6.0.4 \u2192 10.0.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9e862b60ea0e6244916f0a40a9c1d5da15704f97aa0d556f0c0430eff9e4638f"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: FluentAssertions: FluentAssertions 6.12.0 \u2192 8.10.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0085902f0e492e23c9753c9fc12aacb765aea06e92e21b8cad4f199a4e5c43ce"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.Mvc.Testing: Microsoft.AspNetCore.Mvc.Testing 10.0.0 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"99225cf2945eea3bb5234c962ae56cc8ceaaf2816adf090819dcc0b630220288"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.NET.Test.Sdk: Microsoft.NET.Test.Sdk 18.0.1 \u2192 18.6.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e92dcd48f7ffe19d959e6b8961b53cbea7b17fb2d62d0f9d1f5c4c7b07984fab"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Moq: Moq 4.20.70 \u2192 4.20.72 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"42946f5ed16f6a0c4101b8b1c1ed79fe3ab39ea782fa2d0bf1e00c260f2aed36"}},{"ruleId":"D12","level":"error","message":{"text":"Vulnerable: AutoMapper: AutoMapper 14.0.0 \u2014 High severity. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7ad907f4096422e42924a00fab6889d83782c07f3031eeb825e84a391fcadb56"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: xunit: xunit 2.9.3 \u2014 Legacy xunit.v3 \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d37c8c0e8046c9e8358e976373216abfb78e9fdef63ed53d3edcaa7d2238edcd"}},{"ruleId":"D12","level":"warning","message":{"text":"Deprecated: xunit: xunit 2.9.3 \u2014 Legacy xunit.v3 \u003E= 0.0.0"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d37c8c0e8046c9e8358e976373216abfb78e9fdef63ed53d3edcaa7d2238edcd"}},{"ruleId":"D14","level":"note","message":{"text":"Licenses scanned: 7 packages scanned; 2 distinct SPDX licenses."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d29d66daec20840f6831f63c1b66b87c40390635ef3e9f728002964c77e88d4"}},{"ruleId":"D16","level":"note","message":{"text":"Small-team knowledge concentration: 6 file(s) are concentrated to one author \u2014 the ambient state with 2 active author(s), not 6 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, 6 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":"732be8cd1d82b7b4078e5890eaf2f9fb953abadf13a625817bf9df5b19c45952"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 8 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Application/AutoMapper/AutoMapperConfig.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac931abc8360785150351436e58c7e07d94bfdcc5c3ee20b3a962f7dcea647e"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Crons/CronProvider.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4dc1533eb4f4325b1c52b9d1f4b227c92b18beeb47d8028507053a58f3992b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Crons/CronProvider.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4dc1533eb4f4325b1c52b9d1f4b227c92b18beeb47d8028507053a58f3992b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 7 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Crons/CronProvider.cs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4dc1533eb4f4325b1c52b9d1f4b227c92b18beeb47d8028507053a58f3992b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Your logic 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":"Src/DDD.Domain/Providers/Crons/Jobs/NotifyInactiveUserJob.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23c8a3629be3f651a68607ff55ab1882b2e7b9a80cd53ce3e08d11083a0de9b"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Crons/Jobs/NotifyInactiveUserJob.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"424c97ca57d37d42d5e6b3f3de8f76056aa4161d61e4b9707338a6f9596855cb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle queryParams, headers \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":"Src/DDD.Domain/Providers/Http/HttpProvider.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d601bea36d88d87a07603b76e324a927b771d11fb1bb63cadcd9c014ff2e182d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle queryParams \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":"Src/DDD.Domain/Providers/Http/HttpProvider.cs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"d601bea36d88d87a07603b76e324a927b771d11fb1bb63cadcd9c014ff2e182d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle queryParams \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":"Src/DDD.Domain/Providers/Http/HttpProvider.cs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"d601bea36d88d87a07603b76e324a927b771d11fb1bb63cadcd9c014ff2e182d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle queryParams \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":"Src/DDD.Domain/Providers/Http/HttpProvider.cs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"d601bea36d88d87a07603b76e324a927b771d11fb1bb63cadcd9c014ff2e182d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Find connectionId \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":"Src/DDD.Domain/Providers/Hubs/Notification/NotificationProvider.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6331e7d43f8b358cd3109e8a69e2230c61ee9aa95d9e24e2da288e13dec18e02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Find connectionId \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":"Src/DDD.Domain/Providers/Hubs/Notification/NotificationProvider.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"6331e7d43f8b358cd3109e8a69e2230c61ee9aa95d9e24e2da288e13dec18e02"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Mail/MailProvider.cs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"473ac21b0548478f82d9f5c1609f1204a8ad96595ea84d291e1532fbaee6cdfd"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Mail/MailProvider.cs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"473ac21b0548478f82d9f5c1609f1204a8ad96595ea84d291e1532fbaee6cdfd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Upload \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":"Src/DDD.Domain/Providers/Office/OfficeProvider.cs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ca1cc0b5695551cc29715fb216ad2a9f13eb5e0e2ee21365f195003cf052f6"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 6 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Office/OfficeProvider.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee27a426149a68e7a5e3b9aa38470aa8d81156c411a975d7e4933871d9c26470"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Get real current user id \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":"Src/DDD.Infra.Data/Context/ApplicationDbContext.cs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"bad390fa77e61d27e66c4d8c2577121b58e181b32cb948a19e4493f491c81686"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.Data/Context/ApplicationDbContext.cs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b164b03ecdc4d06c0c870a26a03b4c46c26334725de726fc76eb8841f7e908b0"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 5 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.Data/Context/ApplicationDbContext.cs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b164b03ecdc4d06c0c870a26a03b4c46c26334725de726fc76eb8841f7e908b0"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: #pragma warning disable SA1401 // Fields should be private"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.Data/Repository/Repository.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"7091ed7cb9a5d72a47ba2f07c73f7a6a0b41cf48fa067316decc68e33b6fc96d"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 9 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Configurations/AutoMapperSetup.cs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"a72b0071d77f99b4676317b8396daede80ac9628808f29264d755ffbd3f12c64"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 4 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/StartupExtensions/DatabaseExtension.cs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1f7526678e46aac6a407e7d2948d7155829fac00257bf9ac5df08037d43f524"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: AD0001"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/DDD.Services.Api.csproj"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b147375c59fa5967d3e122267a94c96662a359096553fbae0b302ffb4e4560"}},{"ruleId":"D17","level":"error","message":{"text":"NoWarnInCsproj: NETSDK1206"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/DDD.Services.Api.csproj"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b147375c59fa5967d3e122267a94c96662a359096553fbae0b302ffb4e4560"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: Program: NamedType Program \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.CLI.Migration/Program.cs"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"484eae0a8dd2c58b4e6b6a427d3f72643065f648408d105b82020e64294b41cb"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Application (Production): 8 .cs files, 305 LoC (235 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Application/DDD.Application.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5de5cda1ef1b77ae1cd942ff4ad95f0c0da4bf6e3a9ac401262343e01c42d5c2"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.CLI.Migration (Production): 1 .cs files, 54 LoC (42 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.CLI.Migration/DDD.CLI.Migration.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6cb6b21133271d0c316001686d821dde56540f227295eacf371404682526bc"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Domain.Core (Production): 12 .cs files, 294 LoC (211 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain.Core/DDD.Domain.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e91e81aca5088983f550ecf9ff435e1be64d2f374ab2ba35998a742123a74b2"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Domain (Production): 54 .cs files, 1604 LoC (1104 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/DDD.Domain.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4033dfeb3444dc49ccb5c61d5b5d097488a06220d94c83ba78091369e9b7985"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Infra.CrossCutting.Bus (Production): 1 .cs files, 39 LoC (30 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.CrossCutting.Bus/DDD.Infra.CrossCutting.Bus.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"971e8544b732e69f66e6df3a19d112d7d102717cd314693c108431544bae494f"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Infra.CrossCutting.Identity (Production): 35 .cs files, 1035 LoC (747 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.CrossCutting.Identity/DDD.Infra.CrossCutting.Identity.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d672e99206bc1d66ad96758fba060d18a616a94017dad118dbaaf4492b471d2"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Infra.CrossCutting.IoC (Production): 1 .cs files, 87 LoC (59 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.CrossCutting.IoC/DDD.Infra.CrossCutting.IoC.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"998b277d71606f93afb8aa115f7a01346a07f492ef3d06bdf1e115af76bd88b3"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Infra.Data (Production): 15 .cs files, 602 LoC (449 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.Data/DDD.Infra.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c12d89f8d21b053b7b13373644092bf48725af1b006135eea2c72ff9b68cd4a2"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Services.Api (Production): 17 .cs files, 1383 LoC (930 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/DDD.Services.Api.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f219f5716d726c70834b8aeed6eb79f71bd50de2ea554f96f61c75f466cb0036"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Application.UnitTests (Test): 2 .cs files, 50 LoC (36 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Tests/DDD.Application.UnitTests/DDD.Application.UnitTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e7504bc0dbff1ac7aa24ad70b8b486bc189fe6d3d9b4b0403d7bb72fc7fa842"}},{"ruleId":"D18","level":"note","message":{"text":"DDD.Services.Api.IntegrationTests (Test): 2 .cs files, 21 LoC (17 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Tests/DDD.Services.Api.IntegrationTests/DDD.Services.Api.IntegrationTests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2c5829d3d9150e226bbdebd937ebd6ccf6780553cdda1b21bc5aa8ebb084fd6"}},{"ruleId":"D19","level":"warning","message":{"text":"LLM evaluation failed: documentation evaluation failed: Name or service not known (canine-dgx1:80)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"84619704bc3bcb3f3b19b21245ed20bfef89f3b900efe4ba59acd9f2f01c53cb"}},{"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":"D21","level":"warning","message":{"text":"LLM evaluation failed: naming-consistency evaluation failed: Name or service not known (canine-dgx1:80)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f1ae115dd06b671c0a43940af011b21b5b96f5c4933cd4b95a9fc33856f94e45"}},{"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":"error","message":{"text":"Dimension evaluation failed: Dimension threw: Name or service not known (canine-dgx1:80)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"23d3af50e7d3bd6d11e18aeaaed67b4c5bd5bf1a98b2e37c9096f9e9b60ad470"}},{"ruleId":"D24","level":"warning","message":{"text":"LLM evaluation failed: comment-value evaluation failed: Name or service not known (canine-dgx1:80)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0c868e6efee1b0dce8351bfc608279bd0d6c4f03b8a164d980102e4103c28c0d"}},{"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":"D28","level":"note","message":{"text":"Rotate the exposed credentials \u2014 git history can\u0027t be un-committed: These secrets are in git HISTORY: deleting the file does not remove them (the commit persists on every clone, fork and backup). The remediation is to ROTATE each exposed credential and treat it as compromised \u2014 not to delete the file. Rewriting history is disruptive and unreliable across existing forks."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: AutoMapper 14.0.0: AutoMapper 14.0.0 (direct) has a High advisory; affects 5 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2f3f977fd628450f0f2d394acbc594ffb0c42971e812ca2f57d11b102cf0de54"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: SQLitePCLRaw.lib.e_sqlite3 2.1.11: SQLitePCLRaw.lib.e_sqlite3 2.1.11 (transitive) has a High advisory; affects 7 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d246d75b65523bf2d2a40511b99aa4a99c398d84dce0bc89395442294f995af5"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Security.Cryptography.Xml 8.0.2: System.Security.Cryptography.Xml 8.0.2 (transitive) has a High advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0b05188412af229ef2c0cd9ca007c6d403610e7ff1e66ceac01d6a43644af284"}},{"ruleId":"D30","level":"error","message":{"text":"High CVE: System.Security.Cryptography.Xml 8.0.2: System.Security.Cryptography.Xml 8.0.2 (transitive) has a High advisory; affects 6 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0b05188412af229ef2c0cd9ca007c6d403610e7ff1e66ceac01d6a43644af284"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Azure.Identity 1.10.3: Azure.Identity 1.10.3 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"045e9eaf2ec62fceb60477dd379a801f46340dedb0c9415d1920e111d035db30"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Azure.Identity 1.10.3: Azure.Identity 1.10.3 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"045e9eaf2ec62fceb60477dd379a801f46340dedb0c9415d1920e111d035db30"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Microsoft.Identity.Client 4.56.0: Microsoft.Identity.Client 4.56.0 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"438d8dc74930ecd1b568daade46d8fe926bf9700c6d5ae5197bc71a6ee251442"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: Microsoft.IdentityModel.JsonWebTokens 6.24.0: Microsoft.IdentityModel.JsonWebTokens 6.24.0 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8c5befb86e53034ab72e241f96f9bcdd1112c97a565b97a680e23a0ef98049c9"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: System.IdentityModel.Tokens.Jwt 6.24.0: System.IdentityModel.Tokens.Jwt 6.24.0 (transitive) has a Medium advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9edcd1fe22279a6cdb47df108e8a3cf0b833bb878bb5bc4a9e1a92f2ae090c4d"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: KubernetesClient 15.0.1: KubernetesClient 15.0.1 (transitive) has a Medium advisory; affects 2 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6f2f30b7124d59c5d715321b5745568c653ce00878edd6634c97785f4efde171"}},{"ruleId":"D30","level":"note","message":{"text":"Low CVE: Microsoft.Identity.Client 4.56.0: Microsoft.Identity.Client 4.56.0 (transitive) has a Low advisory. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bc307a6ff4cf614c6ccb2a5e077e75ba347d63ab405d80a53a33cf01a7ee6ff8"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0002: Image user should not be \u0027root\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Containerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d659c6e92a7152c126c6f4f0fc9ba5fe47371839fd50fc47de98d04bb26be48f"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0002: Image user should not be \u0027root\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2d688610b51e0a5a02c7c5dd1724a4986e40f2689fb84510e2ec0164c27d6a"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: KSV-0014: Root file system is not read-only"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd64f11a6393cee646acb4a381b7dbf1209f9ff260a2bedd97b51679bbf47d64"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: KSV-0118: Default security context configured"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df7c281cf38ec67ead9883c64dc9d58e795e87039b1c8e0d4ff1d3b7fd5f745"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: KSV-0118: Default security context configured"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df7c281cf38ec67ead9883c64dc9d58e795e87039b1c8e0d4ff1d3b7fd5f745"}},{"ruleId":"D31","level":"warning","message":{"text":"Medium IaC: KSV-0001: Can elevate its own privileges"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ba1389244bed65d7745b3b6ebbfcfd8ee44e9d4e7129411216d2931e1fec243"}},{"ruleId":"D31","level":"warning","message":{"text":"Medium IaC: KSV-0012: Runs as root user"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a427ef50f3ceed4828b368a83ec02d101e4da804055fb78843060ba45095677b"}},{"ruleId":"D31","level":"warning","message":{"text":"Medium IaC: KSV-0013: Image tag \u0022:latest\u0022 used"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb2f5cd94244cbaf201769409ce6a4976991acfd6523dbfdd927e4ee4b5a9bcf"}},{"ruleId":"D31","level":"warning","message":{"text":"Medium IaC: KSV-0104: Seccomp policies disabled"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3eadfed027d59628ae16915ccb5e83b8ca726d264ca43c364c2077f5e93b57"}},{"ruleId":"D31","level":"warning","message":{"text":"Medium IaC: KSV-0117: Prevent binding to privileged ports"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecfd60d149f206074c3a5f6c9fcdf82a8d2026994d0fa6cf8e34757c46e39741"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Containerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"665ff9b4c2b8ad853a33b94dd70a0013e5b2b7a403ff3e7af9190ac766081fb0"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f51a163f26d94ce6b6f473117dde579d091c8cbf9e59810475c94d9fc921120"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0003: Default capabilities: some containers do not drop all"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5c8af8cfcfc2f6ef3828fcb40ea268dca8abd635da0a7f4534a38d1e181750"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0004: Default capabilities: some containers do not drop any"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e624c46d542b1a07b7c006a2ebf9f99a64d5e664736677cf6b91979679336419"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0011: CPU not limited"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c96e7f5686b75be206532c1fc96f54dce6047b3d1d95df7028812f991edb7b7"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0015: CPU requests not specified"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64ee101fe5107e79331d727f59762ab1d002b98f348d3683bffbeb57c6f9745d"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0016: Memory requests not specified"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4c63069267ce1df56826f0ad7edbc656cf50823b08a4780ecd963fbbcd6734c"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0018: Memory not limited"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0514da6bf59a1f86c16a6a5f4a54d77e57a28e7d669995e1d654a3c8bf53d6ee"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0020: Runs with UID \u003C= 10000"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"409e7a3d9fda3c7a44bb0e0b998ad7166ab0a53bab7b8c74b4f51cf270830b69"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0021: Runs with GID \u003C= 10000"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"162f71a4bd58327dde40d7f8cd912dbd43b7e8b48dbdc967b312e0b344a86086"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0030: Runtime/Default Seccomp profile not set"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9037b0227f8a747326c228c97f08917e9ee62356e63aec5d87d7e5e572697a84"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0106: Container capabilities must only include NET_BIND_SERVICE"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"204a126167356ca1503791aef618175c2c2083fa0f02d0d7db20c7e64cb7d947"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: KSV-0110: Workloads in the default namespace"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"manifests/deployment.yml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbc771175d109880681baecd603839f775a585754067e0ddb911c1b146ed28c"}},{"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":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v1/AccountController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1f2a2c27dfb396ae5036611c2f37763490fa111a20dd07a9249cd9519f595c"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v2/AccountController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58cc4cb03384c9a66cb2e0596de463ac91e396a889c748375999be6719a87b4f"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Office/OfficeProvider.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2024f2720d8ed51b3af495180728623520f3d8dee36fb14e917a20ae76fe2e"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Program.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2efe536f192ec36483d75d8655fb5e9f7e618ea531e8f6717b6351ba896f0d1e"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/Providers/Http/HttpProvider.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c177a386e7843101c2cd77ee96003c3eed9b5b3cf9f4155f6080375d98505328"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/StartupExtensions/SwaggerExtension.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c74b40b0487d3b9e1219f9c92a6a6420b7f883bf3948526373a1adf7a031cf3"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/StartupExtensions/AuthExtension.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb866e0d5650f9cc28f2bfa49d277a66659235f45090adc57d6d63b056ec659a"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Application/EventSourcedNormalizers/CustomerHistory.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff441028bb7565182ee46e952c15acf277ac7f280bcf845fe213527796398d6"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.CrossCutting.IoC/NativeInjectorBootStrapper.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3315674c8cec1269a7504cff31a1734899817013bb131878543ce8f24cc439f1"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Domain/CommandHandlers/CustomerCommandHandler.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeba58b4115d739be88f1c3d2f7a96f61addd397cfb82209ec75ebc40f0a704e"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.Data/Context/ApplicationDbContext.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa0b8b5ac0041c7788e748c1c7ce56fdd2a12b52bdec96825a72ec8ccca834b6"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Services.Api/Controllers/v1/CustomerController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13a389aa4ce30973b2fb26a1dca7934619a74da536d56e6da5a33c31e9ea9b5"}},{"ruleId":"D34","level":"warning","message":{"text":"Orphaned knowledge: No living knowledge remains for this file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Src/DDD.Infra.CrossCutting.Identity/Services/JwtFactory.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ce64e8c68066fb4048011f9a04ac8802faf304cb43a5ea4101939958b5c6a7d"}},{"ruleId":"D36","level":"note","message":{"text":"No build provenance: No SLSA provenance generation or build attestation found in CI (e.g. slsa-github-generator, actions/attest-build-provenance)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"}},{"ruleId":"D36","level":"note","message":{"text":"No artifact signing: No artifact signing found in CI (e.g. cosign / sigstore / gitsign)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0e17f71490e4d120a48b2b2881ab866c93b272bef2febb673a3e8e42b2c288ab"}},{"ruleId":"D36","level":"note","message":{"text":"No SBOM: No SBOM generation or committed SBOM found (e.g. syft / anchore/sbom-action / *.spdx.json / *.cdx.json)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"Unpinned build actions: CI references GitHub Actions by a floating ref (@main / @tag) rather than a pinned commit SHA, weakening build integrity."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}},{"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}}}]}