{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:19:10.845690Z","repo":{"ref":{"host":"github.com","owner":"bryan-uipath","name":"ottobot"},"default_branch":"main","clone_url":"https://github.com/bryan-uipath/ottobot.git","html_url":"https://github.com/bryan-uipath/ottobot","description":"Higher-order coding agent: trigger-bearing skills → scheduled/event-driven claude runs, with a TUI","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":782,"primary_language":"Rust","license_spdx":null,"created_at":"2026-09-03T21:17:01Z","pushed_at":"2026-11-07T02:39:53Z","security_policy_url":null,"distribution":{"owner_created_at":"2022-03-21T01:06:39Z","owner_type":"User","release_assets":[]}},"commit_sha":"7366dd3d1411719d18acf5c91f6075d2388f7112","profile":{"lines_by_language":{"Rust":6472,"JavaScript":205,"Shell":182},"files_by_category":{"source":30,"binary":12,"config":10,"docs":7,"other":4,"generated":2},"source_lines":6859,"test_lines":0},"pillars":{"ai_provenance":{"score":95.1,"confidence":0.74,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.9513,"suspected_share":0.0,"estimated_share":0.9513,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":null},"summary":"Explicit AI attribution on 95% of first-party code added; an estimated 95% including velocity signals."},"quality":{"score":66.7,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":58.4,"duplication":85.4,"lint":100.0,"testing":45.0,"docs":60.0,"type_safety":null,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.00, CI runs tests; 18% of function code in complex or long functions; 3% duplicated lines. Weakest area: testing."},"security":{"score":65.8,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":88.0,"dependencies":55.8,"ci_actions":22.8,"posture":20.0,"scorecard":null},"summary":"Security posture is weak: 11 known vulnerabilities in 10 dependencies; 7 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":25.0,"checked":25.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":18.0,"attributed_commits":17.0,"attributed_commit_share":0.9444444444444444,"effective_loc":7537.0,"attributed_loc":7170.0,"attributed_loc_share":0.951306886028924,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 17 attributed commits, 7,170 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"7366dd3d1411719d18acf5c91f6075d2388f7112","url":"https://github.com/bryan-uipath/ottobot/commit/7366dd3d1411719d18acf5c91f6075d2388f7112","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"1abeee5659b3d71e2fb0bc927776bdd09fe3cadd","url":"https://github.com/bryan-uipath/ottobot/commit/1abeee5659b3d71e2fb0bc927776bdd09fe3cadd","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6b699bb32550300755701dc334ec55b4e1a3ce33","url":"https://github.com/bryan-uipath/ottobot/commit/6b699bb32550300755701dc334ec55b4e1a3ce33","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"d906de0b8696e24d7ef4851bfd8900a58e9c7c0d","url":"https://github.com/bryan-uipath/ottobot/commit/d906de0b8696e24d7ef4851bfd8900a58e9c7c0d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"9693501223bd816c46d807351ca3c642432d62aa","url":"https://github.com/bryan-uipath/ottobot/commit/9693501223bd816c46d807351ca3c642432d62aa","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c2ff801f8e072a63bcf90b18ea34cb88f85e2b0d","url":"https://github.com/bryan-uipath/ottobot/commit/c2ff801f8e072a63bcf90b18ea34cb88f85e2b0d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f87fe7a1598c927ee5af01c4229f575803ab80cb","url":"https://github.com/bryan-uipath/ottobot/commit/f87fe7a1598c927ee5af01c4229f575803ab80cb","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e571148f18ff94df1b36230e7108614eaea1c233","url":"https://github.com/bryan-uipath/ottobot/commit/e571148f18ff94df1b36230e7108614eaea1c233","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"23220d80e09056a271738c0e65b5428de192613f","url":"https://github.com/bryan-uipath/ottobot/commit/23220d80e09056a271738c0e65b5428de192613f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"0c340abd52c064dbd70080056ba198226a8274dc","url":"https://github.com/bryan-uipath/ottobot/commit/0c340abd52c064dbd70080056ba198226a8274dc","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"19d527e84205db6654b21313fb03504c93d97e46","url":"https://github.com/bryan-uipath/ottobot/commit/19d527e84205db6654b21313fb03504c93d97e46","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"d403579d0f787f3f37d1aec9c80d063f266489fa","url":"https://github.com/bryan-uipath/ottobot/commit/d403579d0f787f3f37d1aec9c80d063f266489fa","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: PR description attribution","ref":"26fa3970221de3bca423c7b0492bf215cc4263bf","url":"https://github.com/bryan-uipath/ottobot/commit/26fa3970221de3bca423c7b0492bf215cc4263bf","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"813d79b64c1cf600d70dd56f18a13ac93f436910","url":"https://github.com/bryan-uipath/ottobot/commit/813d79b64c1cf600d70dd56f18a13ac93f436910","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"438c6b3cc4d984852477af1cfd37dd0d53c82a0a","url":"https://github.com/bryan-uipath/ottobot/commit/438c6b3cc4d984852477af1cfd37dd0d53c82a0a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"8fc5451ad3522e8dbd5a4d3195d6d4d9b457e10c","url":"https://github.com/bryan-uipath/ottobot/commit/8fc5451ad3522e8dbd5a4d3195d6d4d9b457e10c","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c87be4799ce800a3d4de7da5354bcd163e930f5e","url":"https://github.com/bryan-uipath/ottobot/commit/c87be4799ce800a3d4de7da5354bcd163e930f5e","weight":0.9}],"data":{"attributed_loc_by_commit":{"c87be4799ce800a3d4de7da5354bcd163e930f5e":1464,"438c6b3cc4d984852477af1cfd37dd0d53c82a0a":785,"8fc5451ad3522e8dbd5a4d3195d6d4d9b457e10c":310,"26fa3970221de3bca423c7b0492bf215cc4263bf":527,"813d79b64c1cf600d70dd56f18a13ac93f436910":854,"d403579d0f787f3f37d1aec9c80d063f266489fa":244,"0c340abd52c064dbd70080056ba198226a8274dc":309,"19d527e84205db6654b21313fb03504c93d97e46":489,"e571148f18ff94df1b36230e7108614eaea1c233":271,"23220d80e09056a271738c0e65b5428de192613f":138,"c2ff801f8e072a63bcf90b18ea34cb88f85e2b0d":274,"f87fe7a1598c927ee5af01c4229f575803ab80cb":209,"6b699bb32550300755701dc334ec55b4e1a3ce33":388,"d906de0b8696e24d7ef4851bfd8900a58e9c7c0d":97,"9693501223bd816c46d807351ca3c642432d62aa":212,"1abeee5659b3d71e2fb0bc927776bdd09fe3cadd":303,"7366dd3d1411719d18acf5c91f6075d2388f7112":296},"tools":{"claude-code":{"name":"Claude Code","commits":17,"loc":7170,"first_seen":1788470220,"last_seen":1793391691}},"monthly":{"2026-09":{"loc":1831,"attributed_loc":1464},"2026-10":{"loc":5706,"attributed_loc":5706}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":18.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":7537.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":366.0,"median_loc_per_hour":10.728912303639754,"pr_timed_units":16.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":6859.0,"index":0.364,"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":5.0,"per_kloc:emoji_in_code":0.729,"files:emoji_in_code":3.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":10.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":10.0,"weighted_findings":2.5,"scanned_lines":6859.0,"parse_errors":1.0},"findings":[{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"src/daemon.rs","line":89,"fingerprint":"rust.lang.security.unsafe-usage:src/daemon.rs:89"},{"rule_id":"opengrep/rust.lang.security.current-exe","severity":"low","message":"current_exe should not be used for security operations. From the docs: \"The output of this function should not be trusted for anything that might have security implications. Basically, if users can run the executable, they can change the output arbitrarily.\" [confidence high]","path":"src/daemon.rs","line":142,"fingerprint":"rust.lang.security.current-exe:src/daemon.rs:142"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/ledger.rs","line":80,"fingerprint":"rust.lang.security.temp-dir:src/ledger.rs:80"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/state.rs","line":317,"fingerprint":"rust.lang.security.temp-dir:src/state.rs:317"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/state.rs","line":331,"fingerprint":"rust.lang.security.temp-dir:src/state.rs:331"},{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"src/store.rs","line":525,"fingerprint":"rust.lang.security.unsafe-usage:src/store.rs:525"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/store.rs","line":634,"fingerprint":"rust.lang.security.temp-dir:src/store.rs:634"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/store.rs","line":658,"fingerprint":"rust.lang.security.temp-dir:src/store.rs:658"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/store.rs","line":677,"fingerprint":"rust.lang.security.temp-dir:src/store.rs:677"},{"rule_id":"opengrep/rust.lang.security.args","severity":"low","message":"args should not be used for security operations. From the docs: \"The first element is traditionally the path of the executable, but it can be set to arbitrary text, and might not even exist. This means this property should not be relied upon for security purposes.\" [confidence high]","path":"tools/otto-render/src/main.rs","line":76,"fingerprint":"rust.lang.security.args:tools/otto-render/src/main.rs:76"}],"evidence":[],"data":{"rulesets":["rust","javascript","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":10.0,"vulnerabilities":11.0,"vulns_critical":0.0,"vulns_high":1.0,"vulns_medium":1.0,"vulns_low":1.0,"vulns_unknown":8.0,"penalty":35.0},"findings":[{"rule_id":"osv/RUSTSEC-2026-0433","severity":"high","message":"pulldown-cmark@0.13.5 (crates.io) is affected by RUSTSEC-2026-0433","path":"Cargo.lock","line":null,"fingerprint":"pulldown-cmark@0.13.5 (crates.io):RUSTSEC-2026-0433"},{"rule_id":"osv/RUSTSEC-2026-0253","severity":"medium","message":"lru@0.12.5 (crates.io) is affected by RUSTSEC-2026-0253","path":"Cargo.lock","line":null,"fingerprint":"lru@0.12.5 (crates.io):RUSTSEC-2026-0253"},{"rule_id":"osv/RUSTSEC-2024-0436","severity":"medium","message":"paste@1.0.15 (crates.io) is affected by RUSTSEC-2024-0436","path":"Cargo.lock","line":null,"fingerprint":"paste@1.0.15 (crates.io):RUSTSEC-2024-0436"},{"rule_id":"osv/RUSTSEC-2026-0386","severity":"medium","message":"tokio@1.53.1 (crates.io) is affected by RUSTSEC-2026-0386","path":"Cargo.lock","line":null,"fingerprint":"tokio@1.53.1 (crates.io):RUSTSEC-2026-0386"},{"rule_id":"osv/RUSTSEC-2024-0449","severity":"medium","message":"unsafe-libyaml@0.2.11 (crates.io) is affected by RUSTSEC-2024-0449","path":"Cargo.lock","line":null,"fingerprint":"unsafe-libyaml@0.2.11 (crates.io):RUSTSEC-2024-0449"},{"rule_id":"osv/GHSA-wrw7-89jp-8q8g","severity":"medium","message":"glib@0.18.5 (crates.io) is affected by RUSTSEC-2024-0429, GHSA-wrw7-89jp-8q8g","path":"tray/src-tauri/Cargo.lock","line":null,"fingerprint":"glib@0.18.5 (crates.io):GHSA-wrw7-89jp-8q8g"},{"rule_id":"osv/RUSTSEC-2024-0370","severity":"medium","message":"proc-macro-error@1.0.4 (crates.io) is affected by RUSTSEC-2024-0370","path":"tray/src-tauri/Cargo.lock","line":null,"fingerprint":"proc-macro-error@1.0.4 (crates.io):RUSTSEC-2024-0370"},{"rule_id":"osv/RUSTSEC-2026-0371","severity":"medium","message":"zbus_names@4.3.5 (crates.io) is affected by RUSTSEC-2026-0371","path":"tray/src-tauri/Cargo.lock","line":null,"fingerprint":"zbus_names@4.3.5 (crates.io):RUSTSEC-2026-0371"},{"rule_id":"osv/RUSTSEC-2026-0370","severity":"medium","message":"zvariant@5.15.1 (crates.io) is affected by RUSTSEC-2026-0370","path":"tray/src-tauri/Cargo.lock","line":null,"fingerprint":"zvariant@5.15.1 (crates.io):RUSTSEC-2026-0370"},{"rule_id":"osv/RUSTSEC-2026-0372","severity":"medium","message":"zvariant_derive@5.15.1 (crates.io) is affected by RUSTSEC-2026-0372","path":"tray/src-tauri/Cargo.lock","line":null,"fingerprint":"zvariant_derive@5.15.1 (crates.io):RUSTSEC-2026-0372"},{"rule_id":"osv/GHSA-rhfx-m35p-ff5j","severity":"low","message":"lru@0.12.5 (crates.io) is affected by RUSTSEC-2026-0002, GHSA-rhfx-m35p-ff5j","path":"Cargo.lock","line":null,"fingerprint":"lru@0.12.5 (crates.io):GHSA-rhfx-m35p-ff5j"}],"evidence":[],"data":{"ecosystems":["crates.io"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":2.0,"findings":12.0,"findings_high":7.0,"findings_medium":4.0,"findings_low":1.0,"penalty":88.8},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":23,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:23"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":23,"fingerprint":"unpinned-uses:.github/workflows/release.yml:23"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":41,"fingerprint":"unpinned-uses:.github/workflows/release.yml:41"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":58,"fingerprint":"unpinned-uses:.github/workflows/release.yml:58"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":73,"fingerprint":"unpinned-uses:.github/workflows/release.yml:73"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":91,"fingerprint":"unpinned-uses:.github/workflows/release.yml:91"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":102,"fingerprint":"unpinned-uses:.github/workflows/release.yml:102"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":23,"fingerprint":"artipacked:.github/workflows/ci.yml:23"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":23,"fingerprint":"artipacked:.github/workflows/release.yml:23"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":41,"fingerprint":"artipacked:.github/workflows/release.yml:41"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":73,"fingerprint":"artipacked:.github/workflows/release.yml:73"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release.yml","line":109,"fingerprint":"superfluous-actions:.github/workflows/release.yml:109"}],"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":0.0,"signed_commit_share":0.8889,"unpinned_manifests":1.0},"findings":[],"evidence":[{"kind":"posture","description":"tools/otto-render/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"tools/otto-render/Cargo.toml","url":null,"weight":0.3}],"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":341.0,"function_nloc":4763.0,"mean_ccn":3.99,"p90_ccn":9.0,"complex_functions":10.0,"long_functions":3.0,"many_param_functions":0.0,"risky_nloc_share":0.1795},"findings":[],"evidence":[{"kind":"complex-function","description":"render in tray/ui/app.js: complexity 57, 107 lines","ref":"tray/ui/app.js","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/tray/ui/app.js#L62","weight":0.95},{"kind":"complex-function","description":"draw_board in src/tui/ui.rs: complexity 38, 136 lines","ref":"src/tui/ui.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/tui/ui.rs#L256","weight":0.6333333333333333},{"kind":"complex-function","description":"handle_key in src/tui/mod.rs: complexity 36, 82 lines","ref":"src/tui/mod.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/tui/mod.rs#L259","weight":0.6},{"kind":"complex-function","description":"main in src/main.rs: complexity 32, 89 lines","ref":"src/main.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/main.rs#L117","weight":0.5333333333333333},{"kind":"complex-function","description":"draw_session in src/tui/ui.rs: complexity 27, 101 lines","ref":"src/tui/ui.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/tui/ui.rs#L462","weight":0.45},{"kind":"complex-function","description":"main in tools/otto-render/src/main.rs: complexity 24, 95 lines","ref":"tools/otto-render/src/main.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/tools/otto-render/src/main.rs#L75","weight":0.4},{"kind":"complex-function","description":"parse_line in src/runner/codex.rs: complexity 18, 69 lines","ref":"src/runner/codex.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/runner/codex.rs#L44","weight":0.3},{"kind":"complex-function","description":"execute in src/scheduler.rs: complexity 17, 89 lines","ref":"src/scheduler.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/scheduler.rs#L432","weight":0.2833333333333333},{"kind":"complex-function","description":"toggle in tray/src-tauri/src/lib.rs: complexity 17, 30 lines","ref":"tray/src-tauri/src/lib.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/tray/src-tauri/src/lib.rs#L218","weight":0.2833333333333333},{"kind":"complex-function","description":"serve in src/daemon.rs: complexity 16, 57 lines","ref":"src/daemon.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/daemon.rs#L24","weight":0.26666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":5073.0,"duplicated_lines":134.0,"duplicated_share":0.0264,"files":30.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/client.rs:23 and tray/src-tauri/src/sock.rs:160","ref":"src/client.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/client.rs#L23","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/power.rs:13 and tray/src-tauri/src/sock.rs:72","ref":"src/power.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/power.rs#L13","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/proto.rs:272 and src/scheduler.rs:327","ref":"src/proto.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/proto.rs#L272","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/proto.rs:273 and src/store.rs:563","ref":"src/proto.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/proto.rs#L273","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/proto.rs:275 and src/state.rs:196","ref":"src/proto.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/proto.rs#L275","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/run.rs:6 and tray/src-tauri/src/sock.rs:21","ref":"src/run.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/run.rs#L6","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/state.rs:26 and tray/src-tauri/src/sock.rs:127","ref":"src/state.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/state.rs#L26","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/state.rs:182 and src/store.rs:551","ref":"src/state.rs","url":"https://github.com/bryan-uipath/ottobot/blob/7366dd3d1411719d18acf5c91f6075d2388f7112/src/state.rs#L182","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":0.0,"weighted_findings":0.0,"scanned_lines":6859.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":0.0,"check:test_ratio":0.0,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":1.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":6859.0,"test_ratio":0.0,"ci_files":2.0,"cochange_share":0.0,"cochange_commits":18.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/release.yml","ref":".github/workflows/release.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (go test, cargo test)","ref":null,"url":null,"weight":0.0},{"kind":"ci","description":"CI runs linters (clippy, rustfmt, cargo fmt)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["go test","cargo test"],"lint_commands":["clippy","rustfmt","cargo fmt"]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":0.0,"check:contributing":0.0,"check:changelog":1.0,"readme_lines":313.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"CHANGELOG.md","ref":"CHANGELOG.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":6519.0,"other_lines":340.0,"files_blamed":30.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:ai_per_kloc":0.0,"quality:other_findings":0.0,"quality:other_per_kloc":0.0,"security:ai_findings":10.0,"security:ai_per_kloc":1.534,"security:other_findings":0.0,"security:other_per_kloc":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":["unreviewed-ai-risk"]}