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
Nothing observed calls for action. This is evidence, not a guarantee.
batch:clawhub:2026-10-26
What this package does
observed across 7 runs- Package diy-materials-estimator 7 files · agent skill
- Install No install stepFiles were copied in as they are.
- 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.
-
What it reached
Network
No connections.
CredentialsNone of the planted fake keys were touched.
Files writtenNothing 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:baselineEvery 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-
scripts:baseline ok · 1.9s
no new behavior
-
scripts:guided:LC_MESSAGES ok · 1.4s
no new behavior
-
scripts:docs:paint --room 12x14 ok · 1.9s
no new behavior
-
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 -
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 -
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 -
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
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.