{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:27:00.116430Z","repo":{"ref":{"host":"github.com","owner":"watabou","name":"pixel-dungeon"},"default_branch":"master","clone_url":"https://github.com/watabou/pixel-dungeon.git","html_url":"https://github.com/watabou/pixel-dungeon","description":"Traditional roguelike game with pixel-art graphics and simple interface","stars":3998,"forks":1288,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":8161,"primary_language":"Java","license_spdx":"GPL-3.0","created_at":"2014-07-26T17:34:32Z","pushed_at":"2019-07-23T09:09:27Z","security_policy_url":null,"distribution":{"owner_created_at":"2011-02-01T12:55:34Z","owner_type":"User","release_assets":[]}},"commit_sha":"ca458a28f053612973d5d6059dae5f6f2ca4fcb7","profile":{"lines_by_language":{"Java":60846},"files_by_category":{"source":505,"binary":136,"config":3,"docs":2},"source_lines":60846,"test_lines":0},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.45,"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":43.9,"confidence":0.9,"coverage":1.0,"label":"poor","breakdown":{"complexity":75.7,"duplication":21.9,"lint":96.0,"testing":0.0,"docs":45.0,"type_safety":null,"process":null},"summary":"Code quality is poor: test-to-source ratio 0.00, no CI test run detected; 9% of function code in complex or long functions; 25% duplicated lines. Weakest area: testing."},"security":{"score":80.1,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":96.7,"sast":99.4,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is adequate: 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":21.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":64569.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2014-07":{"loc":55891,"attributed_loc":0},"2014-10":{"loc":2479,"attributed_loc":0},"2015-01":{"loc":3694,"attributed_loc":0},"2015-02":{"loc":1,"attributed_loc":0},"2015-10":{"loc":2504,"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":7.0,"flagged_units":0.0,"pre_ai_era_bursts":2.0,"pre_ai_era_measured_loc":8684.0,"pre_ai_era_burst_loc":6145.0,"measured_loc":8684.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":910.25,"median_loc_per_hour":562.625,"pr_timed_units":0.0,"excluded_import_loc":55885.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["842286d307c91c9ad1cefd638497d4dc0c2a009d"]},"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":60846.0,"index":0.0,"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":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.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":1.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"src/com/watabou/pixeldungeon/Assets.java","line":162,"fingerprint":"src/com/watabou/pixeldungeon/Assets.java:generic-api-key:162"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":3.0,"findings_high":0.0,"findings_medium":3.0,"findings_low":0.0,"weighted_findings":1.1,"scanned_lines":60846.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/java.android.security.exported_activity","severity":"medium","message":"The application exports an activity. Any application on the device can launch the exported activity which may compromise the integrity of your application or its data.  Ensure that any exported activities do not have privileged access to your application's control plane. [confidence medium]","path":"AndroidManifest.xml","line":29,"fingerprint":"java.android.security.exported_activity:AndroidManifest.xml:29"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"src/com/watabou/pixeldungeon/ui/QuickSlot.java","line":290,"fingerprint":"java.lang.security.audit.unsafe-reflection:src/com/watabou/pixeldungeon/ui/QuickSlot.java:290"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"src/com/watabou/pixeldungeon/ui/QuickSlot.java","line":298,"fingerprint":"java.lang.security.audit.unsafe-reflection:src/com/watabou/pixeldungeon/ui/QuickSlot.java:298"}],"evidence":[],"data":{"rulesets":["java"]},"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":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":3292.0,"function_nloc":27976.0,"mean_ccn":2.37,"p90_ccn":5.0,"complex_functions":35.0,"long_functions":5.0,"many_param_functions":0.0,"risky_nloc_share":0.0927},"findings":[],"evidence":[{"kind":"complex-function","description":"State::highlight in src/com/watabou/pixeldungeon/effects/BadgeBanner.java: complexity 64, 148 lines","ref":"src/com/watabou/pixeldungeon/effects/BadgeBanner.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/effects/BadgeBanner.java#L119","weight":1.0},{"kind":"complex-function","description":"Feeling::tileName in src/com/watabou/pixeldungeon/levels/Level.java: complexity 46, 85 lines","ref":"src/com/watabou/pixeldungeon/levels/Level.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/levels/Level.java#L887","weight":0.7666666666666667},{"kind":"complex-function","description":"CavesLevel::decorate in src/com/watabou/pixeldungeon/levels/CavesLevel.java: complexity 43, 95 lines","ref":"src/com/watabou/pixeldungeon/levels/CavesLevel.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/levels/CavesLevel.java#L69","weight":0.7166666666666667},{"kind":"complex-function","description":"Speck::update in src/com/watabou/pixeldungeon/effects/Speck.java: complexity 42, 83 lines","ref":"src/com/watabou/pixeldungeon/effects/Speck.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/effects/Speck.java#L304","weight":0.7},{"kind":"complex-function","description":"Speck::reset in src/com/watabou/pixeldungeon/effects/Speck.java: complexity 40, 187 lines","ref":"src/com/watabou/pixeldungeon/effects/Speck.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/effects/Speck.java#L83","weight":0.6666666666666666},{"kind":"complex-function","description":"Badge::validateBossSlain in src/com/watabou/pixeldungeon/Badges.java: complexity 36, 103 lines","ref":"src/com/watabou/pixeldungeon/Badges.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/Badges.java#L574","weight":0.6},{"kind":"complex-function","description":"ItemButton::item in src/com/watabou/pixeldungeon/windows/WndBag.java: complexity 35, 43 lines","ref":"src/com/watabou/pixeldungeon/windows/WndBag.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/windows/WndBag.java#L354","weight":0.5833333333333334},{"kind":"complex-function","description":"GameScene::create in src/com/watabou/pixeldungeon/scenes/GameScene.java: complexity 30, 168 lines","ref":"src/com/watabou/pixeldungeon/scenes/GameScene.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/scenes/GameScene.java#L118","weight":0.5},{"kind":"complex-function","description":"Dungeon::newLevel in src/com/watabou/pixeldungeon/Dungeon.java: complexity 29, 73 lines","ref":"src/com/watabou/pixeldungeon/Dungeon.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/Dungeon.java#L149","weight":0.48333333333333334},{"kind":"complex-function","description":"Icons::get in src/com/watabou/pixeldungeon/ui/Icons.java: complexity 29, 90 lines","ref":"src/com/watabou/pixeldungeon/ui/Icons.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/ui/Icons.java#L59","weight":0.48333333333333334}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":34946.0,"duplicated_lines":8852.0,"duplicated_share":0.2533,"files":505.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/Assets.java:2 and src/com/watabou/pixeldungeon/Badges.java:2","ref":"src/com/watabou/pixeldungeon/Assets.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/Assets.java#L2","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/Dungeon.java:625 and src/com/watabou/pixeldungeon/Dungeon.java:646","ref":"src/com/watabou/pixeldungeon/Dungeon.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/Dungeon.java#L625","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java:30 and src/com/watabou/pixeldungeon/actors/blobs/SacrificialFire.java:49","ref":"src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java#L30","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java:38 and src/com/watabou/pixeldungeon/actors/blobs/WellWater.java:42","ref":"src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java#L38","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/blobs/ConfusionGas.java:29 and src/com/watabou/pixeldungeon/actors/blobs/ParalyticGas.java:29","ref":"src/com/watabou/pixeldungeon/actors/blobs/ConfusionGas.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/blobs/ConfusionGas.java#L29","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java:34 and src/com/watabou/pixeldungeon/actors/buffs/Hunger.java:45","ref":"src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java#L34","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java:38 and src/com/watabou/pixeldungeon/actors/mobs/Wraith.java:55","ref":"src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java#L38","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/buffs/Burning.java:52 and src/com/watabou/pixeldungeon/actors/buffs/Poison.java:35","ref":"src/com/watabou/pixeldungeon/actors/buffs/Burning.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/buffs/Burning.java#L52","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/buffs/Charm.java:27 and src/com/watabou/pixeldungeon/actors/buffs/SnipersMark.java:25","ref":"src/com/watabou/pixeldungeon/actors/buffs/Charm.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/buffs/Charm.java#L27","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/com/watabou/pixeldungeon/actors/buffs/Frost.java:53 and src/com/watabou/pixeldungeon/actors/buffs/Paralysis.java:32","ref":"src/com/watabou/pixeldungeon/actors/buffs/Frost.java","url":"https://github.com/watabou/pixel-dungeon/blob/ca458a28f053612973d5d6059dae5f6f2ca4fcb7/src/com/watabou/pixeldungeon/actors/buffs/Frost.java#L53","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":10.0,"weighted_findings":10.0,"scanned_lines":60846.0,"category:correctness":10.0},"findings":[{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/Amulet.java","line":51,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/Amulet.java:51"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/ArmorKit.java","line":59,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/ArmorKit.java:59"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/LloydsBeacon.java","line":101,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/LloydsBeacon.java:101"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/LloydsBeacon.java","line":101,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/LloydsBeacon.java:101"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/LloydsBeacon.java","line":117,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/LloydsBeacon.java:117"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/LloydsBeacon.java","line":130,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/LloydsBeacon.java:130"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/Torch.java","line":54,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/Torch.java:54"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/Weightstone.java","line":63,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/Weightstone.java:63"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/quest/Pickaxe.java","line":85,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/quest/Pickaxe.java:85"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"src/com/watabou/pixeldungeon/items/weapon/melee/ShortSword.java","line":76,"fingerprint":"java.lang.correctness.no-string-eqeq:src/com/watabou/pixeldungeon/items/weapon/melee/ShortSword.java:76"}],"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":60846.0,"test_ratio":0.0,"ci_files":0.0,"cochange_share":0.0,"cochange_commits":12.0},"findings":[],"evidence":[],"data":{"test_commands":[],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":0.5,"check:license":1.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":11.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE.txt","ref":"LICENSE.txt","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}],"flags":[]}