{"$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":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}]},{"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":"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":"D24","name":"Comment Value","shortDescription":{"text":"Comment Value"},"helpUri":"https://codehealth.canine.dev/dimensions/D24"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}]},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"}]}},"results":[{"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":"D18","level":"warning","message":{"text":"Analyzed solution does not cover the bulk of the repository: The scored solution \u0060MVCMongoDB.sln\u0060 is not representative of this repository \u2014 it references only 0 of 16 discovered C# files (0 %). Lenses that need the product\u0027s source (domain modelling, event-driven, event sourcing) abstain because the aggregates, EF configs, and domain events under the product tree were not loaded. Point the scan at the product solution (or scan its directory directly) so the whole codebase is analyzed, not a build-tooling sub-solution."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"076656354786513e81286bffc1f9f1d3fa9aa953b7db1b16e5bd8aeada3c8175"}},{"ruleId":"D19","level":"note","message":{"text":"No setup/installation instructions; the README says nothing about how to run the application or configure the database.: Add a short install/run guide (e.g. \u0027npm install \u0026\u0026 npm start\u0027) and connect-configuration secrets for MongoDB."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"310932c5b79c6aca7fccd6fce8e9140db36ca78a877893f573be96d0a1997720"}},{"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":"Typo in class name: \u0027Commad\u0027 instead of \u0027Command\u0027. This typo is present in the type definition and referenced in methods like \u0027EditDeviceTypeCommandHandler.Handle\u0027 and \u0027TypesController.Put\u0027.: Rename \u0027EditDeviceTypeCommad\u0027 to \u0027EditDeviceTypeCommand\u0027 to match the correct spelling and other command types. (symbols: DSACopy.Commands.EditDeviceTypeCommad, DSACopy.Commands.EditDeviceTypeCommand)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bfaef165d6ba2943fd097e3e4f765eb2792e81ab72c22fd1551dcb2f8f5568d6"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent pluralization in service names: \u0027DeviceTypesServices\u0027 (plural \u0027Services\u0027) vs \u0027DeviceService\u0027 (singular \u0027Service\u0027).: Standardize to singular \u0027Service\u0027 (e.g., \u0027DeviceTypesService\u0027) or ensure all service interfaces/classes follow the same pluralization convention. (symbols: DSACopy.Services.DeviceTypesServices, DSACopy.Services.IDeviceService)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6a0b06c39a6c847cb91a3be2cedc8b3ea935d81e39d2a54f6734d5a3d32aca97"}},{"ruleId":"D21","level":"note","message":{"text":"Typo in interface name: \u0027ICommandHander\u0027 (missing \u0027d\u0027 in Handler) appears in the type definition. Note: The method \u0027Handle\u0027 is correctly named, but the interface name itself is misspelled.: Rename \u0027ICommandHander\u0027 to \u0027ICommandHandler\u0027. (symbols: DSACopy.Commands.ICommandHander\u003CTCommand\u003E, DSACopy.Commands.ICommandHander\u003CTCommand\u003E)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4561e656ee424886b09cbd6823d0e243b05cfcbc88824b358707d70fd660265d"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022This method gets called by the runtime. Use this method to add services to the container.\u0022 \u2014 delete - boilerplate restatement of DI registration; the method name already says it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CQRSapi/Startup.cs"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d770363014e85f2a6c319fc84a762202d71d1439af3381ef0b489eebd784881"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\u0022 \u2014 delete - duplicate of Configure\u0027s comment, no WHY"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"CQRSapi/Startup.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d770363014e85f2a6c319fc84a762202d71d1439af3381ef0b489eebd784881"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-798","name":"Use of Hard-coded Credentials"}]}],"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}}}]}