{"$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":"ScheduleSevice.FindEmployeeSchedules (cyclomatic 67): ScheduleSevice.FindEmployeeSchedules has cyclomatic complexity 67 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Areas/Scheduler/Services/ScheduleSevice.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92958a483c4ccb2dfb4f9d95305fe487de1a7f96425ce71fc054bb50efe6fad"}},{"ruleId":"D2","level":"warning","message":{"text":"ScheduleSevice.FindEmployeeSchedules (cognitive 28): ScheduleSevice.FindEmployeeSchedules has cognitive complexity 28 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Areas/Scheduler/Services/ScheduleSevice.cs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"79796e5663eb733ac4dc8da99a82862b1be0f0fb889c133649eafe584be52feb"}},{"ruleId":"D2","level":"warning","message":{"text":"ManageController.Index (cognitive 16): ManageController.Index has cognitive complexity 16 (threshold 15)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Controllers/ManageController.cs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba20eab7da4386916aa67c4e357f0a941cb9f2ecb17df002e8ba91b0f89f23e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): Web/Wilson.Web/Areas/Admin/Controllers/ControlPanelController.cs:63-73 | Web/Wilson.Web/Areas/Admin/Controllers/ControlPanelController.cs:88-98"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Areas/Admin/Controllers/ControlPanelController.cs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e855e9ecbfcad4f60ea02cc37fc94765a1d3dfe1dd84e0d5299b746e821ddd1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): Accounting/Wilson.Accounting.Data/AccountingDbContext.cs:32-41 | Companies/Wilson.Companies.Data/CompanyDbContext.cs:33-42 | Scheduler/Wilson.Scheduler.Data/SchedulerDbContext.cs:33-42 | Projects/Wilson.Projects.Data/ProjectsDbContext.cs:31-40"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Data/AccountingDbContext.cs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d0d97675a958da3f694db160471882e3fbd65dc0e864f4e33fa9cea42a5161c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): Accounting/Wilson.Accounting.Core/Entities/ValueObjects/SubTotals.cs:62-69 | Scheduler/Wilson.Scheduler.Core/Entities/ValueObjects/SubTotals.cs:62-69"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Core/Entities/ValueObjects/SubTotals.cs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9623bd50c2da61c037ebf9f3c7f31e9cb75b0da2a14606a84fb745f1710e14a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): Accounting/Wilson.Accounting.Core/Entities/ValueObjects/WorkingHours.cs:66-73 | Scheduler/Wilson.Scheduler.Core/Entities/ValueObjects/WorkingHours.cs:66-73"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Core/Entities/ValueObjects/WorkingHours.cs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1400f7998319c77da5adefa60cd3ff4e9a42407a1501a6ffb00e001f9ec4d20b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): Web/Wilson.Web/Events/Handlers/ProjectCteatedHandler.cs:37-43 | Web/Wilson.Web/Events/Handlers/ProjectCteatedHandler.cs:44-50"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Events/Handlers/ProjectCteatedHandler.cs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"0792cc4631d4fcb8472627f0581082ad9d1ce5ac6614b402f4e001f1eb921192"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): Web/Wilson.Web/Areas/Admin/Controllers/ControlPanelController.cs:106-110 | Web/Wilson.Web/Areas/Admin/Controllers/ControlPanelController.cs:116-120"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Areas/Admin/Controllers/ControlPanelController.cs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"c15beacdf512a3179c733415ecdefd17906bb87ec00246641307bbdb29177a67"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Wilson.Accounting.Core: Wilson.Accounting.Core: abstractness 0.13, instability 0.00, distance 0.87 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b687dbee45600b4301ad0e2a4e2dbf8209cce844bc68c1da357ab1a9525683dc"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: Wilson.Companies.Core: Wilson.Companies.Core: abstractness 0.20, instability 0.00, distance 0.80 \u2014 zone of pain \u2014 concrete and heavily depended-on, so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"81f46f6c6a179753dd64c17166b7cc8a324ad61c1c893c65cf8f783715e5ed9a"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AccountController (LCOM4 6): AccountController\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":"Web/Wilson.Web/Controllers/AccountController.cs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1d6c180740df224f40627f0c4857ef7b38c3f98addfd9253a6059a48c12e67"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ManageController (LCOM4 4): ManageController\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":"Web/Wilson.Web/Controllers/ManageController.cs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec014ef2bef47a711dfd0bb30c1096a7447f0318a0edf1c2ab68e6f871ab768"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ApplicationUser (LCOM4 4): ApplicationUser\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":"Companies/Wilson.Companies.Core/Entities/ApplicationUser.cs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc5b628d8a69d74122bf84bde3fc8192d315f7ea8fc108e1fd96a0662e2d4ac"}},{"ruleId":"D7","level":"note","message":{"text":"No checkable ADRs to assess: No architecture decision records were found and the project graph is acyclic, so architectural integrity could not be assessed. Add ADRs (with \u0060enforcement: analyzer|test\u0060) to make the architecture\u0027s rules checkable."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"9bfa095522c5f2e53a7c1c0405fd8830d318409a6fb74f4288bab05aaf716e52"}},{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured: The test suite couldn\u0027t be built/run in-image and no coverage report is committed, so line coverage was not measured \u2014 and it is EXCLUDED from the score rather than scored on a LoC-ratio proxy. Commit the Cobertura/OpenCover/lcov report your CI already produces (anywhere in the repo), or make the suite runnable in-image, and real coverage will be measured."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D9","level":"note","message":{"text":"Unit tests: 7 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":"error","message":{"text":"No assertions: Adding_Payment_To_Paycheck: Test method has no assertions \u2014 it may not test anything."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Tests/Common/DomainTest.cs"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fed3deeb9b01d30719636b243d31a6ebc8b48b5a7a588a0709306bca9edac75"}},{"ruleId":"D14","level":"note","message":{"text":"Licenses scanned: 23 packages scanned; 0 distinct SPDX licenses."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1d29d66daec20840f6831f63c1b66b87c40390635ef3e9f728002964c77e88d4"}},{"ruleId":"D16","level":"warning","message":{"text":"single-maintainer \u2014 knowledge-concentration (bus factor) risk: single-maintainer \u2014 knowledge-concentration (bus factor) risk (1 author(s) across 126 commit(s) sampled)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"b4b49d961df742f0e507f4cc5c8094fb077ba0391a27fd015d18320865187719"}},{"ruleId":"D17","level":"warning","message":{"text":"CommentedOutCode: 3 consecutive commented-code lines"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Configurations/AutoMapperProfileConfiguration.cs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"58d226ccd8d9d8e847245c4a4e741717eb260fa7e3286496a94145d31131f379"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO How I can get only the handlers that handles \u0022T\u0022?!? At the moment I am getting all the handlers then passing \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":"Web/Wilson.Web/Events/EventsFactory.cs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08949a5c4d4f918c4e1c65492f93c6c0143eec4daa4ae05b414ba98708c5f14"}},{"ruleId":"D17","level":"warning","message":{"text":"Dead code: Copy: Method Copy \u2014 no references found in solution."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Seed/PropertyCopier.cs"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"1355528900a78c77d7400a3fb162d852b9233028713b48d249c710d3535f553a"}},{"ruleId":"D18","level":"note","message":{"text":"Build status unknown: The build did not finish within its budget on this run; structural metrics are reported, build/warning status is unknown."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"78e40f3b9a0e52c8707cbe4b5154bc230ba104e99fc8a0b453669e73b2ef6814"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Accounting.Core (Production): 28 .cs files, 1800 LoC (1395 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Core/Wilson.Accounting.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f23b1e5558ad9fec32bde35be4b8824289096c8df96d6da7f5ad2fcea6a16cea"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Accounting.Data (Production): 25 .cs files, 2503 LoC (1969 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Data/Wilson.Accounting.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c611a1d33e7cb7e27fe13f2b8f17add750f5de89feb231538931290349a8804c"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Web (Production): 114 .cs files, 5796 LoC (4533 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Wilson.Web.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d430677690b01f7943cc8c6cdba9e1043c3a4d421b0f5d04632c1cd400425906"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Companies.Data (Production): 25 .cs files, 3071 LoC (2412 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Companies/Wilson.Companies.Data/Wilson.Companies.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e282d8af196081e54bc28a8db981308fdfd67226a7afc41591465ffaeb21428"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Scheduler.Data (Production): 19 .cs files, 1454 LoC (1163 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Scheduler/Wilson.Scheduler.Data/Wilson.Scheduler.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3242728072135d6c117df24f128b33b2820320298d547e8d7c99bac3c8d0ba90"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Companies.Core (Production): 23 .cs files, 1312 LoC (1011 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Companies/Wilson.Companies.Core/Wilson.Companies.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c86eeccc8688665da48a17257af674448afa1cd3c937027d287fdc69bd02342"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Scheduler.Core (Production): 15 .cs files, 781 LoC (609 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Scheduler/Wilson.Scheduler.Core/Wilson.Scheduler.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b712edec40c10ff48875da3a9c4af33d05cfa184a25b9a79e17b04593a99907"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Projects.Core (Production): 6 .cs files, 117 LoC (89 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Projects/Wilson.Projects.Core/Wilson.Projects.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3db80c3242c3675fdf98b691d71b3b9269502bda6a2db91e204f436ba25bd94"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Projects.Data (Production): 15 .cs files, 667 LoC (537 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Projects/Wilson.Projects.Data/Wilson.Projects.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32a3a9dfd4aeb73204c2d4745dd89530b9d6b39075f608fc460bcb9e5a9123b"}},{"ruleId":"D18","level":"note","message":{"text":"Wilson.Accounting.Tests (Test): 1 .cs files, 177 LoC (144 significant)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Tests/Wilson.Accounting.Tests.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76e3dbbbcdca1997dcef4d514268ab92b9e0269da2da277f55fd24d0a7558397"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Accounting.Core: Wilson.Accounting.Core: 2 % XML-doc coverage (4/224)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Core/Wilson.Accounting.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70673e2b239863a403c808d0d680eec855a1981ade3bd59f446ef922e8e23e8f"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Accounting.Data: Wilson.Accounting.Data: 0 % XML-doc coverage (0/71)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Data/Wilson.Accounting.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45c4be7e3a493c46165c49a5b1a13bb6a6e4ff7bec756b40ed120fcf2f0184d4"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Web: Wilson.Web: 2 % XML-doc coverage (10/602)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Wilson.Web.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"056bccdc8c71b997e0b0a31d669160d094d08e282f4f9f980fe37fcebccd8e37"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Companies.Data: Wilson.Companies.Data: 0 % XML-doc coverage (0/77)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Companies/Wilson.Companies.Data/Wilson.Companies.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bca58986858a858b9dfb7cb5ead4d59116a1c08cf785a0c7467871b96fa02b0d"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Scheduler.Data: Wilson.Scheduler.Data: 0 % XML-doc coverage (0/56)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Scheduler/Wilson.Scheduler.Data/Wilson.Scheduler.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb0a1c3f52e23e97299af8e29fce2dd33282a87f1b22600a7d175d8d75d6da15"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Companies.Core: Wilson.Companies.Core: 0 % XML-doc coverage (1/239)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Companies/Wilson.Companies.Core/Wilson.Companies.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d98d17f1cab442484987d0c36836f25def7efe2b23d4099fb5c1e9643678b98"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Scheduler.Core: Wilson.Scheduler.Core: 0 % XML-doc coverage (0/98)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Scheduler/Wilson.Scheduler.Core/Wilson.Scheduler.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50cf160fd4ef3ed65dba34143289760aad60eb0a242f7d63ce85185b4ab697ae"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Projects.Core: Wilson.Projects.Core: 0 % XML-doc coverage (0/27)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Projects/Wilson.Projects.Core/Wilson.Projects.Core.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd155d56ffbd58fea682d6171f2280735abd0e442473d9cdbb33206c95220619"}},{"ruleId":"D19","level":"warning","message":{"text":"Low XML-doc coverage: Wilson.Projects.Data: Wilson.Projects.Data: 0 % XML-doc coverage (0/46)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Projects/Wilson.Projects.Data/Wilson.Projects.Data.csproj"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd33301e7626d8aa3d7c342a11038c88f33932db14ce2788e6826210bfff8fc"}},{"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":"Inconsistent spelling of \u0027Seeder\u0027 as \u0027Seder\u0027 in interface names.: Rename \u0027IRolesSeder\u0027 to \u0027IRolesSeeder\u0027 to match the correct spelling and consistency with \u0027IDatabaseSeeder\u0027. (symbols: Wilson.Web.Seed.IDatabaseSeeder, Wilson.Web.Seed.IRolesSeder)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"05539fe0757987300f45d79a3821c42156bf8d816b3e42500ba12a42044f0c99"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent spelling of \u0027Receive\u0027 as \u0027Recived\u0027 in method names.: Rename \u0027MarckAsRead\u0027 to \u0027MarkAsRead\u0027 and \u0027MarckAsRecived\u0027 to \u0027MarkAsReceived\u0027. (symbols: Wilson.Companies.Core.Entities.Message.MarckAsRead, Wilson.Companies.Core.Entities.Message.MarckAsRecived)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0ca33da6a94c83e896b18ce27eef6a76e1a383b901d57b8c3adb03dcb5190130"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent spelling of \u0027Apply\u0027 as \u0027Applay\u0027, \u0027Service\u0027 as \u0027Sevice\u0027, \u0027Check\u0027 as \u0027Cheks\u0027, \u0027Schedule\u0027 as \u0027Shcedule\u0027, and \u0027With\u0027 as \u0027Wiht\u0027 in method and type names.: Rename \u0027ApplayPayRate\u0027 to \u0027ApplyPayRate\u0027, \u0027ScheduleSevice\u0027 to \u0027ScheduleService\u0027, \u0027GetEmployeesWithoutPaycheks\u0027 to \u0027GetEmployeesWithoutPaychecks\u0027, \u0027GetShceduleOptionName\u0027 to \u0027GetScheduleOptionName\u0027, \u0027SetupEmployeeNewSchedule\u0027 to \u0027SetupEmployeeNewSchedule\u0027 (if typo in method name), and \u0027GetEmployeesWihtPayrolls\u0027 to \u0027GetEmployeesWithPayrolls\u0027. (symbols: Wilson.Scheduler.Core.Entities.Employee.ApplayPayRate, Wilson.Web.Areas.Scheduler.Services.ScheduleSevice, Wilson.Web.Areas.Scheduler.Services.PayrollService.GetEmployeesWithoutPaycheks, Wilson.Web.Areas.Scheduler.Services.ScheduleSevice.GetShceduleOptionName, Wilson.Web.Areas.Scheduler.Services.ScheduleSevice.SetupEmployeeNewSchedule, Wilson.Web.Areas.Scheduler.Services.PayrollService.GetEmployeesWihtPayrolls)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"c5104303b0bb50fe8e2ec4101c03a992d067a177fd622ea79a3b276890df1257"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent naming for creation tracking: \u0027CretedById\u0027 vs \u0027CreatedBy\u0027.: Rename \u0027CretedById\u0027 to \u0027CreatedById\u0027 or \u0027CreatedBy\u0027 to match the convention used in \u0027Offer\u0027. (symbols: Wilson.Companies.Core.Entities.CompanyContract.CretedById, Wilson.Companies.Core.Entities.Offer.CreatedBy)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e29625290c0df42ab229d0664fc1b472753a59bca18c18f1ceead594105eeeb9"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent spelling of \u0027Paid\u0027 as \u0027Payed\u0027 and \u0027Checks\u0027 as \u0027Cheks\u0027.: Rename \u0027PayedAmount\u0027 to \u0027PaidAmount\u0027 and \u0027TotalPaycheksSum\u0027 to \u0027TotalPaychecksSum\u0027. (symbols: Wilson.Accounting.Core.Entities.Invoice.PayedAmount, Wilson.Web.Areas.Accounting.Models.HomeViewModels.PayrollViewModel.TotalPaycheksSum)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5bb804a18c5116ea4391bd1960340dc8f8d089d1090bd3d6dc5ef8d2bb604c44"}},{"ruleId":"D21","level":"note","message":{"text":"Inconsistent spelling of \u0027Service\u0027 as \u0027Sevice\u0027 in type names.: Rename \u0027ScheduleSevice\u0027 to \u0027ScheduleService\u0027. (symbols: Wilson.Web.Areas.Scheduler.Services.ScheduleSevice, Wilson.Web.Areas.Scheduler.Services.PayrollService)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"72b7860cbe47385fa24e0abbd9b39bf2926633a095d5111c68b2394a3629c793"}},{"ruleId":"D22","level":"note","message":{"text":"No exposed public API: No intentionally-exposed types (IsPackable or .Contracts) to evaluate."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2712d35e1d1ba8e91a90125d29842b77d4ca65e0eeaa52476c739f7165820a6f"}},{"ruleId":"D23","level":"note","message":{"text":"Bounded contexts not declared: A codebase of this scale (9.7k LoC, 10 projects) strongly implies multiple modules or concerns that require explicit boundary declaration to manage 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// Add new Payment only if the amount is greater then zero.\u0022 \u2014 Rename the variable or method to \u0060IsValidPaymentAmount\u0060 or check \u0060amount \u003E 0\u0060 directly in the condition. The comment repeats the code\u0027s logic without adding intent."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Accounting/Wilson.Accounting.Core/Entities/Paycheck.cs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e57d0329bd16bed699f3c19ad6015e9fa4d046cf77b5517ad1a9d5b5dabc2cf"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// GET: /Accounting/Home\u0022 \u2014 This is a standard ASP.NET MVC attribute comment. It is redundant because the route/template name is usually evident from the method name or the attribute itself. Remove these boilerplate comments."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Areas/Accounting/Controllers/HomeController.cs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c4755964e7525b105d9f995660b9694366eb7e170614798878ee26e5f805b78"}},{"ruleId":"D24","level":"note","message":{"text":"redundant comment: \u0022// This doesn\u0027t count login failures towards account lockout\u0022 \u2014 If the code explicitly sets \u0060lockoutOnFailure: false\u0060 or similar, the comment is redundant. If it\u0027s just a standard call, the comment explains the framework\u0027s default behavior, which is often unnecessary."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"Web/Wilson.Web/Controllers/AccountController.cs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"882e88195c855a824d496aa16cdf7679e633e460ea03823ca8de8e0c517ce28d"}},{"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":"D27","level":"note","message":{"text":"Navigability unmeasured \u2014 symbol resolution incomplete: 88 % of sampled invocations could not be resolved to a symbol (the workspace likely loaded without all references) \u2014 the indirection fractions would be computed over an unrepresentative slice, so navigability is reported as not measured rather than a misleading score."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e4b2c182df6722121fd53f7b767118a1dcf40c24ddcf7edd2a809768fcefbd23"}},{"ruleId":"D30","level":"note","message":{"text":"Not applicable: the solution did not restore on the analyzer\u0027s .NET SDK (an SDK/target-framework/restore mismatch, common for an older codebase), so there was no restored dependency graph to scan for NuGet CVEs \u2014 excluded rather than scored; re-run on an SDK that can restore this solution"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"34ff807233366ca1607a49113cb8f9a094878853712c06642d2146b82741378f"}},{"ruleId":"D31","level":"note","message":{"text":"Not applicable: No Infrastructure-as-Code or container manifests found (Dockerfile, Terraform, Kubernetes/Helm, CloudFormation); nothing to scan."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2e57fca60a46af1c36cbca9e46b2039488d0488a6eab73ad6bc057cd95ef2432"}},{"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":"D35","level":"warning","message":{"text":"Change coupling: CompanyWorkData.cs \u2194 ICompanyWorkData.cs: \u0060Companies/Wilson.Companies.Data/DataAccess/CompanyWorkData.cs\u0060 and \u0060Companies/Wilson.Companies.Data/DataAccess/ICompanyWorkData.cs\u0060 change together 83% of the time (10 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":"Companies/Wilson.Companies.Data/DataAccess/CompanyWorkData.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0591d2dbeda8dac7619652524813ef03517c17791bc1feff3d8d970189f6d87"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: HomeController.cs \u2194 PayrollController.cs: \u0060Web/Wilson.Web/Areas/Scheduler/Controllers/HomeController.cs\u0060 and \u0060Web/Wilson.Web/Areas/Scheduler/Controllers/PayrollController.cs\u0060 change together 50% of the time (5 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":"Web/Wilson.Web/Areas/Scheduler/Controllers/HomeController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a50974732c1f4b2a320f16013998a0f45e6d7e05088e444b569a5441e6c6cea4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: InquiriesController.cs \u2194 Constants.cs: \u0060Web/Wilson.Web/Areas/Companies/Controllers/InquiriesController.cs\u0060 and \u0060Web/Wilson.Web/Constants.cs\u0060 change together 50% of the time (5 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":"Web/Wilson.Web/Areas/Companies/Controllers/InquiriesController.cs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b8c94a879e5c2e2e4e6ab6e96e35792c36235299ea71095171ab187a253b926"}},{"ruleId":"D36","level":"note","message":{"text":"Not applicable: No CI/build pipeline found (.github/workflows, .gitlab-ci.yml, azure-pipelines.yml, Jenkinsfile, .circleci); there is no build to attest provenance for."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"383f97e2d2c3d8c6d4adffc68d228db0928a3a8f5c3df1214c0f646687d2dbe9"}},{"ruleId":"D37","level":"note","message":{"text":"Not applicable: No vulnerability-disclosure policy file found (SECURITY.md, .github/SECURITY.md, docs/SECURITY.md, .well-known/security.txt). A coordinated-disclosure policy may live off-repo, so this is not evidenced rather than failed."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e748a9b8b3d154964dfb621b8675d34a302dda266d0196c5d83eb8ba4071d61c"}},{"ruleId":"D38","level":"note","message":{"text":"Not applicable: No JS/npm lockfile found outside bin/obj (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb); nothing for OSV to scan."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6ff7301b610918095afd57ac1c89dabddab1d8fdb34c0f0d687159a5a0df0b8e"}}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":0,"secretScannerRunsExcluded":0}}}]}