{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:02.429055Z","repo":{"ref":{"host":"github.com","owner":"aletheap","name":"slack-exporter"},"default_branch":"main","clone_url":"https://github.com/aletheap/slack-exporter.git","html_url":"https://github.com/aletheap/slack-exporter","description":"Export Slack private channels to the official Slack export format","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":191,"primary_language":"Python","license_spdx":null,"created_at":"2026-03-10T09:01:41Z","pushed_at":"2026-03-28T08:54:52Z","security_policy_url":null,"distribution":{"owner_created_at":"2015-02-12T10:50:40Z","owner_type":"User","release_assets":[]}},"commit_sha":"d4a178065f0d14b786065fba9c371423f3815d61","profile":{"lines_by_language":{"Python":2102},"files_by_category":{"config":2,"docs":2,"source":2},"source_lines":2102,"test_lines":0},"pillars":{"ai_provenance":{"score":100.0,"confidence":0.78,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":1.0,"suspected_share":0.0,"estimated_share":1.0,"ai_artifacts":1.0,"flagged_work_units":0.0,"flagged_releases":null,"style_index":75.88},"summary":"Explicit AI attribution on 100% of first-party code added; an estimated 100% including velocity signals."},"quality":{"score":33.8,"confidence":0.9,"coverage":1.0,"label":"poor","breakdown":{"complexity":52.1,"duplication":92.8,"lint":0.7,"testing":0.0,"docs":40.0,"type_safety":40.0,"process":null},"summary":"Code quality is poor: test-to-source ratio 0.00, no CI test run detected; 22% of function code in complex or long functions; 1% duplicated lines. Weakest area: testing."},"security":{"score":84.9,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":100.0,"sast":100.0,"dependencies":83.2,"ci_actions":null,"posture":20.0,"scorecard":null},"summary":"Security posture is adequate: 8 known vulnerabilities in 2 dependencies. 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":3.0,"checked":3.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":34.0,"attributed_commits":32.0,"attributed_commit_share":0.9411764705882353,"effective_loc":2529.0,"attributed_loc":2529.0,"attributed_loc_share":1.0,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 32 attributed commits, 2,529 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"d4a178065f0d14b786065fba9c371423f3815d61","url":"https://github.com/aletheap/slack-exporter/commit/d4a178065f0d14b786065fba9c371423f3815d61","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4da3479ff13fadf1ee21fe575439355a4c915942","url":"https://github.com/aletheap/slack-exporter/commit/4da3479ff13fadf1ee21fe575439355a4c915942","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"fde93ae2ce703ead546a15a7de1c0db54a2e6147","url":"https://github.com/aletheap/slack-exporter/commit/fde93ae2ce703ead546a15a7de1c0db54a2e6147","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4a47ec74efcf2dcfe3f253f6b9c70faff4c9e7bf","url":"https://github.com/aletheap/slack-exporter/commit/4a47ec74efcf2dcfe3f253f6b9c70faff4c9e7bf","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"8ae9bc66bd4f3eca9fe6cd53bee483692d53d072","url":"https://github.com/aletheap/slack-exporter/commit/8ae9bc66bd4f3eca9fe6cd53bee483692d53d072","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"bba43de62c31db0480110ec655fc53673d010be7","url":"https://github.com/aletheap/slack-exporter/commit/bba43de62c31db0480110ec655fc53673d010be7","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"29b9eb178f726adaa842054f834be512cd1e2733","url":"https://github.com/aletheap/slack-exporter/commit/29b9eb178f726adaa842054f834be512cd1e2733","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"983310100295bf919bc7909a43fb63c66398fa06","url":"https://github.com/aletheap/slack-exporter/commit/983310100295bf919bc7909a43fb63c66398fa06","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a899376607f9c19248f77287d394928bed88f9d9","url":"https://github.com/aletheap/slack-exporter/commit/a899376607f9c19248f77287d394928bed88f9d9","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"0f9a08b419570b39206370930960f15effc699f7","url":"https://github.com/aletheap/slack-exporter/commit/0f9a08b419570b39206370930960f15effc699f7","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4abace3de9bb9efe7dfb8af56e5fd1a23352dc2e","url":"https://github.com/aletheap/slack-exporter/commit/4abace3de9bb9efe7dfb8af56e5fd1a23352dc2e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"39472792fb244cb9564f9b5faaa4841d7c0847b2","url":"https://github.com/aletheap/slack-exporter/commit/39472792fb244cb9564f9b5faaa4841d7c0847b2","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ce0871b92de1a56e69493a0c749e7ecf3acaf8e1","url":"https://github.com/aletheap/slack-exporter/commit/ce0871b92de1a56e69493a0c749e7ecf3acaf8e1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c365b62cede13b726e9afa299ba37cdc6ac44bc4","url":"https://github.com/aletheap/slack-exporter/commit/c365b62cede13b726e9afa299ba37cdc6ac44bc4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a69f3344eaafea5e993b53a834d22a9e2ca50675","url":"https://github.com/aletheap/slack-exporter/commit/a69f3344eaafea5e993b53a834d22a9e2ca50675","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ef41120f31047d5aa826aebd55bfdb6fd0eab62a","url":"https://github.com/aletheap/slack-exporter/commit/ef41120f31047d5aa826aebd55bfdb6fd0eab62a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f1f9f476e32b47c6f474903e0308736708810da5","url":"https://github.com/aletheap/slack-exporter/commit/f1f9f476e32b47c6f474903e0308736708810da5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b004553829e9203b7e512ef2f602051a2bbd0220","url":"https://github.com/aletheap/slack-exporter/commit/b004553829e9203b7e512ef2f602051a2bbd0220","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"68b4e106c0fcbad6f1041f2c5aced6479e1a8be5","url":"https://github.com/aletheap/slack-exporter/commit/68b4e106c0fcbad6f1041f2c5aced6479e1a8be5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"0db5c0e58d4fbd138320942650f3e1f315e9ccc4","url":"https://github.com/aletheap/slack-exporter/commit/0db5c0e58d4fbd138320942650f3e1f315e9ccc4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"2596833982b6fb0d27e81b5c220c11b7ab4eda8b","url":"https://github.com/aletheap/slack-exporter/commit/2596833982b6fb0d27e81b5c220c11b7ab4eda8b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"9065a5b2b2a55ab1ffed0399e3b75bae1f6539be","url":"https://github.com/aletheap/slack-exporter/commit/9065a5b2b2a55ab1ffed0399e3b75bae1f6539be","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b1c9cff2911e3ca8a9f18b684c896694e7073511","url":"https://github.com/aletheap/slack-exporter/commit/b1c9cff2911e3ca8a9f18b684c896694e7073511","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c21d67812888a89bbd3a9c9e4805c514dc8ced34","url":"https://github.com/aletheap/slack-exporter/commit/c21d67812888a89bbd3a9c9e4805c514dc8ced34","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"04323b985e73ece2fa4f616dcaf337c1ce694667","url":"https://github.com/aletheap/slack-exporter/commit/04323b985e73ece2fa4f616dcaf337c1ce694667","weight":0.9}],"data":{"attributed_loc_by_commit":{"4b1699d50fda3ee2273e3d35dc850bfa558fdc61":448,"ddf80d6deebee3aeb94161001506eaed36f9b64f":0,"c54bb4cfd7d9d86eff711d6d44e1cc740bcb68aa":15,"9329c330f6ecaff08982e05d7d8c8fbe774f577b":1583,"94faca4063da086d4f1e0ae89bd771b086343596":17,"99257896089f449312f40b1486951654e934f212":9,"02621682ae2649b57a6878676df04edbffa56764":23,"04323b985e73ece2fa4f616dcaf337c1ce694667":63,"c21d67812888a89bbd3a9c9e4805c514dc8ced34":39,"b1c9cff2911e3ca8a9f18b684c896694e7073511":8,"9065a5b2b2a55ab1ffed0399e3b75bae1f6539be":3,"2596833982b6fb0d27e81b5c220c11b7ab4eda8b":70,"0db5c0e58d4fbd138320942650f3e1f315e9ccc4":12,"68b4e106c0fcbad6f1041f2c5aced6479e1a8be5":47,"b004553829e9203b7e512ef2f602051a2bbd0220":6,"f1f9f476e32b47c6f474903e0308736708810da5":1,"ef41120f31047d5aa826aebd55bfdb6fd0eab62a":3,"a69f3344eaafea5e993b53a834d22a9e2ca50675":2,"c365b62cede13b726e9afa299ba37cdc6ac44bc4":0,"ce0871b92de1a56e69493a0c749e7ecf3acaf8e1":29,"39472792fb244cb9564f9b5faaa4841d7c0847b2":35,"4abace3de9bb9efe7dfb8af56e5fd1a23352dc2e":6,"0f9a08b419570b39206370930960f15effc699f7":32,"a899376607f9c19248f77287d394928bed88f9d9":4,"983310100295bf919bc7909a43fb63c66398fa06":4,"29b9eb178f726adaa842054f834be512cd1e2733":23,"bba43de62c31db0480110ec655fc53673d010be7":7,"8ae9bc66bd4f3eca9fe6cd53bee483692d53d072":9,"4a47ec74efcf2dcfe3f253f6b9c70faff4c9e7bf":0,"fde93ae2ce703ead546a15a7de1c0db54a2e6147":12,"4da3479ff13fadf1ee21fe575439355a4c915942":4,"d4a178065f0d14b786065fba9c371423f3815d61":15},"tools":{"claude-code":{"name":"Claude Code","commits":32,"loc":2529,"first_seen":1773133273,"last_seen":1774688090}},"monthly":{"2026-03":{"loc":2529,"attributed_loc":2529}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":1.0,"workflow_agents":0.0,"tools_configured":1.0,"earliest_adoption":1773133273.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":".claude/launch.json (claude-code configuration)","ref":".claude/launch.json","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/.claude/launch.json","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":".claude/launch.json","added_at":1773133273}],"workflows":[],"tools":["claude-code"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":7.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":2529.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":379.5870140100152,"median_loc_per_hour":245.7935070050076,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"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":2102.0,"index":75.88,"count:narrated_steps":8.0,"per_kloc:narrated_steps":3.806,"files:narrated_steps":1.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":303.0,"per_kloc:emoji_in_code":144.148,"files:emoji_in_code":1.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 1: Extract Slack angle-bracket tokens to numbered placeholders","ref":"slack_html.py:549","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L549","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 2: Decode Slack's pre-escaped entities, then re-escape for HTML.","ref":"slack_html.py:559","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L559","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 3: Code blocks (must precede inline code and inline formatting)","ref":"slack_html.py:564","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L564","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 4: Inline code","ref":"slack_html.py:571","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L571","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 5: Restore Slack tokens → HTML","ref":"slack_html.py:574","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L574","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 6: Bold, italic, strikethrough","ref":"slack_html.py:608","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L608","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 7: Emoji  :name:","ref":"slack_html.py:613","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L613","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 8: Newlines → <br>","ref":"slack_html.py:620","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L620","weight":0.0}],"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":2102.0,"parse_errors":0.0},"findings":[],"evidence":[],"data":{"rulesets":["python"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":2.0,"vulnerabilities":8.0,"vulns_critical":0.0,"vulns_high":1.0,"vulns_medium":5.0,"vulns_low":0.0,"vulns_unknown":2.0,"penalty":11.0},"findings":[{"rule_id":"osv/GHSA-x84v-xcm2-53pg","severity":"high","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2018-28, GHSA-x84v-xcm2-53pg","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):GHSA-x84v-xcm2-53pg"},{"rule_id":"osv/GHSA-cfj3-7x9c-4p3h","severity":"medium","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2014-13, GHSA-cfj3-7x9c-4p3h","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):GHSA-cfj3-7x9c-4p3h"},{"rule_id":"osv/GHSA-652x-xj99-gmcc","severity":"medium","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2014-14, GHSA-652x-xj99-gmcc","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):GHSA-652x-xj99-gmcc"},{"rule_id":"osv/PYSEC-2015-17","severity":"medium","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2015-17","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):PYSEC-2015-17"},{"rule_id":"osv/GHSA-9hjg-9r4m-mvj7","severity":"medium","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2026-1872, GHSA-9hjg-9r4m-mvj7","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):GHSA-9hjg-9r4m-mvj7"},{"rule_id":"osv/GHSA-9wx4-h78v-vm56","severity":"medium","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2026-1873, GHSA-9wx4-h78v-vm56","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):GHSA-9wx4-h78v-vm56"},{"rule_id":"osv/GHSA-gc5v-m9x4-r6x2","severity":"medium","message":"requests@2.0.0 (PyPI) is affected by PYSEC-2026-2275, GHSA-gc5v-m9x4-r6x2","path":"requirements.txt","line":null,"fingerprint":"requests@2.0.0 (PyPI):GHSA-gc5v-m9x4-r6x2"},{"rule_id":"osv/PYSEC-2017-74","severity":"medium","message":"tqdm@4.0.0 (PyPI) is affected by PYSEC-2017-74","path":"requirements.txt","line":null,"fingerprint":"tqdm@4.0.0 (PyPI):PYSEC-2017-74"}],"evidence":[],"data":{"ecosystems":["PyPI"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"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":1.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":50.0,"function_nloc":883.0,"mean_ccn":5.36,"p90_ccn":13.0,"complex_functions":2.0,"long_functions":1.0,"many_param_functions":0.0,"risky_nloc_share":0.2174},"findings":[],"evidence":[{"kind":"complex-function","description":"export in slack_exporter.py: complexity 28, 89 lines","ref":"slack_exporter.py","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_exporter.py#L328","weight":0.4666666666666667},{"kind":"complex-function","description":"main in slack_exporter.py: complexity 17, 103 lines","ref":"slack_exporter.py","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_exporter.py#L461","weight":0.2833333333333333}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":1759.0,"duplicated_lines":22.0,"duplicated_share":0.0125,"files":2.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: slack_html.py:918 and slack_html.py:995","ref":"slack_html.py","url":"https://github.com/aletheap/slack-exporter/blob/d4a178065f0d14b786065fba9c371423f3815d61/slack_html.py#L918","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":42.0,"weighted_findings":42.0,"scanned_lines":2102.0,"category:maintainability":42.0},"findings":[{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"poop\"` is uselessly assigned twice","path":"slack_html.py","line":66,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:66"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"poop\"` is uselessly assigned twice","path":"slack_html.py","line":68,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:68"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"wave\"` is uselessly assigned twice","path":"slack_html.py","line":73,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:73"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"wave\"` is uselessly assigned twice","path":"slack_html.py","line":105,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:105"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"cup_with_straw\"` is uselessly assigned twice","path":"slack_html.py","line":181,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:181"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"cup_with_straw\"` is uselessly assigned twice","path":"slack_html.py","line":183,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:183"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"boom\"` is uselessly assigned twice","path":"slack_html.py","line":243,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:243"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"anger\"` is uselessly assigned twice","path":"slack_html.py","line":243,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:243"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"100\"` is uselessly assigned twice","path":"slack_html.py","line":243,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:243"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"moneybag\"` is uselessly assigned twice","path":"slack_html.py","line":244,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:244"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"mag\"` is uselessly assigned twice","path":"slack_html.py","line":248,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:248"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"hammer\"` is uselessly assigned twice","path":"slack_html.py","line":250,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:250"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"wrench\"` is uselessly assigned twice","path":"slack_html.py","line":253,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:253"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"package\"` is uselessly assigned twice","path":"slack_html.py","line":257,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:257"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"mailbox\"` is uselessly assigned twice","path":"slack_html.py","line":257,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:257"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"inbox_tray\"` is uselessly assigned twice","path":"slack_html.py","line":258,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:258"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"outbox_tray\"` is uselessly assigned twice","path":"slack_html.py","line":258,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:258"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"wastebasket\"` is uselessly assigned twice","path":"slack_html.py","line":259,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:259"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"calendar_spiral\"` is uselessly assigned twice","path":"slack_html.py","line":260,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:260"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"pencil\"` is uselessly assigned twice","path":"slack_html.py","line":264,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:264"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"inbox_tray\"` is uselessly assigned twice","path":"slack_html.py","line":274,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:274"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"outbox_tray\"` is uselessly assigned twice","path":"slack_html.py","line":274,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:274"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"package\"` is uselessly assigned twice","path":"slack_html.py","line":275,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:275"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"mailbox\"` is uselessly assigned twice","path":"slack_html.py","line":275,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:275"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"pencil\"` is uselessly assigned twice","path":"slack_html.py","line":277,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:277"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"calendar\"` is uselessly assigned twice","path":"slack_html.py","line":279,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:279"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"calendar_spiral\"` is uselessly assigned twice","path":"slack_html.py","line":279,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:279"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"wastebasket\"` is uselessly assigned twice","path":"slack_html.py","line":280,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:280"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"telephone_receiver\"` is uselessly assigned twice","path":"slack_html.py","line":281,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:281"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"telephone_receiver\"` is uselessly assigned twice","path":"slack_html.py","line":291,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:291"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"calendar\"` is uselessly assigned twice","path":"slack_html.py","line":298,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:298"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"moneybag\"` is uselessly assigned twice","path":"slack_html.py","line":299,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:299"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"hammer\"` is uselessly assigned twice","path":"slack_html.py","line":300,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:300"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"wrench\"` is uselessly assigned twice","path":"slack_html.py","line":300,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:300"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"mag\"` is uselessly assigned twice","path":"slack_html.py","line":301,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:301"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"sos\"` is uselessly assigned twice","path":"slack_html.py","line":328,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:328"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"up\"` is uselessly assigned twice","path":"slack_html.py","line":331,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:331"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"sos\"` is uselessly assigned twice","path":"slack_html.py","line":332,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:332"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"up\"` is uselessly assigned twice","path":"slack_html.py","line":332,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:332"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"100\"` is uselessly assigned twice","path":"slack_html.py","line":338,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:338"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"anger\"` is uselessly assigned twice","path":"slack_html.py","line":367,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:367"},{"rule_id":"opengrep/python.lang.maintainability.useless-literal","severity":"medium","message":"key `\"boom\"` is uselessly assigned twice","path":"slack_html.py","line":367,"fingerprint":"python.lang.maintainability.useless-literal:slack_html.py:367"}],"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":0.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":2102.0,"test_ratio":0.0,"ci_files":0.0,"cochange_share":0.0,"cochange_commits":29.0},"findings":[],"evidence":[],"data":{"test_commands":[],"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":90.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},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":2102.0,"other_lines":0.0,"files_blamed":2.0,"blame_failures":0.0,"quality:ai_findings":42.0,"quality:ai_per_kloc":19.981,"quality:other_findings":0.0,"security:ai_findings":0.0,"security:ai_per_kloc":0.0,"security:other_findings":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":["unreviewed-ai-risk"]}