{"$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":"D2","level":"warning","message":{"text":"BsonDocumentExtensions.Find (cognitive 33): BsonDocumentExtensions.Find has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Extensions/BsonDocumentExtensions.cs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f4deba371fcc39b0bf4460f2678e15244287ffec86189ef66573c468c0128b6"}},{"ruleId":"D2","level":"warning","message":{"text":"IDictionaryExtensions.Find (cognitive 33): IDictionaryExtensions.Find has cognitive complexity 33 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Extensions/IDictionaryExtensions.cs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b9df2a5bfea17e1c640b31ef6396aa87815856ab10fc74738706cdef96a5b32"}},{"ruleId":"D2","level":"warning","message":{"text":"CreateProjectionTypeCommandHandler.HandleAsync (cognitive 31): CreateProjectionTypeCommandHandler.HandleAsync has cognitive complexity 31 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Commands/ProjectionTypes/CreateProjectionTypeCommandHandler.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a27401471ab1a52822dbf1e31fb860d2916e7cbabca38f46ff366f7f3d08c8"}},{"ruleId":"D2","level":"warning","message":{"text":"QueryOptionsExtensions.BuildFilter (cognitive 26): QueryOptionsExtensions.BuildFilter has cognitive complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Extensions/QueryOptionsExtensions.cs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a45700da2195ae99f7afe7bae9d7f0c508623cc45800eae386b4397e9b328a"}},{"ruleId":"D2","level":"warning","message":{"text":"Repository.AddAsync (cognitive 26): Repository.AddAsync has cognitive complexity 26 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Services/Repository.cs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ee5b49ccec6c393b92fa52077438dbafe33a8c36334e38ba2094ee4a3987998"}},{"ruleId":"D2","level":"warning","message":{"text":"Repository.UpdateAsync (cognitive 25): Repository.UpdateAsync has cognitive complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Services/Repository.cs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"40abaecf98222397b9e55dba4c7a8c64104e5b9b3653ce0b50853380d6d6986a"}},{"ruleId":"D2","level":"warning","message":{"text":"UpdateTriggerEditorModal.razor \u203A OnEditorInputChangedAsync (cognitive 25): UpdateTriggerEditorModal.razor \u203A OnEditorInputChangedAsync has cognitive complexity 25 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Components/CreateUpdateEditorModal/UpdateTriggerEditorModal.razor"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6a215499faf9a3c048146a7c7f9e13bfa80be382858522e655a7a94d05bf8d"}},{"ruleId":"D2","level":"warning","message":{"text":"Repository.DeleteAsync (cognitive 24): Repository.DeleteAsync has cognitive complexity 24 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Services/Repository.cs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"38735fe26170f962e57a4322bb81e056564edeac972f0dc1e6d80123a42c213a"}},{"ruleId":"D2","level":"warning","message":{"text":"BsonDocumentExtensions.ReplaceRecursive (cognitive 23): BsonDocumentExtensions.ReplaceRecursive has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Extensions/BsonDocumentExtensions.cs"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d2ad5af56f812c6dfb2c6ef0b6c0450352269663c07a876d554596a0cf4d140"}},{"ruleId":"D2","level":"warning","message":{"text":"BsonDocumentExtensions.AddToRecursive (cognitive 23): BsonDocumentExtensions.AddToRecursive has cognitive complexity 23 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Extensions/BsonDocumentExtensions.cs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"1495cf2f6b4d779d01752c2f7a905aa447972038ad784771ff4da767a46bbd34"}},{"ruleId":"D2","level":"warning","message":{"text":"MigrateProjectionTypeSchemaCommandHandler.HandleAsync (cognitive 19): MigrateProjectionTypeSchemaCommandHandler.HandleAsync has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Commands/ProjectionTypes/MigrateProjectionTypeSchemaCommandHandler.cs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbba62bae610342462340a4030a8768c26878f81e49a03ba9c746e5ae1fbdaa8"}},{"ruleId":"D2","level":"warning","message":{"text":"DatabaseProvisioner.PrioritizeProjectionTypes (cognitive 19): DatabaseProvisioner.PrioritizeProjectionTypes has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/Services/DatabaseProvisioner.cs"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ecda9d1a46572a772d215932e5bc264f9f3e38e548e658780dd213bd6ec2a5"}},{"ruleId":"D2","level":"warning","message":{"text":"StoreFactory.FindAndMapReducersPerState (cognitive 19): StoreFactory.FindAndMapReducersPerState has cognitive complexity 19 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard.StateManagement/StoreFactory.cs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"93bf19930b7516d0abd06878fa2eb78f8f0003210b8b8826c9d8ec153f75507c"}},{"ruleId":"D2","level":"warning","message":{"text":"StoreFactory.ConfigureStoreEffects (cognitive 17): StoreFactory.ConfigureStoreEffects has cognitive complexity 17 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard.StateManagement/StoreFactory.cs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f87455f34e1806ff2bbb452581907c69bf391e4c1ca0796abed7d3b64bed9de"}},{"ruleId":"D2","level":"warning","message":{"text":"View.razor \u203A OnProjectionTypeEditorAsync (cognitive 16): View.razor \u203A OnProjectionTypeEditorAsync has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Pages/ProjectionTypes/Editor/View.razor"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab1779556e4b4efb18568bb12a35021aa79266ba98eec3d13a61170efa3fc18"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: View.razor \u203A __RazorCode_View_1: TooManyMethods \u2014 0 lines, 45 methods."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Pages/Projections/List/View.razor"},"region":{"startLine":0}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa7a8a4b608dfb28d24aaaf0c5f4de04397809b2e61a5cb2bf855b1e36b4efc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (65 lines \u00D7 2): src/CloudShapes.Dashboard/Components/ProjectionsNav/Store.cs:66-129 | src/CloudShapes.Dashboard/Pages/Projections/List/Store.cs:429-493"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Components/ProjectionsNav/Store.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece78202b8b54281c57507f074a3ba2b34073ad736a10c7010e3b6d99a2c9b5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): src/CloudShapes.Dashboard/Pages/ProjectionTypes/Indexes/Store.cs:77-85 | src/CloudShapes.Dashboard/Pages/ProjectionTypes/Relationships/Store.cs:77-85 | src/CloudShapes.Dashboard/Pages/ProjectionTypes/Schema/Store.cs:77-85 | src/CloudShapes.Dashboard/Pages/ProjectionTypes/Triggers/Store.cs:77-85"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Pages/ProjectionTypes/Indexes/Store.cs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"737bed2751de61769d588c3e3dd216f3f08dc7fa04e5a1dc1c76e1138cc91a57"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/CloudShapes.Data/Extensions/BsonDocumentExtensions.cs:99-107 | src/CloudShapes.Data/Extensions/BsonDocumentExtensions.cs:169-177"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Extensions/BsonDocumentExtensions.cs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd67cafd2db877ca41e6518b0883ac0407420d11e68594f04b01f4bd9a21e60e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): src/CloudShapes.Data/Extensions/JsonSchemaExtensions.cs:36-43 | src/CloudShapes.Data/Extensions/JsonSchemaExtensions.cs:70-77 | src/CloudShapes.Data/Extensions/JsonSchemaExtensions.cs:102-109"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Extensions/JsonSchemaExtensions.cs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2695e731394c97d7839824d4d094f257d855ee4088d74dfbd59d359f5d00ec2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/CloudShapes.Dashboard.StateManagement/Feature.cs:61-65 | src/CloudShapes.Dashboard.StateManagement/State.cs:53-57"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard.StateManagement/Feature.cs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2cff87b27afaff9e3152aea87e321096a9aa9bfc7931c841df058f8c1a3bfe"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: CloudShapes.Data: CloudShapes.Data: abstractness 0.02, instability 0.00, distance 0.98 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dd7a837d25fac41d643a04e4fc48dd5d55dea9f412f470852c0e3051ef51f7cd"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: CloudShapes.Integration: CloudShapes.Integration: abstractness 0.04, instability 0.20, distance 0.76 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d99880bdec7950d32433c43b9a380129af77efbf0015507c3f0e695ff522c9ab"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ProjectionListStore (LCOM4 8): ProjectionListStore\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":"src/CloudShapes.Dashboard/Pages/Projections/List/Store.cs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4448c53c2ca2a88567d3b35fe25a97e37f4a34587ced78459ecbb0c30bafb4f8"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ProjectionTypeListStore (LCOM4 6): ProjectionTypeListStore\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/CloudShapes.Dashboard/Pages/ProjectionTypes/List/Store.cs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5409436f99f4774672732e46e9d09a1a03fdb44c8fe514ae0a58d0fe8cc8c06"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ProjectionTypeEditorStore (LCOM4 4): ProjectionTypeEditorStore\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":"src/CloudShapes.Dashboard/Pages/ProjectionTypes/Editor/Store.cs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"348c53f20aa8f9c8002c86537d867899af716846bf93c489af26868cfac9ac71"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: MonacoEditorHelper (LCOM4 4): MonacoEditorHelper\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":"src/CloudShapes.Dashboard/Services/MonacoEditorHelper.cs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9aa732d62c8ef5647c8ec85306a08416562f140a599d1ac8bb686c70c529db7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: StatefulComponent (LCOM4 4): StatefulComponent\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":"src/CloudShapes.Dashboard/StatefulComponent.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81599fb7ce593937931c89a22e38b6486072546fca26e8d249fbce70f4824ed"}},{"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":"error","message":{"text":"No automated tests: No automated tests \u2014 the solution has no test code. Untested code is the largest single risk to changing it safely."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3132564c6310e5d01a231f252a02d5d2f5a542c0a8fa29a14c89693f1e3df871"}},{"ruleId":"D9","level":"note","message":{"text":"No tests found: No test projects found in the repository."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c9bf64cbb5a4ae13d6bcd01fa3bc8d2879d860c73bc67f176ee3c2cecb8adce3"}},{"ruleId":"D11","level":"note","message":{"text":"No tests discovered: Test reliability not scored \u2014 the test tier(s) built and ran but no tests were discovered, so reliability couldn\u0027t be exercised."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e4c0ab67b9e87c02498c138fb50373fdab655734b894db638fb9443a28b824b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: MongoDB.Driver: MongoDB.Driver 3.3.0 \u2192 3.9.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"20e9df274bfa57689803cf29e356ebfddeee233171bd4b208ba6e02bd520fe19"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Neuroglia.Data.Expressions.Abstractions: Neuroglia.Data.Expressions.Abstractions 4.21.0 \u2192 4.24.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"548bba0d7753a789a00a5cd755e613984b5d51960feaf51105076a47a5771cdb"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Neuroglia.Eventing.CloudEvents.Infrastructure: Neuroglia.Eventing.CloudEvents.Infrastructure 4.21.0 \u2192 4.24.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ac5175a25cefca91caa19ecf31c0705423d8f845297f5b257f36ee7b9045211a"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Neuroglia.Mediation: Neuroglia.Mediation 4.21.0 \u2192 4.24.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d4aa2821721a82b049a0f5d10f760ef54df9aebf52b5429774e3d54a48811258"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: System.Linq.Async: System.Linq.Async 6.0.1 \u2192 7.0.1 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e79e9c6a8cc4011f440cb8f11963f1e402e1886d60877c0ff4d00b9ab904a2d3"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.Components.WebAssembly.Server: Microsoft.AspNetCore.Components.WebAssembly.Server 9.0.4 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a178ea7d3f39d1112c737a3b36929d0b0c3b16d57ffdb2277635aeb45004d2b2"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.AspNetCore.OpenApi: Microsoft.AspNetCore.OpenApi 9.0.4 \u2192 10.0.9 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"025dc7c0217feb228b75eaea392c70fe83ab95d0d1792231fc25b08a032ae7fb"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Microsoft.VisualStudio.Azure.Containers.Tools.Targets: Microsoft.VisualStudio.Azure.Containers.Tools.Targets 1.21.2 \u2192 1.23.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"446bf9564187c39454637cb2540266113f6e25c50c7174c075c5017effe1bf5b"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Neuroglia.Data.Expressions.JQ: Neuroglia.Data.Expressions.JQ 4.21.0 \u2192 4.24.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f01b64279db25e0d45f83f693c08e061c799af5e4857958ea1a672cbb94f4d02"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Neuroglia.Mediation.AspNetCore: Neuroglia.Mediation.AspNetCore 4.21.0 \u2192 4.24.0 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9619a845a4c284131e733a2b83c5251557a90746bfcfa22d479679f312139a63"}},{"ruleId":"D12","level":"note","message":{"text":"Outdated: Scalar.AspNetCore: Scalar.AspNetCore 2.1.16 \u2192 2.16.4 available."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4fbb499638e1f6d3767a9e54e6a06bd9aff212fa07cc24598bdbd018593b96ed"}},{"ruleId":"D14","level":"note","message":{"text":"Licenses scanned: 31 packages scanned; 2 distinct SPDX licenses."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d29d66daec20840f6831f63c1b66b87c40390635ef3e9f728002964c77e88d4"}},{"ruleId":"D16","level":"note","message":{"text":"Small-team knowledge concentration: 43 file(s) are concentrated to one author \u2014 the ambient state with 4 active author(s), not 43 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, 43 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":"cba8376d9c3b7b1a1651f130ae5e7a1c8f863441f5630db7ed21eaf7ffd61f7f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: handle ex \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/CloudShapes.Dashboard/Components/MonacoEditor/Store.cs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"47354b2c970f60fb925b0d81201e374294ca86d5b6484b880d531b4078bf24ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //todo: handle ex \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/CloudShapes.Dashboard/Components/MonacoEditor/Store.cs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"47354b2c970f60fb925b0d81201e374294ca86d5b6484b880d531b4078bf24ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //todo: handle ex \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/CloudShapes.Dashboard/Components/MonacoEditor/Store.cs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"47354b2c970f60fb925b0d81201e374294ca86d5b6484b880d531b4078bf24ed"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Components/MonacoEditor/Store.cs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"78834d6f3816ab812ccfae7abff4c78990a0b25e7c719c377090b3a2c0440664"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Components/MonacoEditor/Store.cs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"78834d6f3816ab812ccfae7abff4c78990a0b25e7c719c377090b3a2c0440664"}},{"ruleId":"D17","level":"note","message":{"text":"Justified suppression: empty catch \u2014 narrow/filtered/commented, treated as intentional"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/Components/MonacoEditor/Store.cs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"78834d6f3816ab812ccfae7abff4c78990a0b25e7c719c377090b3a2c0440664"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //todo: show error to end user instead \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/CloudShapes.Dashboard/Pages/Projections/List/Store.cs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"821160a71df9f15e6fabcf3d916851084ff754af070c4aaa3b60889d29a0cd82"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Application (Production): 30 .cs files, 2364 LoC (1149 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/CloudShapes.Application.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced9aaf32e38679e59f91f510a010f88222dada2b844a94a293c0ddcfd9b6109"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Api (Production): 10 .cs files, 595 LoC (283 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api/CloudShapes.Api.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b7b9d39afd486a4e6dcd6ef885fa9d3534b6b5b2bf7c8112e42f5d7e2362134"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Data (Production): 28 .cs files, 2132 LoC (904 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/CloudShapes.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cc7174bffc561284bd1bbccbea3e38fae33419b022b021208153817bf690419"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Dashboard (Production): 47 .cs files, 4857 LoC (2238 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/CloudShapes.Dashboard.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d687301cd9d7c8ab553c1a001578ae36de4f5d40613f53173eb68d37155857"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Dashboard.StateManagement (Production): 32 .cs files, 2054 LoC (740 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard.StateManagement/CloudShapes.Dashboard.StateManagement.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"029a3c9d4a4b4c2e7afa8b499a1ad218ca6b051130b4ae8831844b7f32e7e82a"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Api.Client (Production): 13 .cs files, 774 LoC (307 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api.Client/CloudShapes.Api.Client.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17e7f0288e2b142bcf5942afe9deaec90a372034320df4abcbc6226a70f224c"}},{"ruleId":"D18","level":"note","message":{"text":"CloudShapes.Integration (Production): 24 .cs files, 832 LoC (157 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Integration/CloudShapes.Integration.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c34eb44255a313a1d6c92b145b72971e874a5b0b186794795358e8f534b9e0c"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Application: CloudShapes.Application: 100 % XML-doc coverage (79/79)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Application/CloudShapes.Application.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f9c2a6f060c91a255b49ca12e7add27e2a1b2784c8a0cc81b321cab11caaaf"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Api: CloudShapes.Api: 100 % XML-doc coverage (24/24)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api/CloudShapes.Api.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"859f08939d05f51470a51b863d1fb3479513cd09dc2a966242ff90a5fa31dab1"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Data: CloudShapes.Data: 100 % XML-doc coverage (183/183)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/CloudShapes.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38510f7eac7b77eb9ae16d923107ea249a48131d5a0239f009cd89a3e8021e77"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Dashboard: CloudShapes.Dashboard: 100 % XML-doc coverage (382/382)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard/CloudShapes.Dashboard.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee8d2282286198a067f77eb6ceda253c06b0f4352af0a02453e86f50d204dbb"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Dashboard.StateManagement: CloudShapes.Dashboard.StateManagement: 100 % XML-doc coverage (105/105)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Dashboard.StateManagement/CloudShapes.Dashboard.StateManagement.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a80a0597d2c807e6fc462cda4599e4028a80541a2f0a1da3c56090a92bddc120"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Api.Client: CloudShapes.Api.Client: 100 % XML-doc coverage (35/35)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api.Client/CloudShapes.Api.Client.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf5fbef519aca4872003758953080408399a803ac813ca0f6ea72c480f0dc6f9"}},{"ruleId":"D19","level":"note","message":{"text":"XML-doc coverage: CloudShapes.Integration: CloudShapes.Integration: 100 % XML-doc coverage (70/70)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Integration/CloudShapes.Integration.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bf304135cc2c46ef65eb3533de2b0a024439bf732e4415c7c8ff3cc8e4f627c"}},{"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":"note","message":{"text":"The state and store for the ProjectionType editor are named inconsistently. One uses \u0027State\u0027 and the other uses \u0027Store\u0027, suggesting they serve related but distinct roles in the state management pattern.: Standardize the suffix to either \u0027State\u0027 or \u0027Store\u0027 across all editor-related components to reflect their specific role (e.g., \u0027State\u0027 for data containers, \u0027Store\u0027 for state management logic). (symbols: CloudShapes.Dashboard.Pages.ProjectionTypes.Editor.ProjectionTypeEditorState, CloudShapes.Dashboard.Pages.ProjectionTypes.Editor.ProjectionTypeEditorStore)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8e098ac66e66ed849bf34a4db34728e2a6b7c0fb2a11d671c527b1c1f0683d67"}},{"ruleId":"D22","level":"warning","message":{"text":"Duplicate intent: Both types expose a GetTypes() method that appears to return the same kind of data (list of strings), but are split across two different types (ProjectionTypes vs Projections).: Consolidate into a single type or ensure the methods have distinct semantic meanings. If they return the same data, merge the types. (signatures: CloudShapes.Data.ProjectionTypes.GetTypes() | CloudShapes.Data.Projections.GetTypes())"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0ec190e8f3c9b154c6d7f1cbf27b3e2fe8fd0d8e59bd5fda0f1d48a16d37c702"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent naming for enumeration helpers: The Problems namespace uses AsEnumerable() for all three subtypes, which is consistent, but the subtypes themselves (Types, Titles, Statuses) are distinct domains, so this is actually consistent. However, the use of AsEnumerable() for static constants is a minor style inconsistency with other patterns in the codebase (e.g., CloudEventValueResolutionStrategy.AsEnumerable()).: No action needed if the intent is purely enumeration of constants. If these are meant to be used in LINQ, AsEnumerable() is fine. If they are just constants, consider removing the method. (signatures: CloudShapes.Data.Problems.Types.AsEnumerable() | CloudShapes.Data.Problems.Titles.AsEnumerable() | CloudShapes.Data.Problems.Statuses.AsEnumerable())"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e23918e56b38f681d88c5ae8e448dcfe09c4589cd221017496dff49483447c01"}},{"ruleId":"D22","level":"warning","message":{"text":"Inconsistent verb usage in CRUD operations: The API uses \u0027Create\u0027, \u0027Get\u0027, \u0027List\u0027, \u0027Update\u0027, \u0027Patch\u0027, \u0027Delete\u0027. While common, \u0027Get\u0027 and \u0027List\u0027 are specific HTTP verbs, whereas \u0027Create\u0027, \u0027Update\u0027, \u0027Patch\u0027, \u0027Delete\u0027 are action-oriented. More importantly, \u0027Get\u0027 is used for single item retrieval, but \u0027List\u0027 is used for collections. This is a minor inconsistency in naming convention (Get vs Fetch/Find).: Consider standardizing on \u0027Fetch\u0027 or \u0027Get\u0027 for all single-item retrievals and \u0027List\u0027 or \u0027Search\u0027 for collections. The current mix is acceptable but \u0027Get\u0027 vs \u0027Find\u0027 vs \u0027Lookup\u0027 is a common source of confusion. Here, \u0027Get\u0027 is used, which is fine, but ensure \u0027List\u0027 is not replaced by \u0027GetAll\u0027 or \u0027Search\u0027 elsewhere. (signatures: CloudShapes.Api.Client.Services.IProjectionsApiClient.CreateAsync() | CloudShapes.Api.Client.Services.IProjectionsApiClient.GetAsync() | CloudShapes.Api.Client.Services.IProjectionsApiClient.ListAsync() | CloudShapes.Api.Client.Services.IProjectionsApiClient.UpdateAsync() | CloudShapes.Api.Client.Services.IProjectionsApiClient.PatchAsync() | CloudShapes.Api.Client.Services.IProjectionsApiClient.DeleteAsync())"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d1cf25f578b79bfe91226e84b63a94d00dc0ab6bc83faee5b5e9359f948dbbc1"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: A codebase of this size and project count likely contains multiple distinct domains, making the absence of declared bounded contexts a risk for unassessed type 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// Copyright \u00A9 2025-Present The Cloud Shapes Authors\u0022 \u2014 Use a standard license header tool (e.g., HeaderCheck, Apache Header) to manage these automatically. Manual comments here add no value and cause merge conflicts."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api.Client/Configuration/CloudShapesApiClientOptions.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c871a516bf95def62543f6840ff8db46f557912a02e2eb54cde5ad0df8275e7"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// Licensed under the Apache License, Version 2.0 (the \u0022License\u0022),\u0022 \u2014 Remove all manual license header comments. Rely on the repository\u0027s root LICENSE file and build tooling to enforce compliance."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api.Client/Services/ProjectionTypesApiClient.cs"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c27585fdffd8336b1bb340a851be61c85557cf3406cc08266959089238c25d15"}},{"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":"D30","level":"error","message":{"text":"High CVE: Snappier 1.0.0: Snappier 1.0.0 (transitive) has a High advisory; affects 2 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"535c841a79fa99ee910e3d9375e11ec02a2f8b10cd3cb316706fed34aaa88a27"}},{"ruleId":"D30","level":"warning","message":{"text":"Medium CVE: SharpCompress 0.30.1: SharpCompress 0.30.1 (transitive) has a Medium advisory; affects 2 projects \u2014 one upgrade fixes all. https://github.com/advisories/[GHSA redacted]"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"00cb4b303392f15d10a6e6cba03898c053b2eca5b8ace5790990d10c0d0ab63f"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0017: \u0027RUN \u003Cpackage-manager\u003E update\u0027 instruction alone"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2704aad930e50c306057c08fd0daf04fc1d923188d69a5e46156534d5a515ae9"}},{"ruleId":"D31","level":"error","message":{"text":"High IaC: DS-0029: \u0027apt-get\u0027 missing \u0027--no-install-recommends\u0027"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"016a51e0bddd6b89bc3c91713d64ac2d4cbaf21373a2c5689566f6c650311635"}},{"ruleId":"D31","level":"note","message":{"text":"Low IaC: DS-0026: No HEALTHCHECK defined"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api/Dockerfile"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68cd1712dc5dfccec89f7c4f05ec1e3b3ac1bb2970fa4d74e2d8c405d29c421"}},{"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: 51 of 71 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 51 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: ProjectionsApiClient.cs \u2194 CreateProjectionCommandHandler.cs: \u0060src/CloudShapes.Api.Client/Services/ProjectionsApiClient.cs\u0060 (context CloudShapes.Api.Client) and \u0060src/CloudShapes.Application/Commands/Projections/CreateProjectionCommandHandler.cs\u0060 (context CloudShapes) live in DIFFERENT modules yet change together 50% of the time (5 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api.Client/Services/ProjectionsApiClient.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f239b963454c80e48473fd49ae8084096d1e65a998c0b2fb99b561e3d4c823"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: IProjectionsApiClient.cs \u2194 CreateProjectionCommandHandler.cs: \u0060src/CloudShapes.Api.Client/Services/Interfaces/IProjectionsApiClient.cs\u0060 (context CloudShapes.Api.Client) and \u0060src/CloudShapes.Application/Commands/Projections/CreateProjectionCommandHandler.cs\u0060 (context CloudShapes) live in DIFFERENT modules yet change together 50% of the time (5 shared commits) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Api.Client/Services/Interfaces/IProjectionsApiClient.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f862dad06b79f830b61ccecf1f01eb90c57b78956904b037e7145e57d69b26"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CloudEventFilterDefinition.cs \u2194 ProjectionType.cs: \u0060src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionType.cs\u0060 change together 73% of the time (8 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"997d9ac35152d1741c9445a019afbbc359da80dff342d738fd8474fbce513557"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ProjectionTriggerCollection.cs \u2194 ProjectionType.cs: \u0060src/CloudShapes.Data/Models/ProjectionTriggerCollection.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionType.cs\u0060 change together 70% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/ProjectionTriggerCollection.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"327821c6662b5d9ac659b411b6407bc96864d5a2f053f709257611df2103fe42"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CloudEventTriggerDefinition.cs \u2194 ProjectionTriggerCollection.cs: \u0060src/CloudShapes.Data/Models/CloudEventTriggerDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionTriggerCollection.cs\u0060 change together 70% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/CloudEventTriggerDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"730b4f34e26997a695157f76ae8bb90c318e3ee1259181d24f6f9033cde2ff1f"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CloudEventFilterDefinition.cs \u2194 ProjectionTriggerCollection.cs: \u0060src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionTriggerCollection.cs\u0060 change together 70% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79551dfc52bde8f18a8883e803497366b333d9e3da6238433639d53c190e05b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CloudEventTriggerDefinition.cs \u2194 ProjectionType.cs: \u0060src/CloudShapes.Data/Models/CloudEventTriggerDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionType.cs\u0060 change together 64% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/CloudEventTriggerDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d7b7c53a71f8740b2846c0a0cd0e92de12c0b9472879aea22c2be378350781"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CloudEventFilterDefinition.cs \u2194 ProjectionIndexDefinition.cs: \u0060src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionIndexDefinition.cs\u0060 change together 64% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90efaf07d699a7b4fe4784dda17213d1bba74870a315d15f57533837350db616"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CloudEventFilterDefinition.cs \u2194 CloudEventTriggerDefinition.cs: \u0060src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/CloudEventTriggerDefinition.cs\u0060 change together 64% of the time (7 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/CloudEventFilterDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"359d2de67d76b9aaccfaa644bd67bb4ac76df53c1551e6db45e184f0a8235b99"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ProjectionIndexDefinition.cs \u2194 ProjectionTriggerCollection.cs: \u0060src/CloudShapes.Data/Models/ProjectionIndexDefinition.cs\u0060 and \u0060src/CloudShapes.Data/Models/ProjectionTriggerCollection.cs\u0060 change together 60% of the time (6 shared commits) with no explicit dependency \u2014 a hidden/logical coupling. If they belong together, co-locate them; if not, break the coupling."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/CloudShapes.Data/Models/ProjectionIndexDefinition.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"780bbeb909a56f6b808f22703e846e01d70a2cd20a8715614cfb86ec3d6c2702"}},{"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":"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}}}]}