{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:56:16.089068Z","repo":{"ref":{"host":"github.com","owner":"ajay-sainy","name":"GemOfGemma"},"default_branch":"master","clone_url":"https://github.com/ajay-sainy/GemOfGemma.git","html_url":"https://github.com/ajay-sainy/GemOfGemma","description":"On-device AI assistant powered by Gemma 4. Chat, see, and control your phone — entirely offline. Vibe coded with GitHub Copilot.","stars":17,"forks":2,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":2976,"primary_language":"Kotlin","license_spdx":"Apache-2.0","created_at":"2026-04-20T07:05:51Z","pushed_at":"2026-05-08T06:34:54Z","security_policy_url":null,"distribution":{"owner_created_at":"2015-06-05T13:47:34Z","owner_type":"User","release_assets":[{"name":"GemOfGemma-1.0.3-arm64-v8a.apk","size":28655373,"download_count":389,"release_tag":"v1.0.3","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-arm64-v8a.apk"},{"name":"GemOfGemma-1.0.3-armeabi-v7a.apk","size":5404856,"download_count":48,"release_tag":"v1.0.3","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-armeabi-v7a.apk"},{"name":"GemOfGemma-1.0.3-universal.apk","size":57951314,"download_count":91,"release_tag":"v1.0.3","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-universal.apk"},{"name":"GemOfGemma-1.0.3-x86_64.apk","size":34439000,"download_count":14,"release_tag":"v1.0.3","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-x86_64.apk"},{"name":"GemOfGemma-1.0.2-arm64-v8a.apk","size":28638989,"download_count":4,"release_tag":"v1.0.2","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.2/GemOfGemma-1.0.2-arm64-v8a.apk"},{"name":"GemOfGemma-1.0.2-armeabi-v7a.apk","size":5388472,"download_count":1,"release_tag":"v1.0.2","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.2/GemOfGemma-1.0.2-armeabi-v7a.apk"},{"name":"GemOfGemma-1.0.2-universal.apk","size":57934930,"download_count":1,"release_tag":"v1.0.2","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.2/GemOfGemma-1.0.2-universal.apk"},{"name":"GemOfGemma-1.0.2-x86_64.apk","size":34422616,"download_count":0,"release_tag":"v1.0.2","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.2/GemOfGemma-1.0.2-x86_64.apk"},{"name":"GemOfGemma-1.0.1-arm64-v8a.apk","size":28638985,"download_count":6,"release_tag":"v1.0.1","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.1/GemOfGemma-1.0.1-arm64-v8a.apk"},{"name":"GemOfGemma-1.0.1-armeabi-v7a.apk","size":5388468,"download_count":1,"release_tag":"v1.0.1","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.1/GemOfGemma-1.0.1-armeabi-v7a.apk"},{"name":"GemOfGemma-1.0.1-universal.apk","size":57934926,"download_count":2,"release_tag":"v1.0.1","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.1/GemOfGemma-1.0.1-universal.apk"},{"name":"GemOfGemma-1.0.1-x86_64.apk","size":34422612,"download_count":1,"release_tag":"v1.0.1","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.1/GemOfGemma-1.0.1-x86_64.apk"},{"name":"GemOfGemma-1.0.0-arm64-v8a.apk","size":26132074,"download_count":7,"release_tag":"v1.0.0","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.0/GemOfGemma-1.0.0-arm64-v8a.apk"},{"name":"GemOfGemma-1.0.0-armeabi-v7a.apk","size":5388468,"download_count":1,"release_tag":"v1.0.0","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.0/GemOfGemma-1.0.0-armeabi-v7a.apk"},{"name":"GemOfGemma-1.0.0-universal.apk","size":50873110,"download_count":1,"release_tag":"v1.0.0","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.0/GemOfGemma-1.0.0-universal.apk"},{"name":"GemOfGemma-1.0.0-x86_64.apk","size":29867707,"download_count":1,"release_tag":"v1.0.0","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.0/GemOfGemma-1.0.0-x86_64.apk"}]}},"commit_sha":"e1c006e637972bc5780ffd1ee46da1184dd73c39","profile":{"lines_by_language":{"Kotlin":9117,"JavaScript":543,"PowerShell":222,"Shell":208},"files_by_category":{"docs":124,"source":90,"config":43,"other":8,"binary":4,"oversized":2},"source_lines":10090,"test_lines":0},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.43,"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":0.0},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":52.8,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":63.8,"duplication":46.9,"lint":98.7,"testing":15.0,"docs":65.0,"type_safety":null,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, no CI test run detected; 15% of function code in complex or long functions; 13% duplicated lines. Weakest area: testing."},"security":{"score":63.1,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":93.6,"sast":100.0,"dependencies":null,"ci_actions":5.2,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 15 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":"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":12.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":10135.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2026-04":{"loc":9870,"attributed_loc":0},"2026-05":{"loc":265,"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":3.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":265.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":52.5,"median_loc_per_hour":52.5,"pr_timed_units":0.0,"excluded_import_loc":9870.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["588c986783e7cdcdafc1f5dd9fb20997fccc2182"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":3.0,"flagged_releases":0.0,"max_loc_per_day":561.2},"findings":[],"evidence":[],"data":{"releases":[{"from":"v1.0.0","to":"v1.0.1","loc":0,"days":0.13,"loc_per_day":0.0,"flagged":false},{"from":"v1.0.1","to":"v1.0.2","loc":9,"days":0.04,"loc_per_day":216.0,"flagged":false},{"from":"v1.0.2","to":"v1.0.3","loc":210,"days":0.37,"loc_per_day":561.2,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":10090.0,"index":1.041,"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":21.0,"per_kloc:emoji_in_code":2.081,"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":2.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/private-key","severity":"low","message":"Possible private-key secret in the current tree (test/docs/example file)","path":".squad/templates/skills/secret-handling/SKILL.md","line":48,"fingerprint":".squad/templates/skills/secret-handling/SKILL.md:private-key:48"},{"rule_id":"gitleaks/private-key","severity":"low","message":"Possible private-key secret in the current tree (test/docs/example file)","path":".copilot/skills/secret-handling/SKILL.md","line":48,"fingerprint":".copilot/skills/secret-handling/SKILL.md:private-key:48"}],"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":9868.0,"parse_errors":1.0},"findings":[],"evidence":[],"data":{"rulesets":["kotlin","javascript","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":5.0,"findings":21.0,"findings_high":15.0,"findings_medium":5.0,"findings_low":1.0,"penalty":177.6},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":18,"fingerprint":"unpinned-uses:.github/workflows/release.yml:18"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/release.yml:21"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":27,"fingerprint":"unpinned-uses:.github/workflows/release.yml:27"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":123,"fingerprint":"unpinned-uses:.github/workflows/release.yml:123"},{"rule_id":"zizmor/cache-poisoning","severity":"high","message":"runtime artifacts potentially vulnerable to a cache poisoning attack [confidence low]","path":".github/workflows/release.yml","line":27,"fingerprint":"cache-poisoning:.github/workflows/release.yml:27"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-heartbeat.yml","line":32,"fingerprint":"unpinned-uses:.github/workflows/squad-heartbeat.yml:32"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-heartbeat.yml","line":55,"fingerprint":"unpinned-uses:.github/workflows/squad-heartbeat.yml:55"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-heartbeat.yml","line":107,"fingerprint":"unpinned-uses:.github/workflows/squad-heartbeat.yml:107"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-issue-assign.yml","line":17,"fingerprint":"unpinned-uses:.github/workflows/squad-issue-assign.yml:17"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-issue-assign.yml","line":20,"fingerprint":"unpinned-uses:.github/workflows/squad-issue-assign.yml:20"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-issue-assign.yml","line":119,"fingerprint":"unpinned-uses:.github/workflows/squad-issue-assign.yml:119"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-triage.yml","line":16,"fingerprint":"unpinned-uses:.github/workflows/squad-triage.yml:16"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/squad-triage.yml","line":19,"fingerprint":"unpinned-uses:.github/workflows/squad-triage.yml:19"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/sync-squad-labels.yml","line":18,"fingerprint":"unpinned-uses:.github/workflows/sync-squad-labels.yml:18"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/sync-squad-labels.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/sync-squad-labels.yml:21"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":17,"fingerprint":"artipacked:.github/workflows/release.yml:17"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/squad-heartbeat.yml","line":32,"fingerprint":"artipacked:.github/workflows/squad-heartbeat.yml:32"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/squad-issue-assign.yml","line":17,"fingerprint":"artipacked:.github/workflows/squad-issue-assign.yml:17"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/squad-triage.yml","line":16,"fingerprint":"artipacked:.github/workflows/squad-triage.yml:16"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/sync-squad-labels.yml","line":18,"fingerprint":"artipacked:.github/workflows/sync-squad-labels.yml:18"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release.yml","line":123,"fingerprint":"superfluous-actions:.github/workflows/release.yml:123"}],"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":0.0,"signed_commit_share":0.0,"unpinned_manifests":1.0},"findings":[],"evidence":[{"kind":"posture","description":".squad/templates/package.json has no lockfile alongside it (unpinned dependencies)","ref":".squad/templates/package.json","url":null,"weight":0.3}],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":1.0,"binary_assets":16.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v1.0.3 ships GemOfGemma-1.0.3-arm64-v8a.apk (389 downloads)","ref":"GemOfGemma-1.0.3-arm64-v8a.apk","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-arm64-v8a.apk","weight":0.0},{"kind":"binary-release-asset","description":"release v1.0.3 ships GemOfGemma-1.0.3-armeabi-v7a.apk (48 downloads)","ref":"GemOfGemma-1.0.3-armeabi-v7a.apk","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-armeabi-v7a.apk","weight":0.0},{"kind":"binary-release-asset","description":"release v1.0.3 ships GemOfGemma-1.0.3-universal.apk (91 downloads)","ref":"GemOfGemma-1.0.3-universal.apk","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-universal.apk","weight":0.0},{"kind":"binary-release-asset","description":"release v1.0.3 ships GemOfGemma-1.0.3-x86_64.apk (14 downloads)","ref":"GemOfGemma-1.0.3-x86_64.apk","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.3/GemOfGemma-1.0.3-x86_64.apk","weight":0.0},{"kind":"binary-release-asset","description":"release v1.0.2 ships GemOfGemma-1.0.2-arm64-v8a.apk (4 downloads)","ref":"GemOfGemma-1.0.2-arm64-v8a.apk","url":"https://github.com/ajay-sainy/GemOfGemma/releases/download/v1.0.2/GemOfGemma-1.0.2-arm64-v8a.apk","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":348.0,"function_nloc":4842.0,"mean_ccn":2.69,"p90_ccn":6.0,"complex_functions":5.0,"long_functions":4.0,"many_param_functions":1.0,"risky_nloc_share":0.1499},"findings":[],"evidence":[{"kind":"complex-function","description":"executeAction in actions/src/main/java/com/gemofgemma/actions/ActionDispatcher.kt: complexity 24, 35 lines","ref":"actions/src/main/java/com/gemofgemma/actions/ActionDispatcher.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/actions/src/main/java/com/gemofgemma/actions/ActionDispatcher.kt#L111","weight":0.4},{"kind":"complex-function","description":"ChatBubble in ui/src/main/java/com/gemofgemma/ui/chat/ChatScreen.kt: complexity 24, 105 lines","ref":"ui/src/main/java/com/gemofgemma/ui/chat/ChatScreen.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ui/src/main/java/com/gemofgemma/ui/chat/ChatScreen.kt#L582","weight":0.4},{"kind":"complex-function","description":"getToolIdForFunction in actions/src/main/java/com/gemofgemma/actions/ActionDispatcher.kt: complexity 22, 26 lines","ref":"actions/src/main/java/com/gemofgemma/actions/ActionDispatcher.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/actions/src/main/java/com/gemofgemma/actions/ActionDispatcher.kt#L84","weight":0.36666666666666664},{"kind":"complex-function","description":"findRoleKeywordMatch in .squad/templates/ralph-triage.js: complexity 18, 24 lines","ref":".squad/templates/ralph-triage.js","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/.squad/templates/ralph-triage.js#L357","weight":0.3},{"kind":"complex-function","description":"downloadModel in ai/src/main/java/com/gemofgemma/ai/model/ModelDownloadManager.kt: complexity 17, 68 lines","ref":"ai/src/main/java/com/gemofgemma/ai/model/ModelDownloadManager.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ai/src/main/java/com/gemofgemma/ai/model/ModelDownloadManager.kt#L60","weight":0.2833333333333333},{"kind":"complex-function","description":"ModelPage in ui/src/main/java/com/gemofgemma/ui/onboarding/OnboardingScreen.kt: complexity 14, 223 lines","ref":"ui/src/main/java/com/gemofgemma/ui/onboarding/OnboardingScreen.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ui/src/main/java/com/gemofgemma/ui/onboarding/OnboardingScreen.kt#L365","weight":0.23333333333333334},{"kind":"complex-function","description":"sendMessage in ui/src/main/java/com/gemofgemma/ui/chat/ChatViewModel.kt: complexity 13, 133 lines","ref":"ui/src/main/java/com/gemofgemma/ui/chat/ChatViewModel.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ui/src/main/java/com/gemofgemma/ui/chat/ChatViewModel.kt#L192","weight":0.21666666666666667},{"kind":"complex-function","description":"ChatInputBar in ui/src/main/java/com/gemofgemma/ui/chat/ChatScreen.kt: complexity 10, 112 lines","ref":"ui/src/main/java/com/gemofgemma/ui/chat/ChatScreen.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ui/src/main/java/com/gemofgemma/ui/chat/ChatScreen.kt#L987","weight":0.16666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":6369.0,"duplicated_lines":803.0,"duplicated_share":0.1261,"files":90.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: .copilot/skills/distributed-mesh/sync-mesh.ps1:1 and .squad/templates/skills/distributed-mesh/sync-mesh.ps1:1","ref":".copilot/skills/distributed-mesh/sync-mesh.ps1","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/.copilot/skills/distributed-mesh/sync-mesh.ps1#L1","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: .copilot/skills/distributed-mesh/sync-mesh.sh:1 and .squad/templates/skills/distributed-mesh/sync-mesh.sh:1","ref":".copilot/skills/distributed-mesh/sync-mesh.sh","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/.copilot/skills/distributed-mesh/sync-mesh.sh#L1","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: accessibility/build.gradle.kts:8 and actions/build.gradle.kts:10","ref":"accessibility/build.gradle.kts","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/accessibility/build.gradle.kts#L8","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: accessibility/build.gradle.kts:20 and camera/build.gradle.kts:22","ref":"accessibility/build.gradle.kts","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/accessibility/build.gradle.kts#L20","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: actions/build.gradle.kts:1 and camera/build.gradle.kts:1","ref":"actions/build.gradle.kts","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/actions/build.gradle.kts#L1","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: ai/src/main/java/com/gemofgemma/ai/GemmaEngine.kt:115 and ai/src/main/java/com/gemofgemma/ai/GemmaEngine.kt:136","ref":"ai/src/main/java/com/gemofgemma/ai/GemmaEngine.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ai/src/main/java/com/gemofgemma/ai/GemmaEngine.kt#L115","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: ai/src/main/java/com/gemofgemma/ai/GemmaService.kt:162 and ai/src/main/java/com/gemofgemma/ai/GemmaService.kt:249","ref":"ai/src/main/java/com/gemofgemma/ai/GemmaService.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ai/src/main/java/com/gemofgemma/ai/GemmaService.kt#L162","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: app/build.gradle.kts:85 and ui/build.gradle.kts:63","ref":"app/build.gradle.kts","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/app/build.gradle.kts#L85","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: camera/build.gradle.kts:39 and voice/build.gradle.kts:33","ref":"camera/build.gradle.kts","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/camera/build.gradle.kts#L39","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: ui/src/main/java/com/gemofgemma/ui/camera/BoundingBoxOverlay.kt:92 and ui/src/main/java/com/gemofgemma/ui/camera/OcrTextOverlay.kt:54","ref":"ui/src/main/java/com/gemofgemma/ui/camera/BoundingBoxOverlay.kt","url":"https://github.com/ajay-sainy/GemOfGemma/blob/e1c006e637972bc5780ffd1ee46da1184dd73c39/ui/src/main/java/com/gemofgemma/ui/camera/BoundingBoxOverlay.kt#L92","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":2.0,"weighted_findings":0.5,"scanned_lines":9868.0,"category:correctness":2.0},"findings":[{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":".copilot/skills/distributed-mesh/sync-mesh.sh","line":100,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:.copilot/skills/distributed-mesh/sync-mesh.sh:100"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":".squad/templates/skills/distributed-mesh/sync-mesh.sh","line":100,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:.squad/templates/skills/distributed-mesh/sync-mesh.sh:100"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":0.0,"check:test_ratio":0.0,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":10090.0,"test_ratio":0.0,"ci_files":5.0,"cochange_share":0.0,"cochange_commits":4.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/release.yml","ref":".github/workflows/release.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/squad-heartbeat.yml","ref":".github/workflows/squad-heartbeat.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/squad-issue-assign.yml","ref":".github/workflows/squad-issue-assign.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/squad-triage.yml","ref":".github/workflows/squad-triage.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/sync-squad-labels.yml","ref":".github/workflows/sync-squad-labels.yml","url":null,"weight":0.0}],"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":46.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":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}