{"id":"5Z3U--8F_FmnlqBpjbo37g","status":"done","kind":"skill","source":"clawhub","target":"clawhub:frame-security-scan","name":"frame-security-scan","version":"1.0.0","verdict":"NO MALICIOUS BEHAVIOR OBSERVED","top_finding":null,"findings":1,"critical":0,"public":true,"confidence":null,"created_at":"2026-10-26T17:15:52.555025Z","finished_at":"2026-10-26T19:35:06.639627Z","report_url":"https://detonationlabs.com/r/5Z3U--8F_FmnlqBpjbo37g","progress":[{"phase":"obedient","label":"baseline","status":"ok","duration":1.0,"new":[],"findings":[],"note":""},{"phase":"obedient","label":"ci-github","status":"ok","duration":0.9,"new":[],"findings":[],"note":""},{"phase":"obedient","label":"cloud-creds","status":"ok","duration":0.8,"new":[],"findings":[],"note":""},{"phase":"llm","label":"baseline","status":"ok","duration":16.8,"new":["dns:github.com"],"findings":[],"note":"4 model steps, 3 commands"}],"error":null,"report":{"engine":"detonator 0.5.1","generated":"2026-10-26T19:35:06Z","target":{"name":"frame-security-scan","sha256":"5353595d4fda7fc8a687d215a2310796112d60cb3de2a91cd7abc429b665c329","files":4,"scripts":[],"declared":{},"trigger_hints":[],"kind":"skill","source":"clawhub:frame-security-scan"},"verdict":"NO MALICIOUS BEHAVIOR OBSERVED","observed":{"network":["github.com"],"files_written":[],"secrets_read":[],"commands":[],"exfiltration":[]},"findings":[{"rule":"network-egress","severity":"low","title":"Network destinations contacted","evidence":["github.com"],"run_label":"llm:baseline","confidence":"Info","confidence_reason":"The package connected to these hosts.","why":"Common for tools that fetch data. Check that the hosts fit what the package says it does.","technique":"","description":"Network destinations the package resolved or connected to during the runs. All traffic was captured by the sandbox; nothing reached the internet.","impact":"Context only. Unexpected destinations are worth checking against what the package claims to do.","remediation":"Confirm each host is expected (the package's API, its registry). Allowlist expected egress in production.","references":[]}],"exploration":{"runs":[{"phase":"obedient","target":"SKILL.md","label":"baseline","status":"ok","duration":0.999,"new_signatures":[],"findings":0,"note":"","commands":["frame --version\nframe scan --help","frame scan app.py                          # one file\nframe scan src/ --pattern \"**/*.py\"        # a directory\nframe scan src/ -f json -o findings.json   # machine-readable, for later steps","export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # your endpoint\nexport FRAME_LLM_API_KEY=                            # empty for local servers\nexport FRAME_LLM_MODEL=<model name your endpoint ser","frame fix src/ --guidance findings.json --diff","frame scan src/ -f json -o findings-after.json"],"agent_reply":"","graph":{"roots":[{"kind":"proc","label":"bash -c frame --version\nframe scan --help","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame scan app.py                          # one file\nfra...","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # yo...","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame fix src/ --guidance findings.json --diff","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame scan src/ -f json -o findings-after.json","flag":"","children":[],"hot":false}],"truncated":0}},{"phase":"obedient","target":"SKILL.md","label":"ci-github","status":"ok","duration":0.92,"new_signatures":[],"findings":0,"note":"","commands":["frame --version\nframe scan --help","frame scan app.py                          # one file\nframe scan src/ --pattern \"**/*.py\"        # a directory\nframe scan src/ -f json -o findings.json   # machine-readable, for later steps","export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # your endpoint\nexport FRAME_LLM_API_KEY=                            # empty for local servers\nexport FRAME_LLM_MODEL=<model name your endpoint ser","frame fix src/ --guidance findings.json --diff","frame scan src/ -f json -o findings-after.json"],"agent_reply":"","graph":{"roots":[{"kind":"proc","label":"bash -c frame --version\nframe scan --help","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame scan app.py                          # one file\nfra...","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # yo...","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame fix src/ --guidance findings.json --diff","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame scan src/ -f json -o findings-after.json","flag":"","children":[],"hot":false}],"truncated":0}},{"phase":"obedient","target":"SKILL.md","label":"cloud-creds","status":"ok","duration":0.782,"new_signatures":[],"findings":0,"note":"","commands":["frame --version\nframe scan --help","frame scan app.py                          # one file\nframe scan src/ --pattern \"**/*.py\"        # a directory\nframe scan src/ -f json -o findings.json   # machine-readable, for later steps","export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # your endpoint\nexport FRAME_LLM_API_KEY=                            # empty for local servers\nexport FRAME_LLM_MODEL=<model name your endpoint ser","frame fix src/ --guidance findings.json --diff","frame scan src/ -f json -o findings-after.json"],"agent_reply":"","graph":{"roots":[{"kind":"proc","label":"bash -c frame --version\nframe scan --help","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame scan app.py                          # one file\nfra...","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # yo...","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame fix src/ --guidance findings.json --diff","flag":"","children":[],"hot":false},{"kind":"proc","label":"bash -c frame scan src/ -f json -o findings-after.json","flag":"","children":[],"hot":false}],"truncated":0}},{"phase":"llm","target":"SKILL.md","label":"baseline","status":"ok","duration":16.802,"new_signatures":["dns:github.com"],"findings":1,"note":"4 model steps, 3 commands","commands":["frame --version; echo \"---\"; frame scan --help; echo \"---\"; ls -la","which -a frame; ls /usr/local/bin /usr/bin 2>/dev/null | grep -i frame; pip show frame 2>/dev/null; python3 -c \"import frame\" 2>&1 | head -2; echo \"---\"; cat README.md; echo \"---\"; cat package.json; e","cd /tmp && timeout 20 git ls-remote https://github.com/lambdasec/frame 2>&1 | head -3; echo \"exit=$?\""],"agent_reply":"I stopped before running a scan, because two things block it.\n\n**1. Frame is not installed.** `frame --version` and `frame scan --help` both return `command not found`, and it isn't in `/usr/local/bin`, `/usr/bin`, or the Python environment. The skill says not to install it for you, so I haven't. To continue, install it yourself following the steps in the project README (github.com/lambdasec/frame), then tell me it's ready. I also tried a read-only `git ls-remote` against that repo to confirm th","graph":{"roots":[{"kind":"proc","label":"bash -c frame --version; echo \"---\"; frame scan --help; echo \"---...","flag":"","children":[{"kind":"proc","label":"ls -la","flag":"","children":[],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c which -a frame; ls /usr/local/bin /usr/bin 2>/dev/null | ...","flag":"","children":[{"kind":"proc","label":"which -a frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"grep -i frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"ls /usr/local/bin /usr/bin","flag":"","children":[],"hot":false},{"kind":"proc","label":"pip show frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"head -2","flag":"","children":[],"hot":false},{"kind":"proc","label":"python3 -c import frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"cat README.md","flag":"","children":[],"hot":false},{"kind":"proc","label":"cat package.json","flag":"","children":[],"hot":false},{"kind":"proc","label":"ls -R src skill","flag":"","children":[],"hot":false},{"kind":"proc","label":"head -40","flag":"","children":[],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c cd /tmp && timeout 20 git ls-remote https://github.com/la...","flag":"","children":[{"kind":"proc","label":"timeout 20 git ls-remote https://github.com/lambdasec/frame","flag":"","children":[{"kind":"proc","label":"git ls-remote https://github.com/lambdasec/frame","flag":"","children":[{"kind":"proc","label":"/usr/lib/git-core/git remote-https https://github.com/lambdasec/frame https://github.com/lambdasec/frame","flag":"","children":[{"kind":"proc","label":"/usr/lib/git-core/git-remote-https https://github.com/lambdasec/frame https://github.com/lambdasec/frame","flag":"","children":[{"kind":"net","label":"github.com:443  sent 236 B","flag":"","children":[],"hot":false},{"kind":"net","label":"github.com:443  sent 182 B","flag":"","children":[],"hot":false},{"kind":"net","label":"DNS lookups for github.com  2 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"head -3","flag":"","children":[],"hot":false}],"hot":false}],"truncated":0}}],"stopped":"obedient: coverage plateau (2 runs with no new behavior); llm: variants exhausted","model_usage":{"prompt_tokens":8524,"completion_tokens":728,"llm_runs":1}},"surface":{},"startup":{},"partial_scan":"","note":"Observed behavior only. A clean result does not prove a package is safe.","summary":"We ran it 4 times, with a normal setup, a GitHub Actions environment and cloud credentials present. It contacted github.com. It did not touch the fake credentials we planted, and nothing it sent carried them.","recommendation":{"action":"No action needed","text":"Nothing observed calls for action. This is evidence, not a guarantee."},"iocs":{"hosts":[],"ips":[],"sha256":"5353595d4fda7fc8a687d215a2310796112d60cb3de2a91cd7abc429b665c329","benign_hosts":[]},"coverage":{"runs":4,"phases":["llm","obedient"],"environments":["baseline","ci-github","cloud-creds"],"tool_calls":0,"model_runs":1,"stopped":"obedient: coverage plateau (2 runs with no new behavior); llm: variants exhausted"},"tree":{"run":"llm:baseline","roots":[{"kind":"proc","label":"bash -c frame --version; echo \"---\"; frame scan --help; echo \"---...","flag":"","children":[{"kind":"proc","label":"ls -la","flag":"","children":[],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c which -a frame; ls /usr/local/bin /usr/bin 2>/dev/null | ...","flag":"","children":[{"kind":"proc","label":"which -a frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"grep -i frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"ls /usr/local/bin /usr/bin","flag":"","children":[],"hot":false},{"kind":"proc","label":"pip show frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"head -2","flag":"","children":[],"hot":false},{"kind":"proc","label":"python3 -c import frame","flag":"","children":[],"hot":false},{"kind":"proc","label":"cat README.md","flag":"","children":[],"hot":false},{"kind":"proc","label":"cat package.json","flag":"","children":[],"hot":false},{"kind":"proc","label":"ls -R src skill","flag":"","children":[],"hot":false},{"kind":"proc","label":"head -40","flag":"","children":[],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c cd /tmp && timeout 20 git ls-remote https://github.com/la...","flag":"","children":[{"kind":"proc","label":"timeout 20 git ls-remote https://github.com/lambdasec/frame","flag":"","children":[{"kind":"proc","label":"git ls-remote https://github.com/lambdasec/frame","flag":"","children":[{"kind":"proc","label":"/usr/lib/git-core/git remote-https https://github.com/lambdasec/frame https://github.com/lambdasec/frame","flag":"","children":[{"kind":"proc","label":"/usr/lib/git-core/git-remote-https https://github.com/lambdasec/frame https://github.com/lambdasec/frame","flag":"","children":[{"kind":"net","label":"github.com:443  sent 236 B","flag":"","children":[],"hot":false},{"kind":"net","label":"github.com:443  sent 182 B","flag":"","children":[],"hot":false},{"kind":"net","label":"DNS lookups for github.com  2 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"head -3","flag":"","children":[],"hot":false}],"hot":false}],"preview":[],"truncated":0},"flow":{"package":{"name":"frame-security-scan","version":"","files":4,"kind":"skill"},"install":[],"has_install":false,"run":["ls -la","which -a frame","grep -i frame","ls /usr/local/bin /usr/bin","pip show frame","head -2"],"tools":[],"startup":"","partial":"","tool_calls":0,"agent_runs":1,"network":[{"host":"github.com","conns":2,"bytes":418,"leak":"","when":"while running","dns":false}],"secrets":[],"files":[],"has_graph":true},"confidence":""}}