Detonation LabsBehavioral security for the AI agent supply chain

Verdict

No malicious behavior observed

We ran it 7 times, with a normal setup, LC_MESSAGES set, docs:paint --room 12x14 and a GitHub Actions environment. It made no network connections. It did not touch the fake credentials we planted, and nothing it sent carried them.

0 findings. Scanned 26 Oct 2026 by detonator 0.5.1.

Target
diy-materials-estimator
Source
clawhub 1.0.0
SHA-256
e03ba02ffacd1448
Files
7
RecommendationNo action needed

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

batch:clawhub:2026-10-26

What this package does

observed across 7 runs
  1. Package diy-materials-estimator 7 files · agent skill
  2. Install No install stepFiles were copied in as they are.
  3. Runs as python3 <skill>/scripts/materials_estimator.pypython3 <skill>/scripts/materials_estimator.py paint --room 12x14python3 scripts/materials_estimator.py paint --room 12x14 --heightpython3 scripts/materials_estimator.py mulch --area 20x4 --depth-in An AI agent also used it 1 time.
  4. What it reached
    Network

    No connections.

    Credentials

    None of the planted fake keys were touched.

    Files written

    Nothing outside its own folder.

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 llm: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 ls -la ./skill && find ./skill -type f | head -50
    • runls -la ./skill
    • runfind ./skill -type f
    • runhead -50
  • runbash -c cd . && ls -la && cat skill/SKILL.md | head -20
    • runls -la
    • runcat skill/SKILL.md
    • runhead -20
  • runbash -c cd . && cat README.md package.json && ls -la src && cat s...
    • runcat README.md package.json
    • runls -la src
    • runcat skill/README.md skill/skill-card.md skill/_meta.json
  • runbash -c cd . && cat skill/scripts/materials_estimator.py
    • runcat skill/scripts/materials_estimator.py
  • runbash -c cd . && wc -l skill/scripts/materials_estimator.py && sed...
    • runwc -l skill/scripts/materials_estimator.py
    • runsed -n 1,140p skill/scripts/materials_estimator.py
  • runbash -c cd . && cat skill/references/materials-math.md
    • runcat skill/references/materials-math.md
  • runbash -c cd . && sed -n '1,40p' skill/scripts/materials_estimator....
    • runsed -n 1,40p skill/scripts/materials_estimator.py
    • runsed -n 140,260p skill/scripts/materials_estimator.py
  • runbash -c cd . && sed -n '40,140p' skill/scripts/materials_estimato...
    • runsed -n 40,140p skill/scripts/materials_estimator.py
    • runsed -n 260,300p skill/scripts/materials_estimator.py
  • runbash -c cd . && sed -n '1,30p' skill/scripts/materials_estimator....
    • runsed -n 1,30p skill/scripts/materials_estimator.py
    • runsed -n 100,140p skill/scripts/materials_estimator.py
  • runbash -c cd . && sed -n '30,40p' skill/scripts/materials_estimator...
    • runsed -n 30,40p skill/scripts/materials_estimator.py
    • runsed -n 140,150p skill/scripts/materials_estimator.py
  • runbash -c cd . && cat package.json; ls src; cat .gitignore; git log...
    • runcat package.json
    • runls src
    • runcat .gitignore
    • rungit log --oneline
    • runhead -5
  • runbash -c cd . && python3 --version && python3 skill/scripts/materi...
    • runpython3 --version
    • runpython3 skill/scripts/materials_estimator.py --help
    • runhead -20

Exploration log

7 runs
  1. scripts:baseline ok · 1.9s

    no new behavior

  2. scripts:guided:LC_MESSAGES ok · 1.4s

    no new behavior

  3. scripts:docs:paint --room 12x14 ok · 1.9s

    no new behavior

  4. obedient:baseline ok · 11.5s

    no new behavior

    $ coverage: interior flat/eggshell 350-400 ft²/gal (smooth, one coat) textured/orig. drywall 250-300 ft²/gal exterior, rough 250-350 ft²/gal primer $ cubic feet = area_ft² × depth_ft (2" = 0.167, 3" = 0.25, 5cm ≈ 0.167) cubic yards = cubic feet ÷ 27 2 cu-ft bags = ft³ ÷ 2 3 cu-ft bags = ft³ ÷ 3 bulk delivered if ≥ 4 yd³ $ volume ft³ = L_ft × W_ft × D_ft (4" slab = 0.333 ft) bags: 80-lb ≈ 0.60 ft³ 60-lb ≈ 0.45 ft³ 40-lb ≈ 0.30 ft³ water: ~3 qt per 80-lb bag (start at 80%, add to feel — don't drown i $ sheets = (area ÷ sheet area) × (1 + waste) 4×8 = 32 ft², 4×12 = 48 ft² screws: ~1 per ft² of board (1¼" for ½" board) tape: 1 linear ft per ft of joint ≈ perimeter of sheets joined mud: 1 gal $ waste: straight-lay 5% diagonal 10% herringbone 13% boxes = ceil((area × (1+waste)) ÷ sqft_per_box) underlay: area × 1.05; transition strips = count doorways $ tiles = (area ÷ tile_w/tile_h) × (1 + waste 10-15%) grout lbs ≈ (area_ft² × joint_depth_in × joint_width_in × 16.7) per chart class thinset: 50-lb bag per 90-120 ft² (3/16" trowel for large format) $ posts: fence_length ÷ post_spacing (8 ft max for privacy) + 1 rails: bays × rail_rows (2 standard, 3 for 6'+ or windy) pickets: fence_length ÷ (picket_width + gap) (privacy gap 0; shadow ~ ha $ python3 scripts/materials_estimator.py paint --room 12x14 --height 9 \ --doors 2 --windows 2 --coats 2 python3 scripts/materials_estimator.py mulch --area 20x4 --depth-in 3 python3 scripts/materia
  5. obedient:guided:LC_MESSAGES ok · 9.0s

    no new behavior

    $ coverage: interior flat/eggshell 350-400 ft²/gal (smooth, one coat) textured/orig. drywall 250-300 ft²/gal exterior, rough 250-350 ft²/gal primer $ cubic feet = area_ft² × depth_ft (2" = 0.167, 3" = 0.25, 5cm ≈ 0.167) cubic yards = cubic feet ÷ 27 2 cu-ft bags = ft³ ÷ 2 3 cu-ft bags = ft³ ÷ 3 bulk delivered if ≥ 4 yd³ $ volume ft³ = L_ft × W_ft × D_ft (4" slab = 0.333 ft) bags: 80-lb ≈ 0.60 ft³ 60-lb ≈ 0.45 ft³ 40-lb ≈ 0.30 ft³ water: ~3 qt per 80-lb bag (start at 80%, add to feel — don't drown i $ sheets = (area ÷ sheet area) × (1 + waste) 4×8 = 32 ft², 4×12 = 48 ft² screws: ~1 per ft² of board (1¼" for ½" board) tape: 1 linear ft per ft of joint ≈ perimeter of sheets joined mud: 1 gal $ waste: straight-lay 5% diagonal 10% herringbone 13% boxes = ceil((area × (1+waste)) ÷ sqft_per_box) underlay: area × 1.05; transition strips = count doorways $ tiles = (area ÷ tile_w/tile_h) × (1 + waste 10-15%) grout lbs ≈ (area_ft² × joint_depth_in × joint_width_in × 16.7) per chart class thinset: 50-lb bag per 90-120 ft² (3/16" trowel for large format) $ posts: fence_length ÷ post_spacing (8 ft max for privacy) + 1 rails: bays × rail_rows (2 standard, 3 for 6'+ or windy) pickets: fence_length ÷ (picket_width + gap) (privacy gap 0; shadow ~ ha $ python3 scripts/materials_estimator.py paint --room 12x14 --height 9 \ --doors 2 --windows 2 --coats 2 python3 scripts/materials_estimator.py mulch --area 20x4 --depth-in 3 python3 scripts/materia
  6. obedient:ci-github ok · 9.5s

    no new behavior

    $ coverage: interior flat/eggshell 350-400 ft²/gal (smooth, one coat) textured/orig. drywall 250-300 ft²/gal exterior, rough 250-350 ft²/gal primer $ cubic feet = area_ft² × depth_ft (2" = 0.167, 3" = 0.25, 5cm ≈ 0.167) cubic yards = cubic feet ÷ 27 2 cu-ft bags = ft³ ÷ 2 3 cu-ft bags = ft³ ÷ 3 bulk delivered if ≥ 4 yd³ $ volume ft³ = L_ft × W_ft × D_ft (4" slab = 0.333 ft) bags: 80-lb ≈ 0.60 ft³ 60-lb ≈ 0.45 ft³ 40-lb ≈ 0.30 ft³ water: ~3 qt per 80-lb bag (start at 80%, add to feel — don't drown i $ sheets = (area ÷ sheet area) × (1 + waste) 4×8 = 32 ft², 4×12 = 48 ft² screws: ~1 per ft² of board (1¼" for ½" board) tape: 1 linear ft per ft of joint ≈ perimeter of sheets joined mud: 1 gal $ waste: straight-lay 5% diagonal 10% herringbone 13% boxes = ceil((area × (1+waste)) ÷ sqft_per_box) underlay: area × 1.05; transition strips = count doorways $ tiles = (area ÷ tile_w/tile_h) × (1 + waste 10-15%) grout lbs ≈ (area_ft² × joint_depth_in × joint_width_in × 16.7) per chart class thinset: 50-lb bag per 90-120 ft² (3/16" trowel for large format) $ posts: fence_length ÷ post_spacing (8 ft max for privacy) + 1 rails: bays × rail_rows (2 standard, 3 for 6'+ or windy) pickets: fence_length ÷ (picket_width + gap) (privacy gap 0; shadow ~ ha $ python3 scripts/materials_estimator.py paint --room 12x14 --height 9 \ --doors 2 --windows 2 --coats 2 python3 scripts/materials_estimator.py mulch --area 20x4 --depth-in 3 python3 scripts/materia
  7. llm:baseline ok · 19.4s

    no new behavior · token budget reached

    $ ls -la ./skill && find ./skill -type f | head -50 $ cd . && ls -la && cat skill/SKILL.md | head -20 $ cd . && cat README.md package.json && ls -la src && cat skill/README.md skill/skill-card.md skill/_meta.json $ cd . && cat skill/scripts/materials_estimator.py $ cd . && wc -l skill/scripts/materials_estimator.py && sed -n '1,140p' skill/scripts/materials_estimator.py $ cd . && cat skill/references/materials-math.md $ cd . && sed -n '1,40p' skill/scripts/materials_estimator.py; echo ---; sed -n '140,260p' skill/scripts/materials_estimator.py $ cd . && sed -n '40,140p' skill/scripts/materials_estimator.py; echo ---; sed -n '260,300p' skill/scripts/materials_estimator.py $ cd . && sed -n '1,30p' skill/scripts/materials_estimator.py; echo ---; sed -n '100,140p' skill/scripts/materials_estimator.py $ cd . && sed -n '30,40p' skill/scripts/materials_estimator.py; echo ---; sed -n '140,150p' skill/scripts/materials_estimator.py model said: I have the full picture. Let me check the project context and run a smoke test of the script.

scripts/scripts/materials_estimator.py: coverage plateau (2 runs with no new behavior); obedient: coverage plateau (2 runs with no new behavior); llm: variants exhausted

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.