{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:51:59.785886Z","repo":{"ref":{"host":"github.com","owner":"4lrick","name":"simple-reminder"},"default_branch":"main","clone_url":"https://github.com/4lrick/simple-reminder.git","html_url":"https://github.com/4lrick/simple-reminder","description":"Simple Discord bot to create reminders","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":203,"primary_language":"Python","license_spdx":null,"created_at":"2025-02-11T01:25:18Z","pushed_at":"2025-05-18T22:11:45Z","security_policy_url":null,"distribution":{"owner_created_at":"2021-09-30T12:15:18Z","owner_type":"User","release_assets":[]}},"commit_sha":"1d984c08e558d9e67a0e710e1e86f46e7b8c09f0","profile":{"lines_by_language":{"Python":2467},"files_by_category":{"source":14,"config":6,"test":4,"other":2,"docs":2},"source_lines":1649,"test_lines":818},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.55,"coverage":1.0,"label":"possible","breakdown":{"attributed_share":0.0,"suspected_share":0.2733,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":1.0,"flagged_releases":null,"style_index":13.341},"summary":"Weak signals consistent with AI-assisted development. Comments and strings use phrasing typical of LLM-written code (see the coding style evidence)."},"quality":{"score":53.8,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":16.7,"duplication":60.2,"lint":54.5,"testing":87.4,"docs":40.0,"type_safety":40.0,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.50, CI runs tests; 60% of function code in complex or long functions; 8% duplicated lines. Weakest area: complexity."},"security":{"score":73.8,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":100.0,"sast":100.0,"dependencies":95.1,"ci_actions":15.9,"posture":0.0,"scorecard":null},"summary":"Security posture is adequate: 1 known vulnerabilities in 1 dependencies; 9 high-severity workflow issues. 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":"ok","tool_version":null,"metrics":{"declared":6.0,"checked":6.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":58.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":5272.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2025-02":{"loc":4678,"attributed_loc":0},"2025-03":{"loc":309,"attributed_loc":0},"2025-05":{"loc":285,"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":16.0,"flagged_units":1.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":5272.0,"flagged_loc":1441.0,"flagged_loc_share":0.2733308042488619,"max_loc_per_hour":571.2586719524281,"median_loc_per_hour":77.90986646884272,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"1,441 lines of first-party code in ~2.5h (571 lines/hour, 2 commit session)","ref":"ffc3e33357a3e77e1e3cfb92972db6dc51edf291","url":"https://github.com/4lrick/simple-reminder/commit/ffc3e33357a3e77e1e3cfb92972db6dc51edf291","weight":0.17137760158572843}],"data":{"flagged_loc_by_commit":{"e7ae893996104d9cb266da70cad6f419f702071f":1428,"ffc3e33357a3e77e1e3cfb92972db6dc51edf291":13},"excluded_import_commits":[]},"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":1649.0,"index":13.341,"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":44.0,"per_kloc:emoji_in_code":26.683,"files:emoji_in_code":7.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":0.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":0.0,"weighted_findings":0.0,"scanned_lines":1649.0,"parse_errors":0.0},"findings":[],"evidence":[],"data":{"rulesets":["python","dockerfile"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":1.0,"vulnerabilities":1.0,"vulns_critical":0.0,"vulns_high":0.0,"vulns_medium":1.0,"vulns_low":0.0,"vulns_unknown":0.0,"penalty":3.0},"findings":[{"rule_id":"osv/GHSA-6w46-j5rx-g56g","severity":"medium","message":"pytest@8.0.0 (PyPI) is affected by PYSEC-2026-1845, GHSA-6w46-j5rx-g56g","path":"requirements.txt","line":null,"fingerprint":"pytest@8.0.0 (PyPI):GHSA-6w46-j5rx-g56g"}],"evidence":[],"data":{"ecosystems":["PyPI"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":1.0,"findings":11.0,"findings_high":9.0,"findings_medium":2.0,"findings_low":0.0,"penalty":110.4},"findings":[{"rule_id":"zizmor/excessive-permissions","severity":"high","message":"overly broad permissions [confidence high]","path":".github/workflows/docker-publish.yml","line":14,"fingerprint":"excessive-permissions:.github/workflows/docker-publish.yml:14"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":23,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:23"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":26,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:26"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":46,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:46"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":47,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:47"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":48,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:48"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":51,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:51"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":57,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:57"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-publish.yml","line":60,"fingerprint":"unpinned-uses:.github/workflows/docker-publish.yml:60"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/docker-publish.yml","line":23,"fingerprint":"artipacked:.github/workflows/docker-publish.yml:23"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/docker-publish.yml","line":46,"fingerprint":"artipacked:.github/workflows/docker-publish.yml:46"}],"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":0.0,"check:lockfiles":1.0,"signed_commit_share":0.0,"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":42.0,"function_nloc":1112.0,"mean_ccn":9.43,"p90_ccn":23.0,"complex_functions":8.0,"long_functions":2.0,"many_param_functions":2.0,"risky_nloc_share":0.5962},"findings":[],"evidence":[{"kind":"complex-function","description":"edit_command in src/commands/edit_reminder.py: complexity 69, 173 lines","ref":"src/commands/edit_reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/edit_reminder.py#L27","weight":1.0},{"kind":"complex-function","description":"handle_reminder in src/commands/handle_reminder.py: complexity 50, 139 lines","ref":"src/commands/handle_reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/handle_reminder.py#L34","weight":0.8333333333333334},{"kind":"complex-function","description":"list_command in src/commands/list_reminders.py: complexity 34, 72 lines","ref":"src/commands/list_reminders.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/list_reminders.py#L12","weight":0.5666666666666667},{"kind":"complex-function","description":"load_reminders in src/reminder.py: complexity 26, 78 lines","ref":"src/reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/reminder.py#L160","weight":0.43333333333333335},{"kind":"complex-function","description":"check_reminders in simple_reminder.py: complexity 23, 64 lines","ref":"simple_reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/simple_reminder.py#L151","weight":0.38333333333333336},{"kind":"complex-function","description":"message_autocomplete in src/commands/autocomplete.py: complexity 22, 47 lines","ref":"src/commands/autocomplete.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/autocomplete.py#L106","weight":0.36666666666666664},{"kind":"complex-function","description":"number_autocomplete in src/commands/autocomplete.py: complexity 21, 45 lines","ref":"src/commands/autocomplete.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/autocomplete.py#L165","weight":0.35},{"kind":"complex-function","description":"remove_command in src/commands/remove_reminder.py: complexity 18, 45 lines","ref":"src/commands/remove_reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/remove_reminder.py#L14","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":1251.0,"duplicated_lines":106.0,"duplicated_share":0.0847,"files":14.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: simple_reminder.py:168 and simple_reminder.py:179","ref":"simple_reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/simple_reminder.py#L168","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/commands/autocomplete.py:125 and src/commands/autocomplete.py:167","ref":"src/commands/autocomplete.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/autocomplete.py#L125","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/commands/edit_reminder.py:46 and src/commands/remove_reminder.py:30","ref":"src/commands/edit_reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/commands/edit_reminder.py#L46","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/reminder.py:233 and src/reminder.py:307","ref":"src/reminder.py","url":"https://github.com/4lrick/simple-reminder/blob/1d984c08e558d9e67a0e710e1e86f46e7b8c09f0/src/reminder.py#L233","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":4.0,"weighted_findings":4.0,"scanned_lines":1649.0,"category:best-practice":4.0},"findings":[{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"src/reminder.py","line":112,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:src/reminder.py:112"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"src/reminder.py","line":168,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:src/reminder.py:168"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"src/server_config.py","line":20,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:src/server_config.py:20"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"src/server_config.py","line":32,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:src/server_config.py:32"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.9921,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.7619,"test_lines":818.0,"source_lines":1649.0,"test_ratio":0.4961,"ci_files":1.0,"cochange_share":0.1905,"cochange_commits":42.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/docker-publish.yml","ref":".github/workflows/docker-publish.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (pytest)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["pytest"],"lint_commands":[]},"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":64.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":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":1.0,"escapes":0.0,"escapes_per_kloc":0.0},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}