{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:58:03.615484Z","repo":{"ref":{"host":"github.com","owner":"vico-png","name":"llamastation"},"default_branch":"main","clone_url":"https://github.com/vico-png/llamastation.git","html_url":"https://github.com/vico-png/llamastation","description":"Open-source llama.cpp GUI for Windows — multi-GPU, TurboQuant, headless mode","stars":41,"forks":1,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":41046,"primary_language":"Python","license_spdx":"MIT","created_at":"2026-05-03T19:56:17Z","pushed_at":"2026-09-22T17:47:43Z","security_policy_url":null,"distribution":{"owner_created_at":"2026-01-27T19:22:15Z","owner_type":"User","release_assets":[{"name":"LlamaStation-v0.9-windows.zip","size":21861774,"download_count":332,"release_tag":"v0.9","url":"https://github.com/vico-png/llamastation/releases/download/v0.9/LlamaStation-v0.9-windows.zip"}]}},"commit_sha":"35b6470831efd300ec345b1542a8c88b944f453c","profile":{"lines_by_language":{"Python":11653},"files_by_category":{"binary":9,"source":5,"config":2,"docs":2,"oversized":1,"other":1},"source_lines":11653,"test_lines":0},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.48,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":null},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":31.4,"confidence":0.9,"coverage":1.0,"label":"poor","breakdown":{"complexity":31.3,"duplication":77.8,"lint":12.2,"testing":0.0,"docs":65.0,"type_safety":40.0,"process":null},"summary":"Code quality is poor: test-to-source ratio 0.00, no CI test run detected; 39% of function code in complex or long functions; 4% duplicated lines. Weakest area: testing."},"security":{"score":74.6,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":100.0,"sast":80.2,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is adequate: 8 high-severity SAST 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":30.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":12198.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2026-05":{"loc":8330,"attributed_loc":0},"2026-07":{"loc":600,"attributed_loc":0},"2026-08":{"loc":2464,"attributed_loc":0},"2026-09":{"loc":804,"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":19.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":6753.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":456.0,"median_loc_per_hour":118.5,"pr_timed_units":0.0,"excluded_import_loc":5445.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["d1506b89bed80dc8775bb85786324799fefca481"]},"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":11653.0,"index":6.994,"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":163.0,"per_kloc:emoji_in_code":13.988,"files:emoji_in_code":5.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":10.0,"findings_high":8.0,"findings_medium":0.0,"findings_low":2.0,"weighted_findings":7.35,"scanned_lines":11653.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":1509,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:1509"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":4491,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:4491"},{"rule_id":"opengrep/python.lang.security.audit.subprocess-shell-true","severity":"high","message":"Found 'subprocess' function 'run' with 'shell=True'. This is dangerous because this call will spawn the command using a shell process. Doing so propagates current shell settings and variables, which makes it much easier for a malicious actor to execute commands. Use 'shell=False' instead. [confidence medium]","path":"llamastation.py","line":4492,"fingerprint":"python.lang.security.audit.subprocess-shell-true:llamastation.py:4492"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'Popen' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":6302,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:6302"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'Popen' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":6327,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:6327"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":6803,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:6803"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":6847,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:6847"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'Popen' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"llamastation.py","line":7872,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:llamastation.py:7872"},{"rule_id":"opengrep/python.lang.security.audit.insecure-transport.requests.request-with-http","severity":"low","message":"Detected a request using 'http://'. This request will be unencrypted, and attackers could listen into traffic on the network and be able to obtain sensitive information. Use 'https://' instead. [confidence medium]","path":"llamastation_telegram.py","line":416,"fingerprint":"python.lang.security.audit.insecure-transport.requests.request-with-http:llamastation_telegram.py:416"},{"rule_id":"opengrep/python.lang.security.audit.insecure-transport.requests.request-with-http","severity":"low","message":"Detected a request using 'http://'. This request will be unencrypted, and attackers could listen into traffic on the network and be able to obtain sensitive information. Use 'https://' instead. [confidence medium]","path":"llamastation_voice.py","line":999,"fingerprint":"python.lang.security.audit.insecure-transport.requests.request-with-http:llamastation_voice.py:999"}],"evidence":[],"data":{"rulesets":["python"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"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":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":1.0,"binary_assets":1.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v0.9 ships LlamaStation-v0.9-windows.zip (332 downloads)","ref":"LlamaStation-v0.9-windows.zip","url":"https://github.com/vico-png/llamastation/releases/download/v0.9/LlamaStation-v0.9-windows.zip","weight":0.0}],"data":{"signals":["binary-release-assets"],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":387.0,"function_nloc":8534.0,"mean_ccn":4.88,"p90_ccn":10.0,"complex_functions":19.0,"long_functions":13.0,"many_param_functions":4.0,"risky_nloc_share":0.3867},"findings":[],"evidence":[{"kind":"complex-function","description":"_api in llamastation.py: complexity 112, 675 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L4558","weight":1.0},{"kind":"complex-function","description":"_handle_message in llamastation_telegram.py: complexity 89, 236 lines","ref":"llamastation_telegram.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation_telegram.py#L292","weight":1.0},{"kind":"complex-function","description":"_build_cmd_list in llamastation.py: complexity 52, 125 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L5531","weight":0.8666666666666667},{"kind":"complex-function","description":"_run_headless in llamastation.py: complexity 41, 110 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L7734","weight":0.6833333333333333},{"kind":"complex-function","description":"_web_search in llamastation.py: complexity 30, 75 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L3989","weight":0.5},{"kind":"complex-function","description":"_install_thread in llamastation.py: complexity 29, 86 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L1610","weight":0.48333333333333334},{"kind":"complex-function","description":"_handle_command in llamastation_telegram.py: complexity 25, 78 lines","ref":"llamastation_telegram.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation_telegram.py#L177","weight":0.4166666666666667},{"kind":"complex-function","description":"_send in llamastation.py: complexity 22, 82 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L3791","weight":0.36666666666666664},{"kind":"complex-function","description":"_build_chat in llamastation.py: complexity 22, 198 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L3130","weight":0.36666666666666664},{"kind":"complex-function","description":"_srv_exit in llamastation.py: complexity 20, 72 lines","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L6517","weight":0.3333333333333333}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":10002.0,"duplicated_lines":418.0,"duplicated_share":0.0418,"files":5.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: llamastation.py:2430 and llamastation.py:6381","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L2430","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: llamastation.py:4575 and llamastation_telegram.py:41","ref":"llamastation.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation.py#L4575","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: llamastation_i18n.py:44 and llamastation_i18n.py:324","ref":"llamastation_i18n.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation_i18n.py#L44","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: llamastation_voice.py:1252 and llamastation_voice.py:1293","ref":"llamastation_voice.py","url":"https://github.com/vico-png/llamastation/blob/35b6470831efd300ec345b1542a8c88b944f453c/llamastation_voice.py#L1252","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":50.0,"weighted_findings":98.0,"scanned_lines":11653.0,"category:best-practice":36.0,"category:correctness":13.0,"category:maintainability":1.0},"findings":[{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation.py","line":332,"fingerprint":"python.lang.correctness.return-in-init:llamastation.py:332"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation.py","line":339,"fingerprint":"python.lang.correctness.return-in-init:llamastation.py:339"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation.py","line":343,"fingerprint":"python.lang.correctness.return-in-init:llamastation.py:343"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation.py","line":361,"fingerprint":"python.lang.correctness.return-in-init:llamastation.py:361"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation.py","line":362,"fingerprint":"python.lang.correctness.return-in-init:llamastation.py:362"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation.py","line":363,"fingerprint":"python.lang.correctness.return-in-init:llamastation.py:363"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation.py","line":3476,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation.py:3476"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation.py","line":3479,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation.py:3479"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation.py","line":3984,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation.py:3984"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation.py","line":4892,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation.py:4892"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation.py","line":6447,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation.py:6447"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation.py","line":6458,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation.py:6458"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation_telegram.py","line":95,"fingerprint":"python.lang.correctness.return-in-init:llamastation_telegram.py:95"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation_telegram.py","line":96,"fingerprint":"python.lang.correctness.return-in-init:llamastation_telegram.py:96"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation_telegram.py","line":98,"fingerprint":"python.lang.correctness.return-in-init:llamastation_telegram.py:98"},{"rule_id":"opengrep/python.lang.correctness.return-in-init","severity":"high","message":"`return` should never appear inside a class __init__ function. This will cause a runtime error.","path":"llamastation_telegram.py","line":99,"fingerprint":"python.lang.correctness.return-in-init:llamastation_telegram.py:99"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation_telegram.py","line":144,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation_telegram.py:144"},{"rule_id":"opengrep/python.lang.correctness.tempfile.tempfile-without-flush","severity":"high","message":"Using 'f.name' without '.flush()' or '.close()' may cause an error because the file may not exist when 'f.name' is used. Use '.flush()' or close the file before using 'f.name'.","path":"llamastation_voice.py","line":117,"fingerprint":"python.lang.correctness.tempfile.tempfile-without-flush:llamastation_voice.py:117"},{"rule_id":"opengrep/python.lang.correctness.tempfile.tempfile-without-flush","severity":"high","message":"Using 'f.name' without '.flush()' or '.close()' may cause an error because the file may not exist when 'f.name' is used. Use '.flush()' or close the file before using 'f.name'.","path":"llamastation_voice.py","line":211,"fingerprint":"python.lang.correctness.tempfile.tempfile-without-flush:llamastation_voice.py:211"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation_voice.py","line":233,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation_voice.py:233"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation_voice.py","line":894,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation_voice.py:894"},{"rule_id":"opengrep/python.lang.correctness.tempfile.tempfile-without-flush","severity":"high","message":"Using 'tmp.name' without '.flush()' or '.close()' may cause an error because the file may not exist when 'tmp.name' is used. Use '.flush()' or close the file before using 'tmp.name'.","path":"llamastation_voice.py","line":1191,"fingerprint":"python.lang.correctness.tempfile.tempfile-without-flush:llamastation_voice.py:1191"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation_voice.py","line":1332,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation_voice.py:1332"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"llamastation_voice.py","line":1342,"fingerprint":"python.lang.best-practice.arbitrary-sleep:llamastation_voice.py:1342"},{"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":"llamastation.py","line":182,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:182"},{"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":"llamastation.py","line":187,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:187"},{"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":"llamastation.py","line":222,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:222"},{"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":"llamastation.py","line":228,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:228"},{"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":"llamastation.py","line":243,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:243"},{"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":"llamastation.py","line":260,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:260"},{"rule_id":"opengrep/python.lang.maintainability.useless-if-body","severity":"medium","message":"Useless if statement; both blocks have the same body","path":"llamastation.py","line":1130,"fingerprint":"python.lang.maintainability.useless-if-body:llamastation.py:1130"},{"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":"llamastation.py","line":1572,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:1572"},{"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":"llamastation.py","line":1692,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:1692"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":1719,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:1719"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":2209,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:2209"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":2230,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:2230"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":4040,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:4040"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":4060,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:4060"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":4877,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:4877"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":6065,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:6065"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":6069,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:6069"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":6452,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:6452"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":6462,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:6462"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":6730,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:6730"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation.py","line":6746,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation.py:6746"},{"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":"llamastation.py","line":6820,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:llamastation.py:6820"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation_telegram.py","line":126,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation_telegram.py:126"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation_telegram.py","line":138,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation_telegram.py:138"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation_telegram.py","line":156,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation_telegram.py:156"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"llamastation_telegram.py","line":416,"fingerprint":"python.requests.best-practice.use-raise-for-status:llamastation_telegram.py:416"}],"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":11653.0,"test_ratio":0.0,"ci_files":0.0,"cochange_share":0.0,"cochange_commits":20.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":1.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":266.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","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":1.0,"escapes_per_kloc":0.086},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}