{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:07.558862Z","repo":{"ref":{"host":"github.com","owner":"selwin","name":"diff-viewer"},"default_branch":"main","clone_url":"https://github.com/selwin/diff-viewer.git","html_url":"https://github.com/selwin/diff-viewer","description":null,"stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":2028,"primary_language":"Swift","license_spdx":null,"created_at":"2026-09-12T15:01:22Z","pushed_at":"2026-11-10T05:25:36Z","security_policy_url":null,"distribution":{"owner_created_at":"2010-01-24T04:00:12Z","owner_type":"User","release_assets":[]}},"commit_sha":"eaa47cef4315003b08d15754e2bc0374140864b0","profile":{"lines_by_language":{"Swift":75361,"Shell":181},"files_by_category":{"source":447,"config":15,"other":8,"docs":3},"source_lines":75542,"test_lines":0},"pillars":{"ai_provenance":{"score":10.0,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.1003,"suspected_share":0.291,"estimated_share":0.1003,"ai_artifacts":0.0,"flagged_work_units":17.0,"flagged_releases":null,"style_index":0.093},"summary":"Explicit AI attribution on 10% of first-party code added; an estimated 10% including velocity signals."},"quality":{"score":67.1,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":93.6,"duplication":87.6,"lint":99.3,"testing":25.0,"docs":40.0,"type_safety":null,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.00, no CI test run detected; 2% of function code in complex or long functions; 2% duplicated lines. Weakest area: testing."},"security":{"score":87.1,"confidence":0.85,"coverage":1.0,"label":"strong","breakdown":{"secrets":100.0,"sast":99.2,"dependencies":null,"ci_actions":94.2,"posture":20.0,"scorecard":null},"summary":"Security posture is strong: no high-impact findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no registry dependencies declared"},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":175.0,"attributed_commits":26.0,"attributed_commit_share":0.14857142857142858,"effective_loc":103913.0,"attributed_loc":10427.0,"attributed_loc_share":0.10034355662910319,"tools_detected":2.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 25 attributed commits, 9,654 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attribution-summary","description":"GitHub Copilot coding agent: 1 attributed commits, 773 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: PR description attribution","ref":"a64ef7e33a6c99c8873db45fc653d7cbc25d57c3","url":"https://github.com/selwin/diff-viewer/commit/a64ef7e33a6c99c8873db45fc653d7cbc25d57c3","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"5b3e225a3d6fa9a96efeaed2083e4f55569ea484","url":"https://github.com/selwin/diff-viewer/commit/5b3e225a3d6fa9a96efeaed2083e4f55569ea484","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"922c1ef2935283a3f014e181567e3f3e3f03676d","url":"https://github.com/selwin/diff-viewer/commit/922c1ef2935283a3f014e181567e3f3e3f03676d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"01bf79d976243913b141ea2a51cabb3e9bf5dc8b","url":"https://github.com/selwin/diff-viewer/commit/01bf79d976243913b141ea2a51cabb3e9bf5dc8b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"50055c751020dd4849a3c4d9e634d80117480c70","url":"https://github.com/selwin/diff-viewer/commit/50055c751020dd4849a3c4d9e634d80117480c70","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"94b4c8ae8fca3d1ca9d2dd7b044e33265c56abc5","url":"https://github.com/selwin/diff-viewer/commit/94b4c8ae8fca3d1ca9d2dd7b044e33265c56abc5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"77269cefcd6b6afbcaefe436326985448fa3d203","url":"https://github.com/selwin/diff-viewer/commit/77269cefcd6b6afbcaefe436326985448fa3d203","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"dd56dd51e0a7f31ade07045c67a8269faa6b0018","url":"https://github.com/selwin/diff-viewer/commit/dd56dd51e0a7f31ade07045c67a8269faa6b0018","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"b90273baa796edf4acc759ff66adbac8751655e1","url":"https://github.com/selwin/diff-viewer/commit/b90273baa796edf4acc759ff66adbac8751655e1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"11ca7a8445db4b4f5334d31d9e5f939092ce0417","url":"https://github.com/selwin/diff-viewer/commit/11ca7a8445db4b4f5334d31d9e5f939092ce0417","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: copilot'","ref":"6b95d51a678cc7385cdeab2955d13283e319f98c","url":"https://github.com/selwin/diff-viewer/commit/6b95d51a678cc7385cdeab2955d13283e319f98c","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a7e7305c67b6d3c661ad1e0f87965bbe7bbf626a","url":"https://github.com/selwin/diff-viewer/commit/a7e7305c67b6d3c661ad1e0f87965bbe7bbf626a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a045da284fd5f97eed75dfc6562e9dbbfbae864d","url":"https://github.com/selwin/diff-viewer/commit/a045da284fd5f97eed75dfc6562e9dbbfbae864d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"8894631ccb5ec752799de3df9fd8afa53771ba05","url":"https://github.com/selwin/diff-viewer/commit/8894631ccb5ec752799de3df9fd8afa53771ba05","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b6a0bd404aa2a51dbcaf56e1174212b1e404158b","url":"https://github.com/selwin/diff-viewer/commit/b6a0bd404aa2a51dbcaf56e1174212b1e404158b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e884c781202f9f9a7fd24e4065ac9d6628824ddb","url":"https://github.com/selwin/diff-viewer/commit/e884c781202f9f9a7fd24e4065ac9d6628824ddb","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c1c7a7504b8ef231a0ccfa9c8370d988a20d9a31","url":"https://github.com/selwin/diff-viewer/commit/c1c7a7504b8ef231a0ccfa9c8370d988a20d9a31","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c41902a93027f97cb3c20362a8ac09410684ff3e","url":"https://github.com/selwin/diff-viewer/commit/c41902a93027f97cb3c20362a8ac09410684ff3e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"44d504356f74089e138fc05837dd247b13a78038","url":"https://github.com/selwin/diff-viewer/commit/44d504356f74089e138fc05837dd247b13a78038","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e50b76186613957c6ca7d11c047a9cc4dc0a939a","url":"https://github.com/selwin/diff-viewer/commit/e50b76186613957c6ca7d11c047a9cc4dc0a939a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f3a94d4ae01b67d360fcc1170dacff2fb5e3c802","url":"https://github.com/selwin/diff-viewer/commit/f3a94d4ae01b67d360fcc1170dacff2fb5e3c802","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7750f7c49a009870f43fe5f23a2048c6bd970e19","url":"https://github.com/selwin/diff-viewer/commit/7750f7c49a009870f43fe5f23a2048c6bd970e19","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c9b9814ccbd9b4dad187563d6276caae0a072d07","url":"https://github.com/selwin/diff-viewer/commit/c9b9814ccbd9b4dad187563d6276caae0a072d07","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"2455fc47b413a2250cd0ea51447ccb664e211d7c","url":"https://github.com/selwin/diff-viewer/commit/2455fc47b413a2250cd0ea51447ccb664e211d7c","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b64b290128cd1abac6b7447ded95b65a810f8961","url":"https://github.com/selwin/diff-viewer/commit/b64b290128cd1abac6b7447ded95b65a810f8961","weight":0.9}],"data":{"attributed_loc_by_commit":{"3b06b94eb0d8a05d58ee308f0adb0aa2fb792c29":586,"b64b290128cd1abac6b7447ded95b65a810f8961":0,"2455fc47b413a2250cd0ea51447ccb664e211d7c":45,"c9b9814ccbd9b4dad187563d6276caae0a072d07":770,"7750f7c49a009870f43fe5f23a2048c6bd970e19":645,"f3a94d4ae01b67d360fcc1170dacff2fb5e3c802":472,"e50b76186613957c6ca7d11c047a9cc4dc0a939a":458,"44d504356f74089e138fc05837dd247b13a78038":0,"c41902a93027f97cb3c20362a8ac09410684ff3e":417,"c1c7a7504b8ef231a0ccfa9c8370d988a20d9a31":350,"e884c781202f9f9a7fd24e4065ac9d6628824ddb":29,"b6a0bd404aa2a51dbcaf56e1174212b1e404158b":97,"8894631ccb5ec752799de3df9fd8afa53771ba05":530,"a045da284fd5f97eed75dfc6562e9dbbfbae864d":48,"a7e7305c67b6d3c661ad1e0f87965bbe7bbf626a":2097,"6b95d51a678cc7385cdeab2955d13283e319f98c":773,"11ca7a8445db4b4f5334d31d9e5f939092ce0417":1,"b90273baa796edf4acc759ff66adbac8751655e1":0,"dd56dd51e0a7f31ade07045c67a8269faa6b0018":351,"77269cefcd6b6afbcaefe436326985448fa3d203":102,"94b4c8ae8fca3d1ca9d2dd7b044e33265c56abc5":229,"50055c751020dd4849a3c4d9e634d80117480c70":56,"01bf79d976243913b141ea2a51cabb3e9bf5dc8b":133,"922c1ef2935283a3f014e181567e3f3e3f03676d":115,"5b3e225a3d6fa9a96efeaed2083e4f55569ea484":1702,"a64ef7e33a6c99c8873db45fc653d7cbc25d57c3":421},"tools":{"claude-code":{"name":"Claude Code","commits":25,"loc":9654,"first_seen":1789199213,"last_seen":1790777412},"github-copilot":{"name":"GitHub Copilot coding agent","commits":1,"loc":773,"first_seen":1790239254,"last_seen":1790239254}},"monthly":{"2026-09":{"loc":68183,"attributed_loc":10427},"2026-10":{"loc":26562,"attributed_loc":0},"2026-11":{"loc":9168,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":136.0,"flagged_units":17.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":99489.0,"flagged_loc":35715.0,"flagged_loc_share":0.35898441033682116,"max_loc_per_hour":6420.0,"median_loc_per_hour":248.40434707607383,"pr_timed_units":89.0,"excluded_import_loc":4424.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"3,210 lines of first-party code in ~0.5h (6,420 lines/hour, PR #1)","ref":"0691c25e23701878611c4161764e114d979e412f","url":"https://github.com/selwin/diff-viewer/commit/0691c25e23701878611c4161764e114d979e412f","weight":0.6},{"kind":"velocity-burst","description":"2,972 lines of first-party code in ~1.1h (2,698 lines/hour, PR #63)","ref":"c7669a3ccce55f8b3e720220cde0c9cf0f33907d","url":"https://github.com/selwin/diff-viewer/commit/c7669a3ccce55f8b3e720220cde0c9cf0f33907d","weight":0.6},{"kind":"velocity-burst","description":"1,245 lines of first-party code in ~0.5h (2,490 lines/hour, PR #36)","ref":"12a9bbd7339e7596482abe598b0e459af7476c00","url":"https://github.com/selwin/diff-viewer/commit/12a9bbd7339e7596482abe598b0e459af7476c00","weight":0.6},{"kind":"velocity-burst","description":"1,179 lines of first-party code in ~0.6h (2,072 lines/hour, PR #77)","ref":"6b75d7c4c12a26f531d67f7f8dce5e7f693707d9","url":"https://github.com/selwin/diff-viewer/commit/6b75d7c4c12a26f531d67f7f8dce5e7f693707d9","weight":0.6},{"kind":"velocity-burst","description":"1,702 lines of first-party code in ~1.4h (1,220 lines/hour, PR #46)","ref":"5b3e225a3d6fa9a96efeaed2083e4f55569ea484","url":"https://github.com/selwin/diff-viewer/commit/5b3e225a3d6fa9a96efeaed2083e4f55569ea484","weight":0.36587579617834387},{"kind":"velocity-burst","description":"1,749 lines of first-party code in ~1.6h (1,101 lines/hour, PR #12)","ref":"c5994f433c8c0d843c1195c2f13b34803f1c94bb","url":"https://github.com/selwin/diff-viewer/commit/c5994f433c8c0d843c1195c2f13b34803f1c94bb","weight":0.33040405807241563},{"kind":"velocity-burst","description":"1,455 lines of first-party code in ~1.6h (887 lines/hour, PR #92)","ref":"d5b75a06e2052990d7ee88e628d011d8f83ea44c","url":"https://github.com/selwin/diff-viewer/commit/d5b75a06e2052990d7ee88e628d011d8f83ea44c","weight":0.2661585365853658},{"kind":"velocity-burst","description":"1,248 lines of first-party code in ~1.6h (758 lines/hour, 2 commit session)","ref":"12934a2075174ca082f99556825c326da242de8f","url":"https://github.com/selwin/diff-viewer/commit/12934a2075174ca082f99556825c326da242de8f","weight":0.22725341426403645},{"kind":"velocity-burst","description":"3,108 lines of first-party code in ~4.1h (756 lines/hour, PR #18)","ref":"b650fbb736ff55706989933b17635e7136caa15b","url":"https://github.com/selwin/diff-viewer/commit/b650fbb736ff55706989933b17635e7136caa15b","weight":0.22678467671103303},{"kind":"velocity-burst","description":"3,772 lines of first-party code in ~5.6h (675 lines/hour, 9 commit session)","ref":"e884c781202f9f9a7fd24e4065ac9d6628824ddb","url":"https://github.com/selwin/diff-viewer/commit/e884c781202f9f9a7fd24e4065ac9d6628824ddb","weight":0.20258391764881395},{"kind":"velocity-burst","description":"1,335 lines of first-party code in ~2.1h (637 lines/hour, 2 commit session)","ref":"082bc659f89e42d12ba1afebeeda4503845fdf68","url":"https://github.com/selwin/diff-viewer/commit/082bc659f89e42d12ba1afebeeda4503845fdf68","weight":0.19109343936381712},{"kind":"velocity-burst","description":"2,597 lines of first-party code in ~4.4h (596 lines/hour, PR #82)","ref":"8aed7cf869f99a105d7b570f30d925bdb7364f08","url":"https://github.com/selwin/diff-viewer/commit/8aed7cf869f99a105d7b570f30d925bdb7364f08","weight":0.1787723882975333},{"kind":"velocity-burst","description":"1,172 lines of first-party code in ~2.0h (575 lines/hour, PR #8)","ref":"92d3e894f90bce22a39a28fd68e6186fe4b538b5","url":"https://github.com/selwin/diff-viewer/commit/92d3e894f90bce22a39a28fd68e6186fe4b538b5","weight":0.17235294117647057},{"kind":"velocity-burst","description":"2,296 lines of first-party code in ~4.0h (574 lines/hour, 1 commit session)","ref":"848fb5125c6c20f8735e8fbe51b0b5a05378b61f","url":"https://github.com/selwin/diff-viewer/commit/848fb5125c6c20f8735e8fbe51b0b5a05378b61f","weight":0.1722},{"kind":"velocity-burst","description":"2,357 lines of first-party code in ~4.1h (570 lines/hour, PR #51)","ref":"d3c672ccecd220f083e002d331c6ec6da699619e","url":"https://github.com/selwin/diff-viewer/commit/d3c672ccecd220f083e002d331c6ec6da699619e","weight":0.17104959010885634}],"data":{"flagged_loc_by_commit":{"3b06b94eb0d8a05d58ee308f0adb0aa2fb792c29":586,"2455fc47b413a2250cd0ea51447ccb664e211d7c":45,"c9b9814ccbd9b4dad187563d6276caae0a072d07":770,"7750f7c49a009870f43fe5f23a2048c6bd970e19":645,"f3a94d4ae01b67d360fcc1170dacff2fb5e3c802":472,"e50b76186613957c6ca7d11c047a9cc4dc0a939a":458,"c41902a93027f97cb3c20362a8ac09410684ff3e":417,"c1c7a7504b8ef231a0ccfa9c8370d988a20d9a31":350,"e884c781202f9f9a7fd24e4065ac9d6628824ddb":29,"e6f301e44965f382b50d192876236e4bc3817f6a":631,"082bc659f89e42d12ba1afebeeda4503845fdf68":704,"b6338ffd8b187f388290286a4bd33896d2fa419e":84,"12934a2075174ca082f99556825c326da242de8f":1164,"0691c25e23701878611c4161764e114d979e412f":3210,"92d3e894f90bce22a39a28fd68e6186fe4b538b5":1172,"c5994f433c8c0d843c1195c2f13b34803f1c94bb":1749,"848fb5125c6c20f8735e8fbe51b0b5a05378b61f":2296,"b650fbb736ff55706989933b17635e7136caa15b":3108,"12a9bbd7339e7596482abe598b0e459af7476c00":1245,"871d1ae3e8db964f95ddf9d14e9fa4dcb7351c7b":2777,"5b3e225a3d6fa9a96efeaed2083e4f55569ea484":1702,"8522be93db1666378a9504adc914524723a4f888":1541,"d3c672ccecd220f083e002d331c6ec6da699619e":2357,"c7669a3ccce55f8b3e720220cde0c9cf0f33907d":2972,"6b75d7c4c12a26f531d67f7f8dce5e7f693707d9":1179,"8aed7cf869f99a105d7b570f30d925bdb7364f08":2597,"d5b75a06e2052990d7ee88e628d011d8f83ea44c":1455},"excluded_import_commits":["a226112c761b41fb8c0d7a17068ba70f950f977a"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":75542.0,"index":0.093,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":14.0,"per_kloc:emoji_in_code":0.185,"files:emoji_in_code":6.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":7.0,"findings_high":0.0,"findings_medium":7.0,"findings_low":0.0,"weighted_findings":1.75,"scanned_lines":75542.0,"parse_errors":6.0},"findings":[{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/LineDiffTests.swift","line":66,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/LineDiffTests.swift:66"},{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/LineDiffTests.swift","line":69,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/LineDiffTests.swift:69"},{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/RowFoldingTests.swift","line":161,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/RowFoldingTests.swift:161"},{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/RowFoldingTests.swift","line":163,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/RowFoldingTests.swift:163"},{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/RowFoldingTests.swift","line":165,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/RowFoldingTests.swift:165"},{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/RowFoldingTests.swift","line":171,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/RowFoldingTests.swift:171"},{"rule_id":"opengrep/swift.lang.crypto.insecure-random","severity":"medium","message":"A random number generator was detected which is **not** *guaranteed* to be Cryptographically secure. If the source of entropy is used for security purposes (e.g. with other Cryptographic operations), make sure to use the `SecCopyRandomBytes` API explicitly. [confidence low]","path":"DiffViewerTests/RowFoldingTests.swift","line":174,"fingerprint":"swift.lang.crypto.insecure-random:DiffViewerTests/RowFoldingTests.swift:174"}],"evidence":[],"data":{"rulesets":["swift","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":3.0,"findings":3.0,"findings_high":0.0,"findings_medium":3.0,"findings_low":0.0,"penalty":3.6},"findings":[{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/format.yml","line":38,"fingerprint":"artipacked:.github/workflows/format.yml:38"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/lint.yml","line":35,"fingerprint":"artipacked:.github/workflows/lint.yml:35"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/test.yml","line":26,"fingerprint":"artipacked:.github/workflows/test.yml:26"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":1.0,"check:lockfiles":1.0,"signed_commit_share":0.52,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":5392.0,"function_nloc":48549.0,"mean_ccn":2.18,"p90_ccn":5.0,"complex_functions":22.0,"long_functions":0.0,"many_param_functions":14.0,"risky_nloc_share":0.0219},"findings":[],"evidence":[{"kind":"complex-function","description":"apply in DiffViewer/App/DebugSnapshot.swift: complexity 42, 96 lines","ref":"DiffViewer/App/DebugSnapshot.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/DebugSnapshot.swift#L120","weight":0.7},{"kind":"complex-function","description":"refresh in DiffViewer/App/WindowState.swift: complexity 39, 99 lines","ref":"DiffViewer/App/WindowState.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/WindowState.swift#L537","weight":0.65},{"kind":"complex-function","description":"from in DiffViewer/Highlighting/TokenStyle.swift: complexity 29, 52 lines","ref":"DiffViewer/Highlighting/TokenStyle.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Highlighting/TokenStyle.swift#L22","weight":0.48333333333333334},{"kind":"complex-function","description":"load in DiffViewer/App/DiffLoader.swift: complexity 25, 87 lines","ref":"DiffViewer/App/DiffLoader.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/DiffLoader.swift#L67","weight":0.4166666666666667},{"kind":"complex-function","description":"rowButtons in DiffViewer/App/SyncPolicy.swift: complexity 25, 53 lines","ref":"DiffViewer/App/SyncPolicy.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/SyncPolicy.swift#L204","weight":0.4166666666666667},{"kind":"complex-function","description":"openPullRequest in DiffViewer/App/WindowState.swift: complexity 25, 56 lines","ref":"DiffViewer/App/WindowState.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/WindowState.swift#L2420","weight":0.4166666666666667},{"kind":"complex-function","description":"middleSnake in DiffViewer/Diff/LineDiff.swift: complexity 24, 52 lines","ref":"DiffViewer/Diff/LineDiff.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Diff/LineDiff.swift#L93","weight":0.4},{"kind":"complex-function","description":"refreshHeadState in DiffViewer/App/WindowState.swift: complexity 22, 47 lines","ref":"DiffViewer/App/WindowState.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/WindowState.swift#L1139","weight":0.36666666666666664},{"kind":"complex-function","description":"runSync in DiffViewer/App/WindowState.swift: complexity 21, 49 lines","ref":"DiffViewer/App/WindowState.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/WindowState.swift#L2022","weight":0.35},{"kind":"complex-function","description":"open in DiffViewer/App/WindowCoordinator.swift: complexity 20, 59 lines","ref":"DiffViewer/App/WindowCoordinator.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/WindowCoordinator.swift#L157","weight":0.3333333333333333}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":57236.0,"duplicated_lines":1257.0,"duplicated_share":0.022,"files":447.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/App/CommitPickerState.swift:283 and DiffViewer/App/StashPickerState.swift:189","ref":"DiffViewer/App/CommitPickerState.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/CommitPickerState.swift#L283","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/App/DiffViewerApp.swift:116 and DiffViewer/App/DiffViewerApp.swift:165","ref":"DiffViewer/App/DiffViewerApp.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/DiffViewerApp.swift#L116","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/App/WindowAccessor.swift:45 and DiffViewer/Views/CompareWindowAccessor.swift:27","ref":"DiffViewer/App/WindowAccessor.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/App/WindowAccessor.swift#L45","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchDeleteConfirmation.swift:18 and DiffViewer/Views/StashDropConfirmation.swift:16","ref":"DiffViewer/Views/BranchDeleteConfirmation.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchDeleteConfirmation.swift#L18","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchPickerContainerView+Chrome.swift:51 and DiffViewer/Views/CommitPickerContainerView+Chrome.swift:7","ref":"DiffViewer/Views/BranchPickerContainerView+Chrome.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchPickerContainerView+Chrome.swift#L51","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchPickerContainerView+Input.swift:6 and DiffViewer/Views/StashPickerContainerView+Input.swift:6","ref":"DiffViewer/Views/BranchPickerContainerView+Input.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchPickerContainerView+Input.swift#L6","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchPickerContainerView.swift:148 and DiffViewer/Views/CommitPickerContainerView.swift:74","ref":"DiffViewer/Views/BranchPickerContainerView.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchPickerContainerView.swift#L148","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchPickerContainerView.swift:464 and DiffViewer/Views/StashPickerContainerView.swift:337","ref":"DiffViewer/Views/BranchPickerContainerView.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchPickerContainerView.swift#L464","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchPickerRowView.swift:97 and DiffViewer/Views/PickerPillButton.swift:86","ref":"DiffViewer/Views/BranchPickerRowView.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchPickerRowView.swift#L97","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: DiffViewer/Views/BranchPickerRowView.swift:224 and DiffViewer/Views/CommitPickerRowView.swift:101","ref":"DiffViewer/Views/BranchPickerRowView.swift","url":"https://github.com/selwin/diff-viewer/blob/eaa47cef4315003b08d15754e2bc0374140864b0/DiffViewer/Views/BranchPickerRowView.swift#L224","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":8.0,"weighted_findings":2.0,"scanned_lines":75542.0,"category:correctness":8.0},"findings":[{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/check-unstaged.sh","line":29,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/check-unstaged.sh:29"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/check-unstaged.sh","line":36,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/check-unstaged.sh:36"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/check-unstaged.sh","line":42,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/check-unstaged.sh:42"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/snapshot.sh","line":31,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/snapshot.sh:31"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/swift-format.sh","line":23,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/swift-format.sh:23"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/swift-format.sh","line":23,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/swift-format.sh:23"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/swiftlint.sh","line":24,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/swiftlint.sh:24"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"scripts/swiftlint.sh","line":24,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:scripts/swiftlint.sh:24"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":0.0,"check:test_ratio":0.0,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":1.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":75542.0,"test_ratio":0.0,"ci_files":3.0,"cochange_share":0.0,"cochange_commits":160.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/format.yml","ref":".github/workflows/format.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/lint.yml","ref":".github/workflows/lint.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/test.yml","ref":".github/workflows/test.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs linters (swiftlint)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":[],"lint_commands":["swiftlint"]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":0.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":188.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":7034.0,"other_lines":68508.0,"files_blamed":447.0,"blame_failures":0.0,"quality:ai_findings":4.0,"quality:ai_per_kloc":0.569,"quality:other_findings":4.0,"quality:other_per_kloc":0.058,"quality:ratio":9.81,"security:ai_findings":7.0,"security:ai_per_kloc":0.995,"security:other_findings":0.0,"security:other_per_kloc":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":true},"error":null}],"flags":[]}