{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:06.263595Z","repo":{"ref":{"host":"github.com","owner":"marwatk","name":"elite-dangerous-bindings"},"default_branch":"main","clone_url":"https://github.com/marwatk/elite-dangerous-bindings.git","html_url":"https://github.com/marwatk/elite-dangerous-bindings","description":"Web-based Elite: Dangerous Keybindings Editor","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":7341,"primary_language":"TypeScript","license_spdx":"NOASSERTION","created_at":"2026-09-27T04:26:07Z","pushed_at":"2026-09-27T23:21:50Z","security_policy_url":null,"distribution":{"owner_created_at":"2013-02-08T02:12:50Z","owner_type":"User","release_assets":[]}},"commit_sha":"c8259c644aa84f30cfa39f5acfb34d713bb7bfa8","profile":{"lines_by_language":{"TypeScript":24121,"Python":440,"JavaScript":86,"Shell":73},"files_by_category":{"config":110,"source":102,"binary":78,"test":39,"other":29,"docs":5,"generated":1},"source_lines":19527,"test_lines":5193},"pillars":{"ai_provenance":{"score":22.5,"confidence":0.73,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.2254,"suspected_share":0.0,"estimated_share":0.2254,"ai_artifacts":1.0,"flagged_work_units":0.0,"flagged_releases":null,"style_index":0.0},"summary":"Explicit AI attribution on 23% of first-party code added; an estimated 23% including velocity signals."},"quality":{"score":75.4,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":73.4,"duplication":97.5,"lint":69.7,"testing":78.3,"docs":65.0,"type_safety":40.0,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.27, CI runs tests; 10% of function code in complex or long functions; 0% duplicated lines. Weakest area: type safety."},"security":{"score":35.6,"confidence":0.85,"coverage":1.0,"label":"poor","breakdown":{"secrets":23.9,"sast":88.5,"dependencies":27.7,"ci_actions":18.6,"posture":0.0,"scorecard":null},"summary":"Security posture is poor: 37 known vulnerabilities in 10 dependencies; 8 high-severity workflow issues. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":24.0,"checked":24.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":11.0,"attributed_commits":9.0,"attributed_commit_share":0.8181818181818182,"effective_loc":24976.0,"attributed_loc":5629.0,"attributed_loc_share":0.22537636130685457,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 9 attributed commits, 5,629 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c8259c644aa84f30cfa39f5acfb34d713bb7bfa8","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"1ffb7d45ee22c280dfa1d7db91e6ff317697dcc2","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/1ffb7d45ee22c280dfa1d7db91e6ff317697dcc2","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"45d4591c7e2f2976e95653c4e30b25a1ee243d2b","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/45d4591c7e2f2976e95653c4e30b25a1ee243d2b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4875cd58ec1fd7e485e9b881e5008e428efaea49","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/4875cd58ec1fd7e485e9b881e5008e428efaea49","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"18e079c87904f2ef20d4a4ba699ba88a77391e2e","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/18e079c87904f2ef20d4a4ba699ba88a77391e2e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b26a6f85290535b54c6558a74337c7a23c76857b","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/b26a6f85290535b54c6558a74337c7a23c76857b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a698a8a0859be5800f60814033b0787610e20d11","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/a698a8a0859be5800f60814033b0787610e20d11","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"dbf2fd05bb35cd0649770f9dcdcaf7d83998df6e","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/dbf2fd05bb35cd0649770f9dcdcaf7d83998df6e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"77e41a0c3a5a9bfde57af96ecac495ddce7dad5f","url":"https://github.com/marwatk/elite-dangerous-bindings/commit/77e41a0c3a5a9bfde57af96ecac495ddce7dad5f","weight":0.9}],"data":{"attributed_loc_by_commit":{"77e41a0c3a5a9bfde57af96ecac495ddce7dad5f":4057,"a698a8a0859be5800f60814033b0787610e20d11":1285,"dbf2fd05bb35cd0649770f9dcdcaf7d83998df6e":0,"b26a6f85290535b54c6558a74337c7a23c76857b":7,"18e079c87904f2ef20d4a4ba699ba88a77391e2e":82,"4875cd58ec1fd7e485e9b881e5008e428efaea49":31,"1ffb7d45ee22c280dfa1d7db91e6ff317697dcc2":153,"45d4591c7e2f2976e95653c4e30b25a1ee243d2b":0,"c8259c644aa84f30cfa39f5acfb34d713bb7bfa8":14},"tools":{"claude-code":{"name":"Claude Code","commits":9,"loc":5629,"first_seen":1790536062,"last_seen":1790551309}},"monthly":{"2026-09":{"loc":24976,"attributed_loc":5629}}},"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":1790483215.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/CLAUDE.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":"CLAUDE.md","added_at":1790483215}],"workflows":[],"tools":["claude-code"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":2.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":1572.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":331.6068970038681,"median_loc_per_hour":196.09365406420733,"pr_timed_units":0.0,"excluded_import_loc":23404.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["61d4342b7689f291dc65cd4144671e6dfdbd76bf","77e41a0c3a5a9bfde57af96ecac495ddce7dad5f"]},"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":19527.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":4.0,"secrets_low_confidence":39.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/LogitechExtreme3DPro/device.json","line":220,"fingerprint":"devices/LogitechExtreme3DPro/device.json:generic-api-key:220"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/CHProThrottle/device.json","line":286,"fingerprint":"devices/CHProThrottle/device.json:generic-api-key:286"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/EDCD-054C0CE6/device.json","line":127,"fingerprint":"devices/EDCD-054C0CE6/device.json:generic-api-key:127"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/HotasCougar/device.json","line":428,"fingerprint":"devices/HotasCougar/device.json:generic-api-key:428"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/Gladiator/device.json","line":350,"fingerprint":"devices/Gladiator/device.json:generic-api-key:350"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/DS4/device.json","line":223,"fingerprint":"devices/DS4/device.json:generic-api-key:223"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/EDCD-054C0DF2/device.json","line":127,"fingerprint":"devices/EDCD-054C0DF2/device.json:generic-api-key:127"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/LogitechG940/device.json","line":214,"fingerprint":"devices/LogitechG940/device.json:generic-api-key:214"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/SaitekX52/device.json","line":441,"fingerprint":"devices/SaitekX52/device.json:generic-api-key:441"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/Logitech710WirelessGamepad/device.json","line":220,"fingerprint":"devices/Logitech710WirelessGamepad/device.json:generic-api-key:220"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/EDCD-10F57055/device.json","line":85,"fingerprint":"devices/EDCD-10F57055/device.json:generic-api-key:85"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/CobraM5/device.json","line":370,"fingerprint":"devices/CobraM5/device.json:generic-api-key:370"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/SaitekX45/device.json","line":402,"fingerprint":"devices/SaitekX45/device.json:generic-api-key:402"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/EDCD-334400D4/device.json","line":85,"fingerprint":"devices/EDCD-334400D4/device.json:generic-api-key:85"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/TCASidestickLeft/device.json","line":272,"fingerprint":"devices/TCASidestickLeft/device.json:generic-api-key:272"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/TCASidestickRight/device.json","line":272,"fingerprint":"devices/TCASidestickRight/device.json:generic-api-key:272"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/TFlightHOTASX/device.json","line":220,"fingerprint":"devices/TFlightHOTASX/device.json:generic-api-key:220"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/SaitekX55/device.json","line":253,"fingerprint":"devices/SaitekX55/device.json:generic-api-key:253"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/T16000M/device.json","line":272,"fingerprint":"devices/T16000M/device.json:generic-api-key:272"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/T16000MFCS/device.json","line":275,"fingerprint":"devices/T16000MFCS/device.json:generic-api-key:275"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/VKB-Gladiator-NXT-Premium-Left/device.json","line":181,"fingerprint":"devices/VKB-Gladiator-NXT-Premium-Left/device.json:generic-api-key:181"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/VKB-Gladiator-NXT-Premium-Left-OTA/device.json","line":181,"fingerprint":"devices/VKB-Gladiator-NXT-Premium-Left-OTA/device.json:generic-api-key:181"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/TFlightStickX/device.json","line":220,"fingerprint":"devices/TFlightStickX/device.json:generic-api-key:220"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/SaitekX52Pro/device.json","line":441,"fingerprint":"devices/SaitekX52Pro/device.json:generic-api-key:441"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/VKB-Kosmosima-SCG-Left/device.json","line":389,"fingerprint":"devices/VKB-Kosmosima-SCG-Left/device.json:generic-api-key:389"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/LogitechGTWheel/device.json","line":337,"fingerprint":"devices/LogitechGTWheel/device.json:generic-api-key:337"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/EDCD-231D0220/device.json","line":79,"fingerprint":"devices/EDCD-231D0220/device.json:generic-api-key:79"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/CHCombatStick/device.json","line":218,"fingerprint":"devices/CHCombatStick/device.json:generic-api-key:218"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/VKB-Kosmosima-SCG-Right/device.json","line":389,"fingerprint":"devices/VKB-Kosmosima-SCG-Right/device.json:generic-api-key:389"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/VKB-Gladiator-NXT-Premium-Right/device.json","line":181,"fingerprint":"devices/VKB-Gladiator-NXT-Premium-Right/device.json:generic-api-key:181"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/ThrustMasterHOTAS4/device.json","line":227,"fingerprint":"devices/ThrustMasterHOTAS4/device.json:generic-api-key:227"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/SaitekFLY5/device.json","line":253,"fingerprint":"devices/SaitekFLY5/device.json:generic-api-key:253"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/Winwing-Ursa-Minor-Fighter-Left/device.json","line":623,"fingerprint":"devices/Winwing-Ursa-Minor-Fighter-Left/device.json:generic-api-key:623"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/CHFighterStick/device.json","line":304,"fingerprint":"devices/CHFighterStick/device.json:generic-api-key:304"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/adding-a-device.md","line":182,"fingerprint":"docs/adding-a-device.md:generic-api-key:182"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/VKB-Gladiator-NXT-Premium-Right-OTA/device.json","line":181,"fingerprint":"devices/VKB-Gladiator-NXT-Premium-Right-OTA/device.json:generic-api-key:181"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"public/data/generic-device.json","line":138,"fingerprint":"public/data/generic-device.json:generic-api-key:138"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/Winwing-Ursa-Minor-Fighter-Right/device.json","line":688,"fingerprint":"devices/Winwing-Ursa-Minor-Fighter-Right/device.json:generic-api-key:688"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/SaitekX56/device.json","line":267,"fingerprint":"devices/SaitekX56/device.json:generic-api-key:267"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"devices/Warthog/device.json","line":325,"fingerprint":"devices/Warthog/device.json:generic-api-key:325"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"src/app/features/cards/card-render.spec.ts","line":37,"fingerprint":"src/app/features/cards/card-render.spec.ts:generic-api-key:37"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"src/testing/fixtures/X52.4.2.binds","line":416,"fingerprint":"src/testing/fixtures/X52.4.2.binds:generic-api-key:416"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"src/testing/fixtures/Custom.4.2.binds","line":76,"fingerprint":"src/testing/fixtures/Custom.4.2.binds:generic-api-key:76"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":28.0,"findings_high":0.0,"findings_medium":27.0,"findings_low":1.0,"weighted_findings":6.812,"scanned_lines":19527.0,"parse_errors":4.0},"findings":[{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/core/binds/binds-document.ts","line":83,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/core/binds/binds-document.ts:83"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/core/devices/markers.ts","line":98,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/core/devices/markers.ts:98"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/core/devices/markers.ts","line":102,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/core/devices/markers.ts:102"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":97,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:97"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":102,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:102"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":128,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:128"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":133,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:133"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":174,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:174"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":240,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:240"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":245,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:245"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":247,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:247"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":252,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:252"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":263,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:263"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":287,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:287"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":298,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:298"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":301,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:301"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":304,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:304"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":348,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:348"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":349,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:349"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":351,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:351"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":402,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:402"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":403,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:403"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/app/features/cards/card-render.ts","line":436,"fingerprint":"javascript.lang.security.html-in-template-string:src/app/features/cards/card-render.ts:436"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `img` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controlled  [confidence low]","path":"src/app/features/devices/editor/draft.ts","line":197,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:src/app/features/devices/editor/draft.ts:197"},{"rule_id":"opengrep/javascript.ajv.security.audit.ajv-allerrors-true","severity":"medium","message":"By setting `allErrors: true` in `Ajv` library, all error objects will be allocated without limit. This allows the attacker to produce a huge number of errors which can lead to denial of service. Do not use `allErrors: true` in production. [confidence low]","path":"tools/build-device-index.mjs","line":12,"fingerprint":"javascript.ajv.security.audit.ajv-allerrors-true:tools/build-device-index.mjs:12"},{"rule_id":"opengrep/python.lang.security.audit.exec-detected","severity":"medium","message":"Detected the use of exec(). exec() can be dangerous if used to evaluate dynamic content. If this content can be input from outside the program, this may be a code injection vulnerability. Ensure evaluated content is not definable by external sources. [confidence low]","path":"tools/import_data.py","line":40,"fingerprint":"python.lang.security.audit.exec-detected:tools/import_data.py:40"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"tools/screenshots/devices-leaders.shots.ts","line":59,"fingerprint":"javascript.lang.security.html-in-template-string:tools/screenshots/devices-leaders.shots.ts:59"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-formatstring","severity":"low","message":"Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string. [confidence low]","path":"tools/screenshots/bindings.shots.ts","line":69,"fingerprint":"javascript.lang.security.audit.unsafe-formatstring:tools/screenshots/bindings.shots.ts:69"}],"evidence":[],"data":{"rulesets":["typescript","javascript","python","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":10.0,"vulnerabilities":37.0,"vulns_critical":1.0,"vulns_high":14.0,"vulns_medium":17.0,"vulns_low":4.0,"vulns_unknown":1.0,"penalty":77.0},"findings":[{"rule_id":"osv/GHSA-cg2g-xh64-v4q7","severity":"critical","message":"dompurify@3.4.16 (npm) is affected by GHSA-cg2g-xh64-v4q7","path":"package-lock.json","line":null,"fingerprint":"dompurify@3.4.16 (npm):GHSA-cg2g-xh64-v4q7"},{"rule_id":"osv/GHSA-57xq-rjx2-v5xh","severity":"high","message":"@angular/router@22.2.0 (npm) is affected by GHSA-57xq-rjx2-v5xh","path":"package-lock.json","line":null,"fingerprint":"@angular/router@22.2.0 (npm):GHSA-57xq-rjx2-v5xh"},{"rule_id":"osv/GHSA-62vg-58rm-qff7","severity":"high","message":"@angular/router@22.2.0 (npm) is affected by GHSA-62vg-58rm-qff7","path":"package-lock.json","line":null,"fingerprint":"@angular/router@22.2.0 (npm):GHSA-62vg-58rm-qff7"},{"rule_id":"osv/GHSA-46jr-4wx8-v453","severity":"high","message":"@modelcontextprotocol/server@2.0.0 (npm) is affected by GHSA-46jr-4wx8-v453","path":"package-lock.json","line":null,"fingerprint":"@modelcontextprotocol/server@2.0.0 (npm):GHSA-46jr-4wx8-v453"},{"rule_id":"osv/GHSA-f897-62hf-6gxq","severity":"high","message":"@modelcontextprotocol/server@2.0.0 (npm) is affected by GHSA-f897-62hf-6gxq","path":"package-lock.json","line":null,"fingerprint":"@modelcontextprotocol/server@2.0.0 (npm):GHSA-f897-62hf-6gxq"},{"rule_id":"osv/GHSA-jm63-cq47-j5jp","severity":"high","message":"@modelcontextprotocol/server@2.0.0 (npm) is affected by GHSA-jm63-cq47-j5jp","path":"package-lock.json","line":null,"fingerprint":"@modelcontextprotocol/server@2.0.0 (npm):GHSA-jm63-cq47-j5jp"},{"rule_id":"osv/GHSA-mrv2-3pqr-j5jr","severity":"high","message":"dompurify@3.4.16 (npm) is affected by GHSA-mrv2-3pqr-j5jr","path":"package-lock.json","line":null,"fingerprint":"dompurify@3.4.16 (npm):GHSA-mrv2-3pqr-j5jr"},{"rule_id":"osv/GHSA-68fv-2mgg-jv7q","severity":"high","message":"source-map-js@1.2.1 (npm) is affected by GHSA-68fv-2mgg-jv7q","path":"package-lock.json","line":null,"fingerprint":"source-map-js@1.2.1 (npm):GHSA-68fv-2mgg-jv7q"},{"rule_id":"osv/GHSA-2m5v-pch6-74hx","severity":"high","message":"undici@8.11.2 (npm) is affected by GHSA-2m5v-pch6-74hx","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-2m5v-pch6-74hx"},{"rule_id":"osv/GHSA-4w7w-5xrc-9h26","severity":"high","message":"undici@8.11.2 (npm) is affected by GHSA-4w7w-5xrc-9h26","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-4w7w-5xrc-9h26"},{"rule_id":"osv/GHSA-qrxm-fqhp-jwvm","severity":"high","message":"undici@8.11.2 (npm) is affected by GHSA-qrxm-fqhp-jwvm","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-qrxm-fqhp-jwvm"},{"rule_id":"osv/GHSA-xjj6-f33q-929c","severity":"high","message":"undici@8.11.2 (npm) is affected by GHSA-xjj6-f33q-929c","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-xjj6-f33q-929c"},{"rule_id":"osv/GHSA-587h-7wmj-h5pm","severity":"high","message":"vite@8.3.0 (npm) is affected by GHSA-587h-7wmj-h5pm","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.0 (npm):GHSA-587h-7wmj-h5pm"},{"rule_id":"osv/GHSA-587h-7wmj-h5pm","severity":"high","message":"vite@8.3.1 (npm) is affected by GHSA-587h-7wmj-h5pm","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.1 (npm):GHSA-587h-7wmj-h5pm"},{"rule_id":"osv/GHSA-mrhx-c7xc-m3w5","severity":"high","message":"zod@4.6.5 (npm) is affected by GHSA-mrhx-c7xc-m3w5","path":"package-lock.json","line":null,"fingerprint":"zod@4.6.5 (npm):GHSA-mrhx-c7xc-m3w5"},{"rule_id":"osv/GHSA-rvq5-wwqv-78pq","severity":"medium","message":"@modelcontextprotocol/server@2.0.0 (npm) is affected by GHSA-rvq5-wwqv-78pq","path":"package-lock.json","line":null,"fingerprint":"@modelcontextprotocol/server@2.0.0 (npm):GHSA-rvq5-wwqv-78pq"},{"rule_id":"osv/GHSA-qxg6-89mg-rqv8","severity":"medium","message":"@vitest/mocker@5.0.2 (npm) is affected by GHSA-qxg6-89mg-rqv8","path":"package-lock.json","line":null,"fingerprint":"@vitest/mocker@5.0.2 (npm):GHSA-qxg6-89mg-rqv8"},{"rule_id":"osv/GHSA-xp26-3454-mjgp","severity":"medium","message":"@vitest/mocker@5.0.2 (npm) is affected by GHSA-xp26-3454-mjgp","path":"package-lock.json","line":null,"fingerprint":"@vitest/mocker@5.0.2 (npm):GHSA-xp26-3454-mjgp"},{"rule_id":"osv/GHSA-c6gr-qvv4-5v3f","severity":"medium","message":"dompurify@3.4.16 (npm) is affected by GHSA-c6gr-qvv4-5v3f","path":"package-lock.json","line":null,"fingerprint":"dompurify@3.4.16 (npm):GHSA-c6gr-qvv4-5v3f"},{"rule_id":"osv/GHSA-w74x-v6f9-j3xg","severity":"medium","message":"fast-uri@3.1.8 (npm) is affected by GHSA-w74x-v6f9-j3xg","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-w74x-v6f9-j3xg"},{"rule_id":"osv/GHSA-wjr9-j795-jxcr","severity":"medium","message":"fast-uri@3.1.8 (npm) is affected by GHSA-wjr9-j795-jxcr","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-wjr9-j795-jxcr"},{"rule_id":"osv/GHSA-4qv8-2p9j-2685","severity":"medium","message":"undici@8.11.2 (npm) is affected by GHSA-4qv8-2p9j-2685","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-4qv8-2p9j-2685"},{"rule_id":"osv/GHSA-55wc-3pg8-jfw6","severity":"medium","message":"undici@8.11.2 (npm) is affected by GHSA-55wc-3pg8-jfw6","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-55wc-3pg8-jfw6"},{"rule_id":"osv/GHSA-9fm3-97px-rjf6","severity":"medium","message":"undici@8.11.2 (npm) is affected by GHSA-9fm3-97px-rjf6","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-9fm3-97px-rjf6"},{"rule_id":"osv/GHSA-f72v-6w45-q472","severity":"medium","message":"undici@8.11.2 (npm) is affected by GHSA-f72v-6w45-q472","path":"package-lock.json","line":null,"fingerprint":"undici@8.11.2 (npm):GHSA-f72v-6w45-q472"},{"rule_id":"osv/GHSA-698v-4r3x-3vcv","severity":"medium","message":"vite@8.3.0 (npm) is affected by GHSA-698v-4r3x-3vcv","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.0 (npm):GHSA-698v-4r3x-3vcv"},{"rule_id":"osv/GHSA-r825-w8mm-5pxw","severity":"medium","message":"vite@8.3.0 (npm) is affected by GHSA-r825-w8mm-5pxw","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.0 (npm):GHSA-r825-w8mm-5pxw"},{"rule_id":"osv/GHSA-rq7h-c2jc-7f22","severity":"medium","message":"vite@8.3.0 (npm) is affected by GHSA-rq7h-c2jc-7f22","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.0 (npm):GHSA-rq7h-c2jc-7f22"},{"rule_id":"osv/GHSA-vfpm-58rq-9qcg","severity":"medium","message":"vite@8.3.0 (npm) is affected by GHSA-vfpm-58rq-9qcg","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.0 (npm):GHSA-vfpm-58rq-9qcg"},{"rule_id":"osv/GHSA-698v-4r3x-3vcv","severity":"medium","message":"vite@8.3.1 (npm) is affected by GHSA-698v-4r3x-3vcv","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.1 (npm):GHSA-698v-4r3x-3vcv"},{"rule_id":"osv/GHSA-r825-w8mm-5pxw","severity":"medium","message":"vite@8.3.1 (npm) is affected by GHSA-r825-w8mm-5pxw","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.1 (npm):GHSA-r825-w8mm-5pxw"},{"rule_id":"osv/GHSA-rq7h-c2jc-7f22","severity":"medium","message":"vite@8.3.1 (npm) is affected by GHSA-rq7h-c2jc-7f22","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.1 (npm):GHSA-rq7h-c2jc-7f22"},{"rule_id":"osv/GHSA-vfpm-58rq-9qcg","severity":"medium","message":"vite@8.3.1 (npm) is affected by GHSA-vfpm-58rq-9qcg","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.1 (npm):GHSA-vfpm-58rq-9qcg"},{"rule_id":"osv/GHSA-333x-w4r6-6crp","severity":"low","message":"fast-uri@3.1.8 (npm) is affected by GHSA-333x-w4r6-6crp","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-333x-w4r6-6crp"},{"rule_id":"osv/GHSA-xhq7-xmqj-769h","severity":"low","message":"fast-uri@3.1.8 (npm) is affected by GHSA-xhq7-xmqj-769h","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-xhq7-xmqj-769h"},{"rule_id":"osv/GHSA-9jrq-w75r-8gcw","severity":"low","message":"vite@8.3.0 (npm) is affected by GHSA-9jrq-w75r-8gcw","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.0 (npm):GHSA-9jrq-w75r-8gcw"},{"rule_id":"osv/GHSA-9jrq-w75r-8gcw","severity":"low","message":"vite@8.3.1 (npm) is affected by GHSA-9jrq-w75r-8gcw","path":"package-lock.json","line":null,"fingerprint":"vite@8.3.1 (npm):GHSA-9jrq-w75r-8gcw"}],"evidence":[],"data":{"ecosystems":["npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":2.0,"findings":11.0,"findings_high":8.0,"findings_medium":3.0,"findings_low":0.0,"penalty":100.8},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":12,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:12"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":13,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:13"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":28,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:28"},{"rule_id":"zizmor/template-injection","severity":"high","message":"code injection via template expansion [confidence high]","path":".github/workflows/pages.yml","line":31,"fingerprint":"template-injection:.github/workflows/pages.yml:31"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pages.yml","line":24,"fingerprint":"unpinned-uses:.github/workflows/pages.yml:24"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pages.yml","line":25,"fingerprint":"unpinned-uses:.github/workflows/pages.yml:25"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pages.yml","line":34,"fingerprint":"unpinned-uses:.github/workflows/pages.yml:34"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pages.yml","line":38,"fingerprint":"unpinned-uses:.github/workflows/pages.yml:38"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":12,"fingerprint":"artipacked:.github/workflows/ci.yml:12"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/ci.yml","line":9,"fingerprint":"excessive-permissions:.github/workflows/ci.yml:9"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/pages.yml","line":24,"fingerprint":"artipacked:.github/workflows/pages.yml:24"}],"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":2094.0,"function_nloc":11023.0,"mean_ccn":2.48,"p90_ccn":5.0,"complex_functions":25.0,"long_functions":1.0,"many_param_functions":0.0,"risky_nloc_share":0.1031},"findings":[],"evidence":[{"kind":"complex-function","description":"parseHidLayout in src/app/core/input/hid-parser.ts: complexity 54, 102 lines","ref":"src/app/core/input/hid-parser.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/input/hid-parser.ts#L117","weight":0.9},{"kind":"complex-function","description":"validateDraft in src/app/features/devices/editor/validation.ts: complexity 42, 73 lines","ref":"src/app/features/devices/editor/validation.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/features/devices/editor/validation.ts#L30","weight":0.7},{"kind":"complex-function","description":"definitionToDraft in src/app/features/devices/editor/draft.ts: complexity 34, 73 lines","ref":"src/app/features/devices/editor/draft.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/features/devices/editor/draft.ts#L293","weight":0.5666666666666667},{"kind":"complex-function","description":"draftToDefinition in src/app/features/devices/editor/draft.ts: complexity 33, 47 lines","ref":"src/app/features/devices/editor/draft.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/features/devices/editor/draft.ts#L223","weight":0.55},{"kind":"complex-function","description":"(anonymous) in src/app/core/devices/device-files.ts: complexity 32, 29 lines","ref":"src/app/core/devices/device-files.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/devices/device-files.ts#L290","weight":0.5333333333333333},{"kind":"complex-function","description":"suggestLinks in src/app/core/binds/equivalents.ts: complexity 31, 54 lines","ref":"src/app/core/binds/equivalents.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/binds/equivalents.ts#L226","weight":0.5166666666666667},{"kind":"complex-function","description":"onKey in src/app/features/devices/editor/step-place.ts: complexity 31, 39 lines","ref":"src/app/features/devices/editor/step-place.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/features/devices/editor/step-place.ts#L663","weight":0.5166666666666667},{"kind":"complex-function","description":"import_devices in tools/import_data.py: complexity 29, 94 lines","ref":"tools/import_data.py","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/tools/import_data.py#L190","weight":0.48333333333333334},{"kind":"complex-function","description":"parseXml in src/app/core/binds/xml.ts: complexity 28, 98 lines","ref":"src/app/core/binds/xml.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/binds/xml.ts#L104","weight":0.4666666666666667},{"kind":"complex-function","description":"(anonymous) in src/app/core/devices/device-files.ts: complexity 23, 24 lines","ref":"src/app/core/devices/device-files.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/devices/device-files.ts#L246","weight":0.38333333333333336}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":14546.0,"duplicated_lines":62.0,"duplicated_share":0.0043,"files":102.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/app/core/data/catalog.types.ts:144 and src/app/core/data/catalog.types.ts:157","ref":"src/app/core/data/catalog.types.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/data/catalog.types.ts#L144","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/app/core/input/gamepad-mapping.ts:120 and src/app/features/live/live-device-card.ts:15","ref":"src/app/core/input/gamepad-mapping.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/core/input/gamepad-mapping.ts#L120","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/app/features/bindings/control-picker.ts:171 and src/app/features/devices/editor/step-check.ts:44","ref":"src/app/features/bindings/control-picker.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/features/bindings/control-picker.ts#L171","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/app/features/bindings/warnings-panel.ts:59 and src/app/features/bindings/warnings-panel.ts:132","ref":"src/app/features/bindings/warnings-panel.ts","url":"https://github.com/marwatk/elite-dangerous-bindings/blob/c8259c644aa84f30cfa39f5acfb34d713bb7bfa8/src/app/features/bindings/warnings-panel.ts#L59","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":83.0,"weighted_findings":28.25,"scanned_lines":19527.0,"category:best-practice":8.0,"category:correctness":75.0},"findings":[{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/core/state/file-actions.service.ts","line":50,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/core/state/file-actions.service.ts:50"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/core/state/file-actions.service.ts","line":63,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/core/state/file-actions.service.ts:63"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/core/state/file-actions.service.ts","line":177,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/core/state/file-actions.service.ts:177"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/features/bindings/changes-panel.ts","line":151,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/features/bindings/changes-panel.ts:151"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/features/devices/device-detail.ts","line":141,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/features/devices/device-detail.ts:141"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"src/app/features/devices/editor/draft.ts","line":282,"fingerprint":"javascript.lang.correctness.no-stringify-keys:src/app/features/devices/editor/draft.ts:282"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"src/app/features/devices/editor/draft.ts","line":282,"fingerprint":"javascript.lang.correctness.no-stringify-keys:src/app/features/devices/editor/draft.ts:282"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/features/devices/editor/layout-editor.ts","line":138,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/features/devices/editor/layout-editor.ts:138"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/features/devices/editor/step-image.ts","line":188,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/features/devices/editor/step-image.ts:188"},{"rule_id":"opengrep/javascript.lang.best-practice.javascript-confirm","severity":"medium","message":"found confirm() call; should this be in production code?","path":"src/app/features/devices/editor/step-inventory.ts","line":406,"fingerprint":"javascript.lang.best-practice.javascript-confirm:src/app/features/devices/editor/step-inventory.ts:406"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/about/about.ts","line":15,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/about/about.ts:15"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/about/about.ts","line":15,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/about/about.ts:15"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/about/about.ts","line":51,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/about/about.ts:51"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/about/about.ts","line":51,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/about/about.ts:51"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/bulk-dialog.ts","line":32,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/bulk-dialog.ts:32"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/bulk-dialog.ts","line":32,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/bulk-dialog.ts:32"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/bulk-dialog.ts","line":122,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/bulk-dialog.ts:122"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/bulk-dialog.ts","line":122,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/bulk-dialog.ts:122"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/changes-panel.ts","line":18,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/changes-panel.ts:18"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/changes-panel.ts","line":18,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/changes-panel.ts:18"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/changes-panel.ts","line":55,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/changes-panel.ts:55"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/changes-panel.ts","line":55,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/changes-panel.ts:55"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/control-picker.ts","line":129,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/control-picker.ts:129"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/control-picker.ts","line":129,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/control-picker.ts:129"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/export-dialog.ts","line":125,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/export-dialog.ts:125"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/export-dialog.ts","line":125,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/export-dialog.ts:125"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/merge-dialog.ts","line":19,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/merge-dialog.ts:19"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/merge-dialog.ts","line":19,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/merge-dialog.ts:19"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/merge-dialog.ts","line":92,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/merge-dialog.ts:92"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/merge-dialog.ts","line":92,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/merge-dialog.ts:92"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/settings-dialog.ts","line":75,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/settings-dialog.ts:75"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/settings-dialog.ts","line":75,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/settings-dialog.ts:75"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/slot-view.ts","line":29,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/slot-view.ts:29"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/slot-view.ts","line":29,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/slot-view.ts:29"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/warnings-panel.ts","line":19,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/warnings-panel.ts:19"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/warnings-panel.ts","line":19,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/warnings-panel.ts:19"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/warnings-panel.ts","line":157,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/warnings-panel.ts:157"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/bindings/warnings-panel.ts","line":157,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/bindings/warnings-panel.ts:157"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/cards/card-svg.ts","line":12,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/cards/card-svg.ts:12"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/cards/card-svg.ts","line":12,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/cards/card-svg.ts:12"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/group-dialog.ts","line":44,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/group-dialog.ts:44"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/group-dialog.ts","line":44,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/group-dialog.ts:44"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/group-dialog.ts","line":173,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/group-dialog.ts:173"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/group-dialog.ts","line":173,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/group-dialog.ts:173"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/image-adjust.ts","line":30,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/image-adjust.ts:30"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/image-adjust.ts","line":30,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/image-adjust.ts:30"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/marker-icon.ts","line":8,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/marker-icon.ts:8"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/marker-icon.ts","line":8,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/marker-icon.ts:8"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/marker-icon.ts","line":17,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/marker-icon.ts:17"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/marker-icon.ts","line":17,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/marker-icon.ts:17"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-check.ts","line":26,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-check.ts:26"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-check.ts","line":26,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-check.ts:26"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-export.ts","line":24,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-export.ts:24"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-export.ts","line":24,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-export.ts:24"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-export.ts","line":63,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-export.ts:63"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-export.ts","line":63,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-export.ts:63"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-identify.ts","line":23,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-identify.ts:23"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-identify.ts","line":23,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-identify.ts:23"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-image.ts","line":17,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-image.ts:17"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-image.ts","line":17,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-image.ts:17"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-inventory.ts","line":25,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-inventory.ts:25"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-inventory.ts","line":25,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-inventory.ts:25"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-name.ts","line":15,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-name.ts:15"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/devices/editor/step-name.ts","line":15,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/devices/editor/step-name.ts:15"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/live-device-card.ts","line":35,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/live-device-card.ts:35"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/live-device-card.ts","line":35,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/live-device-card.ts:35"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/live-device-card.ts","line":147,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/live-device-card.ts:147"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/live-device-card.ts","line":147,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/live-device-card.ts:147"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/live-page.ts","line":158,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/live-page.ts:158"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/live-page.ts","line":158,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/live-page.ts:158"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/numbering-wizard.ts","line":19,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/numbering-wizard.ts:19"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/numbering-wizard.ts","line":19,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/numbering-wizard.ts:19"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/numbering-wizard.ts","line":96,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/numbering-wizard.ts:96"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/features/live/numbering-wizard.ts","line":96,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/features/live/numbering-wizard.ts:96"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/shared/device-diagram.ts","line":29,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/shared/device-diagram.ts:29"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/shared/device-diagram.ts","line":29,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/shared/device-diagram.ts:29"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/shared/device-diagram.ts","line":107,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/shared/device-diagram.ts:107"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/shared/device-diagram.ts","line":107,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/shared/device-diagram.ts:107"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"tools/screenshots/devices-leaders.shots.ts","line":61,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:tools/screenshots/devices-leaders.shots.ts:61"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"tools/screenshots/devices-leaders.shots.ts","line":62,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:tools/screenshots/devices-leaders.shots.ts:62"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"tools/screenshots/devices-leaders.shots.ts","line":63,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:tools/screenshots/devices-leaders.shots.ts:63"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"tools/screenshots/devices-leaders.shots.ts","line":64,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:tools/screenshots/devices-leaders.shots.ts:64"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"tools/screenshots/devices-leaders.shots.ts","line":65,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:tools/screenshots/devices-leaders.shots.ts:65"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.5319,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":5193.0,"source_lines":19527.0,"test_ratio":0.2659,"ci_files":2.0,"cochange_share":0.7143,"cochange_commits":7.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/ci.yml","ref":".github/workflows/ci.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/pages.yml","ref":".github/workflows/pages.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (npm test)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["npm test"],"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":211.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":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":3927.0,"other_lines":15600.0,"files_blamed":102.0,"blame_failures":0.0,"quality:ai_findings":13.0,"quality:ai_per_kloc":3.31,"quality:other_findings":70.0,"quality:other_per_kloc":4.487,"quality:ratio":0.74,"security:ai_findings":10.0,"security:ai_per_kloc":2.546,"security:other_findings":18.0,"security:other_per_kloc":1.154,"security:ratio":2.21},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":true},"error":null}],"flags":[]}