Detonation LabsBehavioral security for the AI agent supply chain

Verdict

No malicious behavior observed

We ran it 8 times, with a normal setup, NIMBLE_AGENT_ID and NIMBLE_CONFIG and WATCH_REPORT_DEPENDENCIES set, NIMBLE_NO_LOG=1 set, JEST_WORKER_ID and NIMBLE_AGENT_ID and NIMBLE_CONFIG and NODE_V8_COVERAGE… set and NIMBLE_AGENT_ID and NIMBLE_CONFIG and SKILL set. It made no network connections. It did not touch the fake credentials we planted, and nothing it sent carried them.

0 findings. Scanned 27 Oct 2026 by detonator 0.5.1.

Target
nimble-decision
Source
clawhub 0.1.0
SHA-256
9ecc6403431667a5
Files
6
RecommendationNo action needed

Nothing observed calls for action. This is evidence, not a guarantee.

batch:clawhub:2026-10-27

What this package does

observed across 8 runs
  1. Package nimble-decision 6 files · agent skill
  2. Install No install stepFiles were copied in as they are.
  3. Runs as node <skill>/nimble.mjsnode <skill>/tests/eval.mjsnode /nimble.mjs --set-model nimble-v3:9bnode /nimble.mjs --logs
  4. What it reached
    Network

    No connections.

    Credentials

    None of the planted fake keys were touched.

    Files written
    • ./true/coverage-13-1793106824982-0.jsonwritten

We planted fake AWS, SSH, npm and GitHub keys and a .env file before every run. Red means something left or was planted to run later.

Findings

No findings. Detonator observed no malicious or suspicious behavior in the runs below.

Process tree

run obedient:baseline

Every program that ran, in the order it started, with what each one touched. Red marks the path to a leak or a planted file.

Show process tree
  • runbash -c node "$SKILL/nimble.mjs" --set-model nimble-v3:9b
    • runnode /nimble.mjs --set-model nimble-v3:9b
  • runbash -c node "$SKILL/nimble.mjs" --logs # 最è...
    • runnode /nimble.mjs --logs
    • runnode /nimble.mjs --logs --limit 50
    • runnode /nimble.mjs --logs --status error
    • runnode /nimble.mjs --logs --agent coder
    • runnode /nimble.mjs --logs --kind eval
    • runnode /nimble.mjs --logs --limit 5 --json
  • runbash -c TIME AGENT KIND MODEL TYPES ...
  • runbash -c jq -s 'group_by(.model)[] | {model: .[0].model, n: length...
    • runjq -s group_by(.model)[] | {model: .[0].model, n: length, avgMs... logs/calls.jsonl
    • runjq -r select(.status=="error") | .agent logs/calls.jsonl
    • runsort
    • rununiq -c
  • runbash -c SKILL=/path/to/nimble-decision # 本 SKILL.md 所在目...
    • runnode /path/to/nimble-decision/nimble.mjs --check
    • runnode /path/to/nimble-decision/nimble.mjs --eval
    • runnode /path/to/nimble-decision/nimble.mjs --agent coder {"state":"我要退款,订单 12345","questions":{"need...
    • runnode /path/to/nimble-decision/nimble.mjs --state-file doc.txt {"questions":{"is_complaint":{"type":"noul","instructions...
    • runnode /path/to/nimble-decision/nimble.mjs --answers-only {"state":"...","questions":{...}}
    • runnode /path/to/nimble-decision/nimble.mjs
  • runbash -c node "$SKILL/nimble.mjs" --check # 主机 / 模型 /...
    • runnode /nimble.mjs --check
    • runnode /nimble.mjs --selftest
    • runnode /nimble.mjs --eval

Exploration log

8 runs
  1. scripts:baseline ok · 1.5s

    no new behavior

  2. scripts:guided:NIMBLE_AGENT_ID,NIMBLE_CONFIG,WATCH_REPORT_DEPENDENCIES ok · 1.0s

    no new behavior

  3. scripts:guided:NIMBLE_NO_LOG=1 ok · 1.1s

    no new behavior

  4. scripts:baseline ok · 3.2s

    no new behavior

  5. scripts:guided:JEST_WORKER_ID,NIMBLE_AGENT_ID,NIMBLE_CONFIG,NODE_V8_COVERAGE… ok · 1.3s

    new behavior: write:./true/coverage-13-*-0.json

  6. scripts:guided:NIMBLE_NO_LOG=1 ok · 1.7s

    no new behavior

  7. scripts:guided:NIMBLE_AGENT_ID,NIMBLE_CONFIG,SKILL ok · 0.9s

    no new behavior

  8. obedient:baseline ok · 15.2s

    no new behavior

    $ node "$SKILL/nimble.mjs" --set-model nimble-v3:9b $ node "$SKILL/nimble.mjs" --logs # 最近 20 条,表格 node "$SKILL/nimble.mjs" --logs --limit 50 # 最近 50 条 node "$SKILL/nimble.mjs" --logs --status error # 只看失败 node "$SKILL/nimb $ TIME AGENT KIND MODEL TYPES STATUS MS 16:54:45 coder call nimble-v3:9b score ok 2058 16:54:54 coder eval nimble-v3:9b acc 100% ok $ jq -s 'group_by(.model)[] | {model: .[0].model, n: length, avgMs: (map(.durationMs)|add/length)}' logs/calls.jsonl jq -r 'select(.status=="error") | .agent' logs/calls.jsonl | sort | uniq -c $ SKILL=/path/to/nimble-decision # 本 SKILL.md 所在目录 S="$SKILL/nimble.mjs" node "$S" --check node "$S" --eval node "$S" --agent coder '{"state":"我要退款,订单 12345","questions":{"needs_human":{"type":"noul", $ node "$SKILL/nimble.mjs" --check # 主机 / 模型 / 冒烟 / 评测状态 / 日志路径 node "$SKILL/nimble.mjs" --selftest # PASS noul / PASS choice / PASS score node "$SKILL/nimble.mjs" --eval # 12 例准确率(换模型自动跑)

scripts/nimble.mjs: coverage plateau (2 runs with no new behavior); scripts/tests/eval.mjs: coverage plateau (2 runs with no new behavior); obedient: run budget spent; llm: run budget spent

Note

Observed behavior only. A clean result does not prove a package is safe. Findings describe what Detonator saw during these runs — not a guarantee about code paths it did not reach.