{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:00.278842Z","repo":{"ref":{"host":"github.com","owner":"Cossey","name":"mqtt-ai-tool"},"default_branch":"main","clone_url":"https://github.com/Cossey/mqtt-ai-tool.git","html_url":"https://github.com/Cossey/mqtt-ai-tool","description":"Node.js service that processes MQTT tasks, gathers context, runs AI prompts, and publishes outputs.","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":482,"primary_language":"TypeScript","license_spdx":"BSD-3-Clause","created_at":"2026-01-02T06:26:28Z","pushed_at":"2026-05-19T03:10:31Z","security_policy_url":null,"distribution":{"owner_created_at":"2013-12-29T10:06:04Z","owner_type":"User","release_assets":[]}},"commit_sha":"b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2","profile":{"lines_by_language":{"TypeScript":6565,"JavaScript":5},"files_by_category":{"test":12,"source":11,"config":10,"docs":4,"other":2,"generated":1},"source_lines":4123,"test_lines":2447},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.49,"coverage":1.0,"label":"possible","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":1.0,"flagged_work_units":0.0,"flagged_releases":null,"style_index":0.0},"summary":"Weak signals consistent with AI-assisted development."},"quality":{"score":73.6,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":27.4,"duplication":97.5,"lint":94.1,"testing":90.0,"docs":65.0,"type_safety":60.0,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.59, CI runs tests; 43% of function code in complex or long functions; 0% duplicated lines. Weakest area: complexity."},"security":{"score":51.3,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":57.6,"dependencies":18.3,"ci_actions":26.7,"posture":20.0,"scorecard":null},"summary":"Security posture is weak: 61 known vulnerabilities in 14 dependencies; 6 high-severity workflow issues. Weakest area: dependencies."}},"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":15.0,"checked":15.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":37.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":7575.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2026-01":{"loc":2735,"attributed_loc":0},"2026-02":{"loc":1942,"attributed_loc":0},"2026-04":{"loc":514,"attributed_loc":0},"2026-05":{"loc":2384,"attributed_loc":0}}},"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":1777881821.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"AGENTS.md (generic-agent configuration)","ref":"AGENTS.md","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/AGENTS.md","weight":0.5}],"data":{"artifacts":[{"tool":"generic-agent","path":"AGENTS.md","added_at":1777881821}],"workflows":[],"tools":["generic-agent"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":19.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":7575.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":494.0114354498947,"median_loc_per_hour":128.5,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":[]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":4123.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":26.0,"findings_high":0.0,"findings_medium":26.0,"findings_low":0.0,"weighted_findings":6.5,"scanned_lines":4123.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `configPath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":900,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:900"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `loader` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1065,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1065"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `loader` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1065,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1065"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `loader` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1112,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1112"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `loader` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1207,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1207"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `loaderTypeIndex` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1278,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1278"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `loader` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1278,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1278"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `payload` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1557,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1557"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `fp` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1630,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1630"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `fp` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1630,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1630"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `mime` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1960,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1960"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `topic` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1960,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1960"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `url` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/app.ts","line":1975,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/app.ts:1975"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `configPath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/config/config.ts","line":169,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/config/config.ts:169"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `configPath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/config/config.ts","line":173,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/config/config.ts:173"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `configPath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/config/config.ts","line":257,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/config/config.ts:257"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `configPath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/config/config.ts","line":258,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/config/config.ts:258"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `aiName` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/aiService.ts","line":28,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/aiService.ts:28"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `aiName` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/aiService.ts","line":29,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/aiService.ts:29"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `filePaths` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/aiService.ts","line":104,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/aiService.ts:104"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `options` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/cameraService.ts","line":148,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/cameraService.ts:148"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `options` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/cameraService.ts","line":161,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/cameraService.ts:161"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `options` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/cameraService.ts","line":162,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/cameraService.ts:162"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `filePath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/cameraService.ts","line":224,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/cameraService.ts:224"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-fs-filename","severity":"medium","message":"Detected that function argument `filePath` has entered the fs module. An attacker could potentially control the location of this file, to include going backwards in the directory with '../'. To address this, ensure that user-controlled variables in file paths are validated. [confidence low]","path":"src/services/cameraService.ts","line":225,"fingerprint":"javascript.lang.security.audit.detect-non-literal-fs-filename:src/services/cameraService.ts:225"},{"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/services/mqttService.ts","line":19,"fingerprint":"javascript.lang.security.html-in-template-string:src/services/mqttService.ts:19"}],"evidence":[],"data":{"rulesets":["typescript","javascript","dockerfile"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":14.0,"vulnerabilities":61.0,"vulns_critical":2.0,"vulns_high":29.0,"vulns_medium":29.0,"vulns_low":1.0,"vulns_unknown":0.0,"penalty":102.0},"findings":[{"rule_id":"osv/GHSA-8r5x-fm3f-whwj","severity":"critical","message":"handlebars@4.7.9 (npm) is affected by GHSA-8r5x-fm3f-whwj","path":"package-lock.json","line":null,"fingerprint":"handlebars@4.7.9 (npm):GHSA-8r5x-fm3f-whwj"},{"rule_id":"osv/GHSA-p8wg-vrv2-v86f","severity":"critical","message":"handlebars@4.7.9 (npm) is affected by GHSA-p8wg-vrv2-v86f","path":"package-lock.json","line":null,"fingerprint":"handlebars@4.7.9 (npm):GHSA-p8wg-vrv2-v86f"},{"rule_id":"osv/GHSA-3pq3-5fj3-cg6v","severity":"high","message":"axios@1.16.0 (npm) is affected by GHSA-3pq3-5fj3-cg6v","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-3pq3-5fj3-cg6v"},{"rule_id":"osv/GHSA-542g-h47m-68v8","severity":"high","message":"axios@1.16.0 (npm) is affected by GHSA-542g-h47m-68v8","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-542g-h47m-68v8"},{"rule_id":"osv/GHSA-gcfj-64vw-6mp9","severity":"high","message":"axios@1.16.0 (npm) is affected by GHSA-gcfj-64vw-6mp9","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-gcfj-64vw-6mp9"},{"rule_id":"osv/GHSA-m8m8-qj5v-23w3","severity":"high","message":"axios@1.16.0 (npm) is affected by GHSA-m8m8-qj5v-23w3","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-m8m8-qj5v-23w3"},{"rule_id":"osv/GHSA-mghh-pgcx-3jjj","severity":"high","message":"axios@1.16.0 (npm) is affected by GHSA-mghh-pgcx-3jjj","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-mghh-pgcx-3jjj"},{"rule_id":"osv/GHSA-x97p-jq2g-jp4f","severity":"high","message":"axios@1.16.0 (npm) is affected by GHSA-x97p-jq2g-jp4f","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-x97p-jq2g-jp4f"},{"rule_id":"osv/GHSA-3jxr-9vmj-r5cp","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-3jxr-9vmj-r5cp","path":"package-lock.json","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-3jxr-9vmj-r5cp"},{"rule_id":"osv/GHSA-6j4f-fj2g-mc7p","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-6j4f-fj2g-mc7p","path":"package-lock.json","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-6j4f-fj2g-mc7p"},{"rule_id":"osv/GHSA-mh99-v99m-4gvg","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-mh99-v99m-4gvg","path":"package-lock.json","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-mh99-v99m-4gvg"},{"rule_id":"osv/GHSA-qhr7-859c-m2p7","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-qhr7-859c-m2p7","path":"package-lock.json","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-qhr7-859c-m2p7"},{"rule_id":"osv/GHSA-rgw5-rvv9-x895","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-rgw5-rvv9-x895","path":"package-lock.json","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-rgw5-rvv9-x895"},{"rule_id":"osv/GHSA-73wf-gq98-2v4g","severity":"high","message":"browserslist@4.28.1 (npm) is affected by GHSA-73wf-gq98-2v4g","path":"package-lock.json","line":null,"fingerprint":"browserslist@4.28.1 (npm):GHSA-73wf-gq98-2v4g"},{"rule_id":"osv/GHSA-c83g-rgw3-j3cx","severity":"high","message":"browserslist@4.28.1 (npm) is affected by GHSA-c83g-rgw3-j3cx","path":"package-lock.json","line":null,"fingerprint":"browserslist@4.28.1 (npm):GHSA-c83g-rgw3-j3cx"},{"rule_id":"osv/GHSA-8r9p-f939-6h3c","severity":"high","message":"follow-redirects@1.16.0 (npm) is affected by GHSA-8r9p-f939-6h3c","path":"package-lock.json","line":null,"fingerprint":"follow-redirects@1.16.0 (npm):GHSA-8r9p-f939-6h3c"},{"rule_id":"osv/GHSA-mrwp-f3q8-3g9p","severity":"high","message":"follow-redirects@1.16.0 (npm) is affected by GHSA-mrwp-f3q8-3g9p","path":"package-lock.json","line":null,"fingerprint":"follow-redirects@1.16.0 (npm):GHSA-mrwp-f3q8-3g9p"},{"rule_id":"osv/GHSA-q3jh-wrc6-jgq8","severity":"high","message":"follow-redirects@1.16.0 (npm) is affected by GHSA-q3jh-wrc6-jgq8","path":"package-lock.json","line":null,"fingerprint":"follow-redirects@1.16.0 (npm):GHSA-q3jh-wrc6-jgq8"},{"rule_id":"osv/GHSA-hmw2-7cc7-3qxx","severity":"high","message":"form-data@4.0.5 (npm) is affected by GHSA-hmw2-7cc7-3qxx","path":"package-lock.json","line":null,"fingerprint":"form-data@4.0.5 (npm):GHSA-hmw2-7cc7-3qxx"},{"rule_id":"osv/GHSA-mwp4-54f8-5fhr","severity":"high","message":"ip-address@10.0.1 (npm) is affected by GHSA-mwp4-54f8-5fhr","path":"package-lock.json","line":null,"fingerprint":"ip-address@10.0.1 (npm):GHSA-mwp4-54f8-5fhr"},{"rule_id":"osv/GHSA-2883-xcg3-v3hh","severity":"high","message":"js-yaml@3.14.2 (npm) is affected by GHSA-2883-xcg3-v3hh","path":"package-lock.json","line":null,"fingerprint":"js-yaml@3.14.2 (npm):GHSA-2883-xcg3-v3hh"},{"rule_id":"osv/GHSA-52cp-r559-cp3m","severity":"high","message":"js-yaml@3.14.2 (npm) is affected by GHSA-52cp-r559-cp3m","path":"package-lock.json","line":null,"fingerprint":"js-yaml@3.14.2 (npm):GHSA-52cp-r559-cp3m"},{"rule_id":"osv/GHSA-5p4m-2wfm-xmqj","severity":"high","message":"js-yaml@3.14.2 (npm) is affected by GHSA-5p4m-2wfm-xmqj","path":"package-lock.json","line":null,"fingerprint":"js-yaml@3.14.2 (npm):GHSA-5p4m-2wfm-xmqj"},{"rule_id":"osv/GHSA-2883-xcg3-v3hh","severity":"high","message":"js-yaml@4.1.1 (npm) is affected by GHSA-2883-xcg3-v3hh","path":"package-lock.json","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-2883-xcg3-v3hh"},{"rule_id":"osv/GHSA-52cp-r559-cp3m","severity":"high","message":"js-yaml@4.1.1 (npm) is affected by GHSA-52cp-r559-cp3m","path":"package-lock.json","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-52cp-r559-cp3m"},{"rule_id":"osv/GHSA-5p4m-2wfm-xmqj","severity":"high","message":"js-yaml@4.1.1 (npm) is affected by GHSA-5p4m-2wfm-xmqj","path":"package-lock.json","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-5p4m-2wfm-xmqj"},{"rule_id":"osv/GHSA-48qf-xh34-q73r","severity":"high","message":"mariadb@3.4.5 (npm) is affected by GHSA-48qf-xh34-q73r","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-48qf-xh34-q73r"},{"rule_id":"osv/GHSA-cqhc-2h57-wpxf","severity":"high","message":"mariadb@3.4.5 (npm) is affected by GHSA-cqhc-2h57-wpxf","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-cqhc-2h57-wpxf"},{"rule_id":"osv/GHSA-r3rv-jm3r-62q2","severity":"high","message":"mariadb@3.4.5 (npm) is affected by GHSA-r3rv-jm3r-62q2","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-r3rv-jm3r-62q2"},{"rule_id":"osv/GHSA-v6pj-gxxw-phfw","severity":"high","message":"mariadb@3.4.5 (npm) is affected by GHSA-v6pj-gxxw-phfw","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-v6pj-gxxw-phfw"},{"rule_id":"osv/GHSA-96hv-2xvq-fx4p","severity":"high","message":"ws@8.18.3 (npm) is affected by GHSA-96hv-2xvq-fx4p","path":"package-lock.json","line":null,"fingerprint":"ws@8.18.3 (npm):GHSA-96hv-2xvq-fx4p"},{"rule_id":"osv/GHSA-42h9-826w-cgv3","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-42h9-826w-cgv3","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-42h9-826w-cgv3"},{"rule_id":"osv/GHSA-44g4-m2mj-wpvx","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-44g4-m2mj-wpvx","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-44g4-m2mj-wpvx"},{"rule_id":"osv/GHSA-4hqw-qxg8-jxx2","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-4hqw-qxg8-jxx2","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-4hqw-qxg8-jxx2"},{"rule_id":"osv/GHSA-7q8q-rj6j-mhjq","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-7q8q-rj6j-mhjq","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-7q8q-rj6j-mhjq"},{"rule_id":"osv/GHSA-9fr6-4gfg-395g","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-9fr6-4gfg-395g","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-9fr6-4gfg-395g"},{"rule_id":"osv/GHSA-f4gw-2p7v-4548","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-f4gw-2p7v-4548","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-f4gw-2p7v-4548"},{"rule_id":"osv/GHSA-hcpx-6fm6-wx23","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-hcpx-6fm6-wx23","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-hcpx-6fm6-wx23"},{"rule_id":"osv/GHSA-j8rh-479h-cp32","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-j8rh-479h-cp32","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-j8rh-479h-cp32"},{"rule_id":"osv/GHSA-jqh4-m9w3-8hp9","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-jqh4-m9w3-8hp9","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-jqh4-m9w3-8hp9"},{"rule_id":"osv/GHSA-mmx7-hfxf-jppx","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-mmx7-hfxf-jppx","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-mmx7-hfxf-jppx"},{"rule_id":"osv/GHSA-mwf2-3pr3-8698","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-mwf2-3pr3-8698","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-mwf2-3pr3-8698"},{"rule_id":"osv/GHSA-pmv8-rq9r-6j72","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-pmv8-rq9r-6j72","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-pmv8-rq9r-6j72"},{"rule_id":"osv/GHSA-vh66-26gq-q6x8","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-vh66-26gq-q6x8","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-vh66-26gq-q6x8"},{"rule_id":"osv/GHSA-xj6q-8x83-jv6g","severity":"medium","message":"axios@1.16.0 (npm) is affected by GHSA-xj6q-8x83-jv6g","path":"package-lock.json","line":null,"fingerprint":"axios@1.16.0 (npm):GHSA-xj6q-8x83-jv6g"},{"rule_id":"osv/GHSA-w5vr-8v7q-w6rv","severity":"medium","message":"baseline-browser-mapping@2.9.11 (npm) is affected by GHSA-w5vr-8v7q-w6rv","path":"package-lock.json","line":null,"fingerprint":"baseline-browser-mapping@2.9.11 (npm):GHSA-w5vr-8v7q-w6rv"},{"rule_id":"osv/GHSA-q2hr-2g5m-vwhr","severity":"medium","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-q2hr-2g5m-vwhr","path":"package-lock.json","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-q2hr-2g5m-vwhr"},{"rule_id":"osv/GHSA-gcqx-w48m-w2h4","severity":"medium","message":"deepmerge@4.3.1 (npm) is affected by GHSA-gcqx-w48m-w2h4","path":"package-lock.json","line":null,"fingerprint":"deepmerge@4.3.1 (npm):GHSA-gcqx-w48m-w2h4"},{"rule_id":"osv/GHSA-xw65-4hp5-5hc7","severity":"medium","message":"handlebars@4.7.9 (npm) is affected by GHSA-xw65-4hp5-5hc7","path":"package-lock.json","line":null,"fingerprint":"handlebars@4.7.9 (npm):GHSA-xw65-4hp5-5hc7"},{"rule_id":"osv/GHSA-h3mg-xc3c-68pw","severity":"medium","message":"ip-address@10.0.1 (npm) is affected by GHSA-h3mg-xc3c-68pw","path":"package-lock.json","line":null,"fingerprint":"ip-address@10.0.1 (npm):GHSA-h3mg-xc3c-68pw"},{"rule_id":"osv/GHSA-j6r3-76f7-8jcv","severity":"medium","message":"ip-address@10.0.1 (npm) is affected by GHSA-j6r3-76f7-8jcv","path":"package-lock.json","line":null,"fingerprint":"ip-address@10.0.1 (npm):GHSA-j6r3-76f7-8jcv"},{"rule_id":"osv/GHSA-rpw4-54j3-4h4q","severity":"medium","message":"ip-address@10.0.1 (npm) is affected by GHSA-rpw4-54j3-4h4q","path":"package-lock.json","line":null,"fingerprint":"ip-address@10.0.1 (npm):GHSA-rpw4-54j3-4h4q"},{"rule_id":"osv/GHSA-rxp7-6hxx-x8q5","severity":"medium","message":"ip-address@10.0.1 (npm) is affected by GHSA-rxp7-6hxx-x8q5","path":"package-lock.json","line":null,"fingerprint":"ip-address@10.0.1 (npm):GHSA-rxp7-6hxx-x8q5"},{"rule_id":"osv/GHSA-v2v4-37r5-5v8g","severity":"medium","message":"ip-address@10.0.1 (npm) is affected by GHSA-v2v4-37r5-5v8g","path":"package-lock.json","line":null,"fingerprint":"ip-address@10.0.1 (npm):GHSA-v2v4-37r5-5v8g"},{"rule_id":"osv/GHSA-h67p-54hq-rp68","severity":"medium","message":"js-yaml@3.14.2 (npm) is affected by GHSA-h67p-54hq-rp68","path":"package-lock.json","line":null,"fingerprint":"js-yaml@3.14.2 (npm):GHSA-h67p-54hq-rp68"},{"rule_id":"osv/GHSA-h67p-54hq-rp68","severity":"medium","message":"js-yaml@4.1.1 (npm) is affected by GHSA-h67p-54hq-rp68","path":"package-lock.json","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-h67p-54hq-rp68"},{"rule_id":"osv/GHSA-42r5-vhpq-m858","severity":"medium","message":"mariadb@3.4.5 (npm) is affected by GHSA-42r5-vhpq-m858","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-42r5-vhpq-m858"},{"rule_id":"osv/GHSA-cx2f-j9fh-8g68","severity":"medium","message":"mariadb@3.4.5 (npm) is affected by GHSA-cx2f-j9fh-8g68","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-cx2f-j9fh-8g68"},{"rule_id":"osv/GHSA-g5xc-5w98-jfvm","severity":"medium","message":"mariadb@3.4.5 (npm) is affected by GHSA-g5xc-5w98-jfvm","path":"package-lock.json","line":null,"fingerprint":"mariadb@3.4.5 (npm):GHSA-g5xc-5w98-jfvm"},{"rule_id":"osv/GHSA-58qx-3vcg-4xpx","severity":"medium","message":"ws@8.18.3 (npm) is affected by GHSA-58qx-3vcg-4xpx","path":"package-lock.json","line":null,"fingerprint":"ws@8.18.3 (npm):GHSA-58qx-3vcg-4xpx"},{"rule_id":"osv/GHSA-4x5r-pxfx-6jf8","severity":"low","message":"@babel/core@7.28.5 (npm) is affected by GHSA-4x5r-pxfx-6jf8","path":"package-lock.json","line":null,"fingerprint":"@babel/core@7.28.5 (npm):GHSA-4x5r-pxfx-6jf8"}],"evidence":[],"data":{"ecosystems":["npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":2.0,"findings":10.0,"findings_high":6.0,"findings_medium":4.0,"findings_low":0.0,"penalty":79.2},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker.build.yml","line":16,"fingerprint":"unpinned-uses:.github/workflows/docker.build.yml:16"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker.build.yml","line":19,"fingerprint":"unpinned-uses:.github/workflows/docker.build.yml:19"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker.build.yml","line":22,"fingerprint":"unpinned-uses:.github/workflows/docker.build.yml:22"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker.build.yml","line":25,"fingerprint":"unpinned-uses:.github/workflows/docker.build.yml:25"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/node.build.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/node.build.yml:21"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/node.build.yml","line":23,"fingerprint":"unpinned-uses:.github/workflows/node.build.yml:23"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/docker.build.yml","line":15,"fingerprint":"artipacked:.github/workflows/docker.build.yml:15"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/docker.build.yml","line":10,"fingerprint":"excessive-permissions:.github/workflows/docker.build.yml:10"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/node.build.yml","line":21,"fingerprint":"artipacked:.github/workflows/node.build.yml:21"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/node.build.yml","line":13,"fingerprint":"excessive-permissions:.github/workflows/node.build.yml:13"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":1.0,"check:lockfiles":1.0,"signed_commit_share":1.0,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":211.0,"function_nloc":3045.0,"mean_ccn":5.44,"p90_ccn":12.0,"complex_functions":13.0,"long_functions":4.0,"many_param_functions":0.0,"risky_nloc_share":0.4315},"findings":[],"evidence":[{"kind":"complex-function","description":"processPayload in src/app.ts: complexity 89, 266 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L1414","weight":1.0},{"kind":"complex-function","description":"processLoaderItem in src/app.ts: complexity 82, 279 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L1035","weight":1.0},{"kind":"complex-function","description":"processPromptsConfig in src/config/config.ts: complexity 68, 117 lines","ref":"src/config/config.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/config/config.ts#L380","weight":1.0},{"kind":"complex-function","description":"loadConfigFromPath in src/config/config.ts: complexity 54, 120 lines","ref":"src/config/config.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/config/config.ts#L168","weight":0.9},{"kind":"complex-function","description":"publishEntityForPath in src/app.ts: complexity 27, 83 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L224","weight":0.45},{"kind":"complex-function","description":"extractStructuredFromAiResponse in src/utils/promptUtils.ts: complexity 25, 36 lines","ref":"src/utils/promptUtils.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/utils/promptUtils.ts#L44","weight":0.4166666666666667},{"kind":"complex-function","description":"parseJsonControlCommand in src/app.ts: complexity 24, 47 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L655","weight":0.4},{"kind":"complex-function","description":"enqueueInput in src/app.ts: complexity 24, 49 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L500","weight":0.4},{"kind":"complex-function","description":"parseTextControlCommand in src/app.ts: complexity 24, 52 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L715","weight":0.4},{"kind":"complex-function","description":"publishHaDiscovery in src/app.ts: complexity 23, 94 lines","ref":"src/app.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/app.ts#L130","weight":0.38333333333333336}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":2792.0,"duplicated_lines":12.0,"duplicated_share":0.0043,"files":11.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/config/config.ts:59 and src/services/cameraService.ts:25","ref":"src/config/config.ts","url":"https://github.com/Cossey/mqtt-ai-tool/blob/b319da8f0a1ca67ac7cc0f87b99ce087dd1eb0a2/src/config/config.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":4.0,"weighted_findings":1.0,"scanned_lines":4123.0,"category:correctness":4.0},"findings":[{"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.ts","line":254,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app.ts:254"},{"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.ts","line":254,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app.ts:254"},{"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.ts","line":255,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app.ts:255"},{"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.ts","line":255,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app.ts:255"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":1.0,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":2447.0,"source_lines":4123.0,"test_ratio":0.5935,"ci_files":2.0,"cochange_share":0.6538,"cochange_commits":26.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/docker.build.yml","ref":".github/workflows/docker.build.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/node.build.yml","ref":".github/workflows/node.build.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":532.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":1.0,"check:low_escape_density":0.0,"escapes":63.0,"escapes_per_kloc":15.299},"findings":[],"evidence":[{"kind":"typing","description":"TypeScript strict type checking: tsconfig.json","ref":"tsconfig.json","url":null,"weight":0.0}],"data":{},"error":null}],"flags":[]}