Skip to content

Add drop-test protocol, Edison synthesis, and first-data analysis - #82

Draft
sgbaird with Copilot wants to merge 16 commits into
copilot/get-video-drop-test-datafrom
copilot/add-drop-test-protocol
Draft

Add drop-test protocol, Edison synthesis, and first-data analysis#82
sgbaird with Copilot wants to merge 16 commits into
copilot/get-video-drop-test-datafrom
copilot/add-drop-test-protocol

Conversation

Copilot AI commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Issue is operational (coordinating the first crush/drop tests on Jeff Hill's tower) and this repo is the LaTeX MRG proposal with no code or existing test-protocol surface. This PR consolidates the moving parts from the issue thread, adds a literature synthesis, and analyzes the recorded accelerometer data.

Added

  • docs/drop-test-protocol.md — single source of truth for the drop-test setup, covering:

    • Equipment + links to the TP4 Quick Start / User's Guide PDFs attached on the issue and the training video (https://youtu.be/RNjpAmWWmkQ)
    • The tower is bungee-assisted (base accelerates past 1 g): §3.1 reframes the pre-impact specimen lift-off as intrinsic rig physics rather than a setup artifact, and §5 leads with Jeff's first-pass fix (cap how far the specimen's top can rise relative to the base) plus tie-to-base options
    • Quantities of interest tied to the BO objective stack: g_max, SEA, full ~10 s ringdown (not just the 200 ms shock), reusability, slow-mo framing from t=0
    • Failure modes from the first instrumented drop: bungee-driven specimen lift-off pre-impact, ~25° cage tilt from loose rod/hole clearance, slow-mo starting after hoist release
    • @sgbaird's three-test next-iteration plan: bare specimen → plate-only (uninstrumented) → instrumented cage drop
    • Mitigations: constrain specimen to base / cap upward travel, tighter rod/plate tolerance (re-drill or thin metal plates, optionally linear bushings), top-plate retention clips, longer-term vertex-mounted accelerometer inside an acrylic cage, independent lab access for all three students
    • Cross-references to companion modalities out of scope for the first drop (high-speed camera, shaker transfer function, slug-firing gas gun, Polytec LDV)
  • edison-trajectories/drop-test/ — Edison Scientific LITERATURE_HIGH synthesis (task 653d7d39) on drop-tower troubleshooting for small 3D-printed lattice/tensegrity specimens: ~57 KB report, full JSON dump, submission record, and README. Idempotent driver at scripts/edison/submit_drop_test.py. Surfaces a standards stack (ASTM D5276/D7136/D3332, ISO 6603/1683/5347, MIL-STD-810 method 516, SAE J211) and recommendations (linear sleeve bearings, magnetic/elastic top-plate hold-down, ≥10 s ring-buffer DAQ, SAE J211 CFC filtering, n ≥ 5 + CV, ≥5000 fps DIC; closest analogues Pajunen 2019, Dwyer 2023).

  • First drop-test data analysis of the five TP4 accelerometer exports posted by @me-madsen (Signal 10–14, 4-channel, 125 kHz, 0.2 s window):

    • data/drop-tests/raw/ — committed raw export files
    • scripts/analysis/drop_test_analysis.py — loader, SAE J211 CFC-1000 / CFC-180 filtering, peak/pulse/PSD metrics, and figure generation
    • data/drop-tests/figures/ — full-window CH1 overlay, per-run impact zoom (raw vs filtered), peak-g bar chart, PSD, and CH4 trigger-artifact plot
    • docs/drop-test-analysis.md + data/drop-tests/README.md — findings: the "audrey" tensegrity specimen reduces CFC-180 peak acceleration ~74–79 % vs the no-specimen control (~370–463 G vs ~1,792 G), while the PETG run's raw peak is within ~1 % of the control (≈ direct plate-on-plate hit), strong evidence of the bungee-driven lift-off; CH4 carries a fixed ~1.4 kG trigger/release artifact at t≈4.2 ms in every run. Caveats noted: unconfirmed channel map, 200 ms window only, n = 1 for control/PETG, no Δv/SEA quoted yet.
  • Vertex vs. acrylic-plate T3-prism drop-test data and analysis posted by @ctrhjk (PR Add drop-test protocol, Edison synthesis, and first-data analysis #67), under data/drop-tests/vertex-acrylic/:

    • raw/ — eight TP4 exports {n0jdwk, m6cyoq, T3_0103, T3_0000}_Signal{1,2}.csv (Signal1 = vertex-mounted, Signal2 = acrylic-plate), single drop per configuration at 13 ft, 200 ms / 125 kHz
    • README.md — channel map (CH1 removed; CH2–CH4 tri-axis; CH5 single-axis; CH4 = 1000 G trigger) with full-scale/sensitivity per channel, per-specimen file index, and @ctrhjk's observations (clip-height/no-trigger issue, hot-glue z-axis mount limitation, m6cyoq strut and T3_0103 TPU-tendon damage after the acrylic test, and the invalid T3_0000 acrylic run where the accelerometer fell off)
    • scripts/analysis/drop_test_vertex_acrylic_analysis.py — locates the impact via the triggered CH4 channel (windowed ±1.5 ms peak search in the first 10 ms, not a global max), baseline-corrects, and reports raw / SAE J211 CFC-1000 / CFC-180 peaks for the single-axis CH5 (primary go-forward sensor) and tri-axis CH4, auto-flagging invalid / no-clean-impact runs
    • data/drop-tests/vertex-acrylic/figures/ — vertex-vs-acrylic CH5 impact windows, CFC-180 peak-g bar chart, and vertex CH5 PSD
    • docs/drop-test-vertex-acrylic-analysis.md — findings + an explicit SOP / test-method section: vertex mounting is repeatable (4/4 clean, CFC-180 229–284 G, CV ≈ 9 %) while the acrylic configuration is not (3/4 runs registered no clean impact — clips too low so the plate seats on the specimen, plus the fell-off T3_0000); the vertex peaks do not yet discriminate geometry so fresh intact distinct-geometry samples (vertex-only, n ≥ 5) are needed before peak-g is a trustworthy BO objective; replace the hot-glue mount with a z-axis-aligned seat; and the single-axis sensor's raw peaks reach 70–90 % of its 9,442.9 G full scale (near saturation on the m6cyoq-acrylic run). Caveats: n = 1 per (specimen, mount), 200 ms window only, partial-pulse Δv, unconfirmed CH4/CH5 axis correspondence.
  • Clip-height sweep & base-plate accelerometer-check diagnostic posted by @ctrhjk, under data/drop-tests/clip-height/ — drilling into why the acrylic-plate configuration repeatedly fails to trigger:

    • raw/Accelerometer_check_Signal1.csv + README.md — the one triggered base-plate CSV (tri-axis on the bottom plate, 13 in drop) plus a setup README documenting both experiments: the clip-height sweep (extra bungees cured fly-off; tri-axis on the acrylic plate; clips at 0.5/1/1.5/2 in, two drops each; 0/8 drops triggered, video only) and the base-plate accelerometer check, with the shared channel map
    • scripts/analysis/drop_test_clip_height_analysis.py + data/drop-tests/clip-height/figures/ — windowed CH4 impact location, SAE J211 CFC-1000 / CFC-180 peak/pulse/Δv metrics, and figures (base-plate impact window, full-window CH4, PSD)
    • docs/drop-test-clip-height-analysis.md — findings: the base-plate hit triggers cleanly (CH4 raw 3072 G ≈ 3.1× the 1000 G trigger, CFC-180 280 G, Δv ≈ 3.3 m/s; CH4 dominates the off-axis channels ~23–55×), so the acrylic-plate "no trigger" failure (0/8 across the clip sweep) is a load-path problem — the plate seats on / is damped by the bungee-restrained specimen — not the sensor, DAQ, or trigger level.
  • Input-output (transmissibility) drop-test data and analysis posted by @ctrhjk (PR Add drop-test protocol, Edison synthesis, and first-data analysis #67), under data/drop-tests/input-output/@ctrhjk's input-output instrumentation design: a single-axis accelerometer on the bottom plate = input (now the triggered channel CH5), a tri-axis accelerometer hot-glued to the top vertex = output (CH2–CH4), bungees removed, four distinct-geometry specimens (practice, n0jdwk, yqpmx1, h8Lbev) each dropped five times at 13 in:

    • raw/ — 20 TP4 exports {practice,n0jdwk,yqpmx1,h8Lbev}_Signal{1..5}.csv (Signal index = drop number) + README.md with the channel map (trigger moved to the single-axis input CH5) and @ctrhjk's setup notes
    • scripts/analysis/drop_test_input_output_analysis.py — locates the impact on the triggered CH5 (windowed ±1.5 ms peak), baseline-corrects, and reports raw / SAE J211 CFC-1000 / CFC-180 peaks for the input (CH5) and the tri-axis output resultant, the transmissibility T = output/input, pulse width and Δv, with per-specimen mean ± 1σ / CV aggregates
    • data/drop-tests/input-output/figures/ — input-vs-output impact windows (5 drops overlaid), transmissibility bar chart, input repeatability, output PSD
    • docs/drop-test-input-output-analysis.md — findings: the input-output design works — 20/20 drops triggered cleanly, removing the bungees makes the input nearly constant (235–248 G CFC-180, ≤1.7 % CV), and transmissibility now discriminates geometry (yqpmx1 ≈ 0.96 is the only attenuator, h8Lbev ≈ 1.09, practice/n0jdwk ≈ 1.17–1.19), making T (or output-peak-at-fixed-input) a usable BO objective; a mild within-run drift across the five cyclic drops is flagged as most likely hot-glue-mount-driven. Caveats: n = 1 specimen per geometry (5 repeat drops), 200 ms window, unverified tri-axis orientation, IDs not yet tied back to design parameters
    • edison-trajectories/input-output/ — Edison Scientific ANALYSIS (task fe044079) that independently reproduced the transmissibility values exactly to two decimals, confirmed the within-run drift is statistically real and mount-driven (pooled +0.015/drop, p = 0.0001), endorsed T as a first-pass screening objective (recommending FRF / SRS-band metrics and output-peak-at-fixed-input as it matures), and gave a prioritized SOP (rigid z-aligned keyed sensor seat, keep bungees removed, extend capture past 200 ms, n ≥ 5 distinct prints per geometry with randomized order, anchor in SAE J211 / ISO 5347 / ASTM D3332). Idempotent driver scripts/edison/submit_input_output.py + fetch scripts/edison/fetch_input_output.py; a cross-check section is folded into the analysis doc.
  • 2nd 30-drop check run (check2) data + same-problem diagnosis, picking up the analysis that the earlier (claude) runs stalled on, under data/drop-tests/200drops-check2/ — 30 further auto-drops (check2_Signal233–262, specimen 7xadt6, 10 in, CH5 trigger) posted by @ctrhjk to check whether the three 200-drop-campaign problems still exist:

    • raw/ — the 30 committed check2_Signal{233..262}.csv TP4 exports + README.md (channel map, setup, continuity with 200drops-check)
    • scripts/analysis/drop_test_200drops_check2_analysis.py — re-runs the identical three-problem + ~122 Hz diagnostics (windowed impact peak, SAE J211 CFC filtering, saturation audit, OLS trends) and compares against the first check run
    • data/drop-tests/200drops-check2/figures/ — three-problem panel, T = TOP/CH5 and ~122 Hz band-power plots, plus machine-readable metrics JSON
    • docs/drop-test-200drops-check2-analysis.md — diagnosis: BOT electrical dropout stays fixed (alive 30/30, quieter noise floor); CH7/CH8 over full scale at 10 in persists (medians ≈100 % FS, still clipping); CH5 tape coupling persists (T durably ~1.083 vs healthy 1.025); the ~122 Hz ringdown mode has not returned (all ~549 Hz)
  • Raw-data completeness audit across the whole PR thread — cross-checked every attachment in all PR Add drop-test protocol, Edison synthesis, and first-data analysis #67 comments against committed data and confirmed all raw CSVs are now committed and organized, one dataset per data/drop-tests/<name>/raw/ folder (vertex-acrylic, clip-height, input-output, key-mounted, key-mounted-wax, burn-in-wax, drift-calibration, drift-calibration2, 30drops-real, 100drops, ch4-trigger, 5in-100drops, 200drops, 200drops-check, and the newly-added 200drops-check2). check2 was the only genuinely missing set; a few others were already committed under case-normalized names (same files).

@sgbaird

sgbaird commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

@claude are you able to work on this new PR?

@claude

claude Bot commented Jul 13, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 1m 24s —— View job


Yes — I'm able to work on this PR ✅

I successfully checked out copilot/add-drop-test-protocol, read the repo, and I have working git access, so whatever was going wrong with the Claude pings on #67 isn't affecting this PR. Feel free to send tasks here.

Current state of this branch

  • Gather context (branch state, diff vs base, repo guidelines)

  • Confirm ability to work on this PR and report current state

  • This PR currently contains only Copilot's "Initial plan" commit (51bd1fe), which is emptygit diff origin/copilot/get-video-drop-test-data...HEAD shows 0 changed files, which matches the "0 files changed" shown in the PR header. No actual work has landed here yet.

  • The base branch (copilot/get-video-drop-test-data, PR Add drop-test protocol, Edison synthesis, and first-data analysis #67) already has a well-organized data tree: 639 CSVs under data/drop-tests/ split into per-experiment directories (burn-in-wax, 30drops-real, 100drops, 200drops, 200drops-check, drift-calibration, drift-calibration2, vertex-acrylic, key-mounted-wax, ch4-trigger, clip-height, 5in-100drops, etc.), each with raw/ and figures/ subdirectories, plus 18 analysis docs in docs/ and a data/drop-tests/README.md.

Ready when you are

Per the triggering comment on #67, the outstanding asks appear to be: (1) pick up the analysis where the earlier Claude run left off, and (2) verify that all raw CSV files posted across PR #67's comments are committed and organized on the branch. I can do both here — just @-mention me with the go-ahead (or point me at any specific comment attachments you want cross-checked), and I'll audit the committed CSVs against the PR #67 comment history and commit anything missing.

Copilot AI changed the title [WIP] Add drop-test protocol, Edison synthesis, and first-data analysis Add drop-test protocol, Edison synthesis, and first-data analysis Jul 13, 2026
Copilot AI requested a review from sgbaird July 13, 2026 23:21
@sgbaird

sgbaird commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Per the triggering comment on #67, the outstanding asks appear to be: (1) pick up the analysis where the earlier Claude run left off, and (2) verify that all raw CSV files posted across PR #67's comments are committed and organized on the branch. I can do both here — just @-mention me with the go-ahead (or point me at any specific comment attachments you want cross-checked), and I'll audit the committed CSVs against the PR #67 comment history and commit anything missing.

@claude Yes, do this. Make sure you're using the GitHub CLI or similar so that you're not missing hidden comments on a pull request

@ctrhjk looks like for whatever reason, we won't be able to use the prior pull request. Maybe has something to do with how many comments we've put on there 😅

@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 8m 25s —— View job


Audit complete — all raw data from PR #67 is committed, verified byte-for-byte ✅

  • Gather context (branch state, prior commits, no CLAUDE.md in repo)
  • Fetch all PR Add drop-test protocol, Edison synthesis, and first-data analysis #67 comments via paginated gh api (98 issue comments, 0 review comments, 0 reviews — well beyond what the collapsed UI shows)
  • Extract every raw-data attachment (CSV/ZIP) URL from the thread
  • Cross-check each attachment against files committed under data/drop-tests/
  • Download + commit anything missing → nothing was missing
  • Confirm the check2 analysis is complete
  • Push and post final summary

1. Data-completeness audit (via GitHub API, full pagination)

I fetched all 98 issue comments plus the PR body, review comments, and reviews for #67 through gh api --paginate, so nothing hidden by the UI's comment collapsing was skipped. That surfaced 436 attachment links: 329 CSV links (269 unique URLs — the two check-run batches were each posted twice), 16 ZIP links, and 91 image/video assets links.

I then downloaded every one of the 269 unique CSV URLs and all 16 ZIPs and SHA-256-compared them against the committed files, not just name-matched:

Source Verified Result
Loose CSV attachments 269/269 byte-identical to committed files
ZIP contents (drop{1..4}.zip ×2 postings, 200drops_{1..8}.zip) 400/400 CSVs byte-identical to committed 100drops/, 5in-100drops/, 200drops/
Committed CSVs not traceable to an attachment 0 of 669 every committed file accounted for, both directions

Notes resolved along the way:

  • Key mounted2_Signal{7..11}.csv looked missing by name but is committed as key-mounted-wax/raw/key_mounted_wax_Signal{7..11}.csv — a documented rename (see that dataset's README); hashes confirm they're the exact posted files.
  • n0jdwk_Signal{1,2}.csv exists in two datasets (vertex-acrylic and input-output) with the same filename; hashes confirm each committed copy matches its respective posted attachment.
  • prc1kn-health/ has no raw/ by design — it's a derived cross-dataset health check (scripts/analysis/drop_test_prc1kn_health_check.py).
  • The 91 assets links are setup photos and slow-mo videos, which aren't committed (the video-derived kinematics live in docs/drop-test-video-analysis.md).

Verdict: no gaps. All 669 raw CSVs on the branch are byte-identical to what was posted on the thread, and no posted CSV/ZIP is absent from the repo. @sgbaird this branch is safe to use as the new home for the thread — the full data record from #67 is here.

2. Picking up where the earlier Claude runs stalled

The stalled runs were on @ctrhjk's check2 ask (#67 comment: "another 30 drops… diagnose whether the same problem exists"). That work already landed on this branch in ce2f003 and I verified it's complete: data/drop-tests/200drops-check2/ (30 raw CSVs + README + figures + metrics JSON), scripts/analysis/drop_test_200drops_check2_analysis.py, and docs/drop-test-200drops-check2-analysis.md. TL;DR of its diagnosis: BOT electrical dropout stays fixed (30/30 alive, quieter noise floor), CH7/CH8 over full scale at 10 in persists, CH5 tape-coupling bias persists (T ≈ 1.083), and the ~122 Hz ringdown mode has not returned.

3. What I changed (1 commit, 07b9b1a)

The top-level data/drop-tests/README.md was stale (it only described the original May 22 Signal 10–14 exports), so I rewrote it into a chronological index of all 17 dataset folders — file counts, one-line setup summaries, links to each analysis doc — plus a provenance section recording this byte-level audit.

--- · Branch

…e-level (SHA-256) completeness audit of every PR #67 attachment

Co-authored-by: Sterling G. Baird <45469701+sgbaird@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sgbaird

sgbaird commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

@claude do what Jinkwan was requesting in that other PR this was based on

436 attachment links

Double check this. Sometimes you say things are identical but they're actually not

Make sure that you aren't missing files or commits from that old branch to this new branch

@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 5m 30s —— View job


Re-verified from scratch — all three checks pass, nothing missing ✅

  • Gather context (branches, full PR Add drop-test protocol, Edison synthesis, and first-data analysis #67 history via paginated gh api)
  • Do what Jinkwan (@ctrhjk) requested — verify the check2 30-drop diagnosis is real
  • Double-check the "436 attachment links" audit — independent re-extraction, re-download, re-hash
  • Verify no files or commits are missing from the old branch (copilot/get-video-drop-test-data) on this branch
  • Final summary (no repo changes needed — everything checked out)

1. Jinkwan's request: check2 diagnosis — independently reproduced, numbers confirmed

Jinkwan's outstanding ask on #67 (comment, re-pinged here) was to analyze the 30 check2_Signal233–262 drops and diagnose whether the same three problems persist. That work landed in ce2f003, and rather than trust it, I re-ran scripts/analysis/drop_test_200drops_check2_analysis.py from a fresh environment: the committed 200drops_check2_metrics.json and both figure PNGs regenerated byte-identical (git tree stayed clean after the rerun), and every headline number in docs/drop-test-200drops-check2-analysis.md matches the fresh output exactly:

Problem Fresh re-run result Verdict
1 — BOT electrical dropout alive 30/30, pre-impact noise 0.100 G (was 0.346 G) stays fixed
2 — CH7/CH8 over FS at 10 in CH7 median 100.5 % FS, >FS on 16/30; CH8 median 99.3 % FS, >FS on 13/30 persists
3 — CH5 tape coupling T = TOP/CH5 = 1.083 (CV 0.82 %), vs healthy 1.025 persists
Watch — ~122 Hz mode 0/30 below 200 Hz, dominant mode 549 Hz (a few at 580 Hz) not back

2. The "436 attachment links" claim — re-derived independently, and it holds

I re-fetched the PR #67 body, all 98 issue comments, review comments (0), and reviews (0) via gh api --paginate, and re-extracted attachment URLs with a fresh regex pass: exactly 436 link occurrences — 329 CSV + 16 ZIP + 91 image/video assets links; deduplicating gives 269 unique CSV URLs and 16 unique ZIPs (the two 30-drop check batches were each posted twice with the same URLs, and 89 unique asset URLs).

Then, instead of reusing anything from the previous run, I re-downloaded all 285 unique file attachments fresh (644 MB of loose CSVs + 321 MB of ZIPs), extracted the ZIPs (400 member CSVs — drop{1..4}.zip ×2 postings and 200drops_{1..8}.zip), and SHA-256-hashed everything on both sides:

  • 669 attachment files ↔ 669 committed CSVs, a perfect 1:1 hash bijection. All 669 hashes are distinct on each side, every attachment hash exists in the repo, every committed CSV's hash exists among the attachments. Zero missing, zero extra, zero content mismatches.
  • No download was an HTML error page or truncated (all verified as real TP4 exports).
  • The renamed files (Key mounted2_Signal*key-mounted-wax/raw/key_mounted_wax_Signal*) match by content, so the rename claim is also confirmed.

So the earlier "byte-identical" claim was accurate — this time established from a clean re-download rather than asserted.

3. Old branch → new branch: nothing missing

Bottom line: Jinkwan's check2 analysis is complete and its numbers reproduce exactly; the 436-link count and the byte-level completeness audit both survive an independent redo; and this branch is a strict superset of the old one. No changes were needed, so nothing new was committed.

--- · Branch

@ctrhjk

ctrhjk commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

@claude

Based on your analysis in #67 (comment), present some reasons why the ch4 and ch5 triggers couldn't detect the acceleration in 5 in drop test.

@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @ctrhjk's task in 4m 13s —— View job


Why the CH4 and CH5 triggers (1000 G) missed the 5-in drops on 7xadt6

  • Gather context (referenced comment chain → the 5-in no-trigger question from the 200-drop campaign, §7 of docs/drop-test-200drops-analysis.md)
  • Pull the measured trigger margins from all committed campaigns (13 in, 10 in, 5 in)
  • Present the reasons, ranked by evidence
  • Post final answer (question only — no code/data changes needed)

First, the measured raw peaks vs. the 1000 G trigger level across the program — the trigger acts on the raw instantaneous signal, so these raw numbers (not the CFC-180 ones) are what matters:

run CH4 raw |peak| CH5 raw |peak| margin over 1000 G
RW5F61, 13 in (CH4-trigger, 50 drops) 3,239–3,655 G 5,500–8,100 G 3.2–8.1×
7xadt6, 10 in (200 drops) 2,951–5,370 G 3,609–6,245 G 3.0–6.2×
RW5F61, 5 in (100 drops) 1,433–1,865 G 1,964–3,104 G 1.43× worst case
7xadt6, 5 in (practice) no trigger no trigger < 1× on both

So at 5 in the margin was already nearly gone in the best-documented case, and on 7xadt6 it evidently crossed below 1. The likely reasons, ranked:

1. The 1000 G level left almost no margin at 5 in to begin with

The RW5F61 5-in campaign bottomed out at 1,433 G on CH4 — only 1.43× the level (5-in analysis §1). That analysis explicitly recommended lowering the trigger to ~500 G for 5-in work before the 7xadt6 practice drops happened. With only ~30 % of headroom, any one of the effects below is enough to kill the trigger; several likely stacked.

2. The raw spike collapses much faster than √h

√h scaling from 7xadt6's 10-in peaks predicts ~2.1–3.8 kG (CH4) and ~2.6–4.4 kG (CH5) at 5 in — "safely" above 1000 G. But the raw spike is a short bottoming-out transient that is strongly nonlinear in drop energy: measured 13 → 5 in on RW5F61, CH4's raw peak fell to 0.47× where √h predicted 0.62× (the CFC-180 level only fell to ~0.73×). The trigger listens to exactly the part of the waveform that dies fastest as severity drops, so √h intuition systematically overestimates trigger margin at low heights.

3. 7xadt6 is a fresh, compliant print; RW5F61 was a stiff, exercised one

The 1.43× margin was measured on a failed print with ~280 cumulative drops — a much stiffer structure. A compliant intact tensegrity can absorb a 5-in impact without the sharp bottoming-out that generates the kG-scale spike at the TOP station, keeping CH4 sub-kG entirely. If this is what happened, it's actually useful signal (severity sweeps may discriminate geometry better than a fixed height) — reading 1 in the 200-drop analysis §7.

4. CH4 is a single axis of a demonstrably rotating tri-axis

The trigger fires on one axis, not the resultant, and both key seats rotate in their pockets (CH7 raw went 127 → 199 G at near-constant resultant; CH4's own raw peak drifted +24 % over the 5-in campaign while the resultant rose only ~9 %). Sensors were re-seated for the new specimen with orientation unverified — an unfavorable seat rotation on setup day takes tens of percent off the axis-projected raw peak, which the thin margin couldn't afford.

5. CH5's tape coupling attenuates exactly the frequencies the trigger needs

Tape is a compliant mount that low-passes the kHz content the raw spike is made of, and its state demonstrably moves around: the 200-drop campaign caught a mid-campaign CH5 excursion, and both check runs show the coupling durably stepped down ~6–8 % (T stuck at 1.083 vs healthy 1.025) — and that's at CFC-180; the attenuation of the raw high-frequency spike is larger. A soft/fresh tape layer on practice day plausibly shaved CH5's spike substantially.

6. A setup/load-path difference can't be excluded — and never can be

For CH5 in particular, the arithmetic is demanding: its weakest 10-in peak was 3,609 G, so missing at 5 in requires a collapse to < 28 % — steeper than anything measured from height alone. That points to a contribution from the coupling (reason 5) and/or a genuine rig difference at the 5-in setting. There's precedent for the latter: the clip-height experiment produced 0/8 no-trigger drops with a perfectly healthy sensor chain, purely from load path, and the release fixture at the 5-in setting was already flagged (the +9 % monotonic input hardening). The catch is structural: an untriggered drop records nothing, so no waveform exists to falsify any of this — which is itself the strongest argument for the fix below.

The fix (already in the SOP)

Trigger level, not height, is the severity knob. Pre-impact activity is ≤ 9–35 G in every campaign, so at 5 in a 300–500 G level restores ~3× margin with ≥ 10× clearance above the noise floor (even 100 G would be safe). If 5-in campaigns are wanted for 7xadt6-class fresh prints, drop the level first and run one practice capture to measure the actual raw peaks — that single waveform would tell us which of reasons 2–6 dominated.


Question-only task — no repo changes were made.
· Branch

@ctrhjk

ctrhjk commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

@claude

This test is to validate the 5in drop.

Trigger is still ch5, but the trigger level was lowered to 500G.
Drops were conducted 30 times for each 5 in height and 10 in height.

Compare those drop results, and suggest what drop height may be the best for the BO dropping test

5in drop:
5vs10_Signal1.csv
5vs10_Signal2.csv
5vs10_Signal3.csv
5vs10_Signal4.csv
5vs10_Signal5.csv
5vs10_Signal6.csv
5vs10_Signal7.csv
5vs10_Signal8.csv
5vs10_Signal9.csv
5vs10_Signal10.csv
5vs10_Signal11.csv
5vs10_Signal12.csv
5vs10_Signal13.csv
5vs10_Signal14.csv
5vs10_Signal15.csv
5vs10_Signal16.csv
5vs10_Signal17.csv
5vs10_Signal18.csv
5vs10_Signal19.csv
5vs10_Signal20.csv
5vs10_Signal21.csv
5vs10_Signal22.csv
5vs10_Signal23.csv
5vs10_Signal24.csv
5vs10_Signal25.csv
5vs10_Signal26.csv
5vs10_Signal27.csv
5vs10_Signal28.csv
5vs10_Signal29.csv
5vs10_Signal30.csv

10in drop:
5vs10_Signal31.csv
5vs10_Signal32.csv
5vs10_Signal33.csv
5vs10_Signal34.csv
5vs10_Signal35.csv
5vs10_Signal36.csv
5vs10_Signal37.csv
5vs10_Signal38.csv
5vs10_Signal39.csv
5vs10_Signal40.csv
5vs10_Signal41.csv
5vs10_Signal42.csv
5vs10_Signal43.csv
5vs10_Signal44.csv
5vs10_Signal45.csv
5vs10_Signal46.csv
5vs10_Signal47.csv
5vs10_Signal48.csv
5vs10_Signal49.csv
5vs10_Signal50.csv
5vs10_Signal51.csv
5vs10_Signal52.csv
5vs10_Signal53.csv
5vs10_Signal54.csv
5vs10_Signal55.csv
5vs10_Signal56.csv
5vs10_Signal57.csv
5vs10_Signal58.csv
5vs10_Signal59.csv
5vs10_Signal60.csv

@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @ctrhjk's task in 7m 25s —— View job


5 in vs 10 in comparison done — 60/60 triggered at 500 G; recommend 10 in for the BO campaign ✅

  • Gather context (channel map + analysis pattern from the check-run scripts)
  • Download all 60 5vs10_Signal*.csv attachments (1–30 = 5 in, 31–60 = 10 in) → committed under data/drop-tests/5vs10/raw/
  • Write + run the comparison analysis (scripts/analysis/drop_test_5vs10_analysis.py)
  • Figures + metrics JSON, dataset README, analysis doc (docs/drop-test-5vs10-analysis.md)
  • Commit + push (b0012f0)
  • Findings + drop-height recommendation below

1. The 500 G trigger fix works — the 5-in problem is solved

5 in 10 in
triggered / real impacts 30/30 30/30
CH5 raw |peak| 2,195 ± 118 G 5,807 ± 164 G
worst margin over 500 G 3.87× 10.67×
worst pre-impact activity 18.6 G (27× below level) 8.1 G (62× below level)

Interesting detail: this session's 5-in raw peaks (min 1,936 G) would have cleared even the old 1000 G level — unlike the earlier 7xadt6 practice drops that missed entirely. That confirms the no-trigger episode was a session/coupling-state effect, not a fixed property of 5-in drops, and is exactly why 500 G should stay: it's the margin that absorbs session-to-session variability.

2. Head-to-head metrics (CFC-180, 30 drops each, mean and CV)

metric 5 in 10 in 10/5 ratio
CH5 input peak 150.8 G (0.44 %) 221.8 G (0.86 %) 1.471
TOP output peak 171.6 G (0.69 %) 249.5 G (0.31 %) 1.454
T = TOP/CH5 1.138 (0.39 %) 1.125 (0.83 %) 0.989
input Δv 1.81 m/s (0.46 %) 2.60 m/s (1.40 %) 1.436
CH7 / CH8 over full scale 2/30 · 4/30 26/30 · 16/30
  • Both heights are excellent measurement points — every primary metric holds CV < 1 % over 30 drops, and the heights separate cleanly (Welch p ≤ 1e-43).
  • Filtered levels scale almost ideally with √h (1.45–1.47 vs √2 = 1.414) while the raw spike scales 2.6× — quantitative confirmation that raw-spike trigger margin collapses much faster than √h, which is what bit the old 1000 G level.
  • T is nearly height-invariant (1.138 vs 1.125): good news — it measures the structure, not the severity setting. But don't mix heights in one BO run; the 1 % offset is statistically real.
  • 5 in improves the low-range BOT saturation but doesn't cure it (CH8 median 94 % FS, still over FS on 4/30) — the CH6–8 range problem needs a sensor fix at any height.
  • Session caveat: T ≈ 1.13 at 10 in here vs 1.083 in the check runs — the CH5 tape coupling has moved again between sessions (and the specimen ID wasn't stated). Within-session stability is superb; between-session comparability still argues for the rigid keyed CH5 seat.

3. Recommendation: standardize BO at 10 in, trigger at 500 G

With 500 G, trigger reliability no longer constrains the choice, so it comes down to:

  1. Best repeatability of the primary objective — the TOP output peak (core of both T and output-at-fixed-input) is tightest at 10 in (CV 0.31 %).
  2. More energy to interrogate the structure — 44 % more Δv and ~45 % higher levels exercise the lattice harder, which is where geometry differences express themselves (the study that first showed geometry discrimination ran at comparable severity, 13 in). A stiff specimen barely works its struts at 5 in.
  3. Continuity with the durability baseline — all wear/drift calibration (200-drop campaign + both check runs, >260 drops with no functional failure) is at 10 in; a 5-in campaign would need its own burn-in characterization.
  4. 5 in doesn't buy what it was supposed to — its one hardware advantage (keeping BOT in range) doesn't fully materialize.

Keep 5 in as the validated gentle operating point: it has the best T repeatability of the pair (CV 0.39 %), 31 % lower levels, and 1.44× lower Δv — the right choice if BO explores fragile/soft geometries that repeated 10-in hits could damage, and a well-behaved second point for a future two-severity objective (the √h scaling makes severity sweeps predictable).

Committed (b0012f0)

data/drop-tests/5vs10/ (60 raw CSVs, README, 2 figures, metrics JSON) · scripts/analysis/drop_test_5vs10_analysis.py · docs/drop-test-5vs10-analysis.md · dataset-index update in data/drop-tests/README.md (now 729 raw CSVs).
· Branch

…) + analysis and BO height recommendation

60 auto-drops posted by @ctrhjk on PR #82 (30 at 5 in, 30 at 10 in, CH5
trigger lowered to 500 G): 60/60 triggered (worst margin 3.9x at 5 in),
CH7/CH8 saturation improves at 5 in but is not cured, all CFC-180 metrics
hold CV < 1% at both heights, levels scale ~sqrt(h) while raw peaks scale
2.6x. Recommendation: standardize BO at 10 in with the 500 G trigger; keep
5 in as the validated gentle operating point.

Co-authored-by: Jinkwan Han <282969777+ctrhjk@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ctrhjk

ctrhjk commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

@claude
Do you think there is a better number for the trigger level and also the drop height?

@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @ctrhjk's task in 2m 40s —— View job


Short answer: 10 in is already the right height; the trigger level is the one number I'd change — to 300 G

  • Gather context (5vs10, 5-in-100drops, 200-drop + check-run analyses, metrics JSONs)
  • Quantify the trade space from committed data (raw peaks, pre-impact activity, saturation, repeatability at each height)
  • Answer whether better numbers exist for trigger level and drop height

Trigger level — yes, I think 300 G is better than 500 G

The trigger level lives between two hard bounds measured across the program:

bound worst value observed where
floor — pre-impact activity it must stay above 35 G (5-in 100-drop run); 18.6 G in the new 5-in block; ≤ 9 G at 10 in every campaign
ceiling — worst-case session-minimum raw peak it must stay below < 1,000 G at 5 in (the 7xadt6 practice drops that missed both 1000 G triggers); 1,936 G in the new 5-in block; 5,336 G at 10 in 200-drop §7 / 5vs10

At 10 in, 500 G is already excellent (worst margin 10.7×, pre-impact clearance 62×) — there's no meaningfully better number for a 10-in-only campaign, and I wouldn't chase one.

The reason I'd still move to 300 G as the standing level is the one documented failure: the 7xadt6 practice session proved a fresh, compliant print at 5 in can stay below 1,000 G raw — and since no waveform was captured, we don't know how far below. At 500 G, this session's 5-in worst margin was 3.87×, but the program has already seen the raw spike shrink by more than that between sessions (tape-coupling state alone durably moved 6–8 % at CFC-180, and much more at the raw kHz content the trigger listens to). 300 G:

  • keeps ≥ 8.6× clearance above the worst pre-impact activity ever recorded (35 G) — false triggers remain a non-issue (all 390 auto-drops across 5vs10 + the 200-drop era show zero spurious triggers even at levels this would undercut);
  • restores ~6.5× worst-case margin at 5 in and would very likely have caught the failed practice session;
  • costs nothing at 10 in (margin becomes ~18×).

I would not go below ~200 G: the floor is set by the worst observed pre-impact activity (35 G), and arming/handling transients between drops aren't characterized — 100 G is probably safe (the 200-drop doc says as much) but buys nothing over 300 G except risk. And since trigger time is pinned by the pre-trigger buffer (first crossing 3.895–3.896 ms with µs-level jitter at every level tested), the level doesn't affect the metrics at all — only capture reliability. One cheap SOP addition beats any fixed number: one practice capture at the start of each session, check the raw CH5 peak, and confirm ≥ 3× margin before starting the batch.

Drop height — no better number in the measured evidence; 10 in stands

What "better" could mean, checked against data at the three measured heights (5, 10, 13 in):

  1. Repeatability — no height wins materially. TOP output peak is tightest at 10 in (CV 0.31 %), T is tightest at 5 in (CV 0.39 %); everything is sub-1 % at both, far below the geometry differences seen at 13 in (T spanning 0.96–1.19).
  2. Saturation — height can't fix the one problem (BOT): even at 5 in, CH8 sits at 94 % FS median and the channel is amplitude-pinned (~920 G regardless of severity), so that's a sensor-range fix, not a height fix. Meanwhile the upper bound matters more than people expect: at 13 in, CH5 raw already hit 8.1 kG = 86 % of its 9.4 kG full scale. A stiff BO candidate at 13 in could clip the trigger/denominator channel. 10 in leaves CH5 at ~62 % FS worst case — real headroom for stiffer geometries.
  3. Interrogation energy / discrimination — the only campaign that demonstrated geometry discrimination ran at 13 in severity; 10 in is the closest validated point that keeps CH5 headroom. 5 in gives 31 % lower levels and, per the 200-drop §7 reading, soft prints may not even bottom out there — bad for discrimination.
  4. Continuity — all durability/wear evidence (>260 drops, no functional failure) is at 10 in.

So within what's been measured, 10 in + a 300–500 G trigger is the optimum, and I don't think an untested intermediate height (7–8 in) offers anything: it would inherit 5-in's weaker interrogation without solving BOT, and would need its own wear baseline.

The honest caveat: the actual "best height" criterion for BO is which height best separates geometries, and that's only ever been measured at one severity (13 in, hot-glue era). T being nearly height-invariant on one specimen (1.138 vs 1.125) is encouraging but not the same thing. If you want to close that question before locking the BO campaign, the decisive experiment is small: 2 distinct geometries × 2 heights (5 in and 10 in) × ~10 drops each (~40 drops, one session) — if the between-geometry T gap is as large at 10 in as at 5 in, 10 in is confirmed; if the gap grows with severity, that's also worth knowing because it suggests severity sweeps as a future richer objective (the clean √h scaling of the CFC-180 levels makes those well-behaved).

Bottom line

  • Trigger: lower the standing level to 300 G (keep 500 G if you only ever run 10 in — it's fine there), and add a one-drop margin check at session start.
  • Height: stay at 10 in — no measured evidence supports a different number, and the CH5-headroom argument actively caps you near it. The only way a "better" height emerges is from the 2-geometry × 2-height discrimination check above, which I'd run before the first real BO batch.

Question-only task — no repo changes were made.
· Branch

@sgbaird

sgbaird commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

@claude in a similar vein, look at the search space parameters in #35 especially in that Bayesian optimization script, and considering the fixed mass and the volume constraint, comparing that with the volume of the print being tested here, which I believe is a downscaled version from the size that we were using a month or two ago. My main point here is that something that is near saturation for the current print parameters may not be viable for all designs within the search space, and it would be unfortunate if we had to more or less restart the campaign with different parameters because our sensors couldn't handle the full range of the kinds of prints that we'll be doing.

@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Claude finished @sgbaird's task in 10m 44s —— View job


Sensor headroom vs. the #35 BO search space — your concern is right, and it's quantifiable: one channel is already censored even for today's small print; the rest clear the whole box at 10 in, with two specific restart-risks to close before the campaign starts

1. Where the print being tested sits inside the #35 search space

Your recollection checks out in the CAD: cad/t3-prism/t3-prism.scad (PR #35 branch) sets S0_scale = 1.5 × 0.7692 ≈ 1.154 — the specimens with sensor housings (RW5F61, 7xadt6) are printed at 76.92 % of the 1.5× generation used in May–June (Audrey's "S0" sizing comment, 2026-07-01). Placing that against the Sobol box in bo/t3_prism_sobol_batch.py (R ∈ [25, 40], H ∈ [60, 110], twist ∈ [40, 80], strut_d ∈ [6, 12], cable_d ∈ [3, 5.5] mm), using a solid-infill volume model (PLA 1.24 / TPU 1.21 g/cm³ — treat as ±20 % estimates until someone weighs a print):

design R / H / strut_d / cable_d (mm) est. mass strut L/D bounding cyl.
S0 print under test (7xadt6-class) 28.8 / 80.8 / 6.9 / 3.5 ~24 g 12.4 238 cm³
old 1.5× default (May era) 37.5 / 105 / 9.0 / 4.5 ~49 g 12.4 511 cm³
search-space lightest corner 25 / 60 / 6 / 3 ~16 g 138 cm³
search-space heaviest corner 40 / 110 / 12 / 5.5 ~88 g 612 cm³
search-space stiffest corner 25 / 60 (tw 40) / 12 / — ~55 g 5.2

So the durability/saturation baseline was measured on a specimen in the light, soft third of the box: the space contains designs up to ~3.6× its mass, 3× its strut cross-section (9× bending stiffness), 4.4× its bounding volume, and struts down to L/D 5.2 (vs 12.4 tested) — plus, in the other direction, designs lighter than anything tested. Also worth stating plainly: neither BO script actually enforces a mass or volume constraint — PR #30's scaffold only uses mass inside its dummy SEA simulator, and the #35 Sobol generator constrains nothing — so today the box really does span that full 5.6× mass range. If mass/volume are program constraints (per your framing on the #35 thread), they need to be implemented, not assumed. Fix this →

2. Channel-by-channel: can the sensors cover that range? (measured at 10 in, 500 G trigger, from 5vs10_metrics.json)

channel full scale today's raw peak (S0 print) worst case over the box verdict
BOT CH6–8 (bottom vertex, low-range) 989–1002 G median 76–105 % FS, clipping on up to 26/30 drops only worse — stiffer designs transmit more already censored; cannot cover any of the space
CH5 (base-plate input, trigger) 9,443 G 64 % FS max ~unchanged — input is rig-set, not specimen-set (235–248 G CFC-180, CV ≤ 1.7 % across 4 different geometries) safe at 10 in; not at 13 in (86 % FS already observed there)
TOP CH2–4 (top vertex, output) 13,624–14,993 G 37 % FS max (CH4) physical ceiling ≈ rigid transmission of the input spike ≈ 6.1 kG = ~45 % FS; even 2× ringing amplification stays ≤ ~90 % safe for the whole box, incl. the L/D 5.2 corner
trigger reliability 500 G on CH5 3.9× worst margin design-independent (input-side trigger) safe — soft designs can't cause no-trigger

The one place your fear is already reality is BOT: it clips today on the small, soft print (and 5 in doesn't cure it — 94 % FS median), so every BOT waveform in the campaign would be amplitude-censored, worst for exactly the stiff designs BO will want to compare. That decision — re-range/replace the bottom tri-axis (your July 10 note about ~$1–2k higher-range sensors, or the LDV), or formally drop BOT from the objective stack — should be made before trial 1, because it's the only thing on the table that would genuinely force a mid-campaign restart. TOP + CH5 at 10 in, by contrast, have enough headroom that even a perfectly rigid specimen can't clip them.

3. Three interaction traps between the scale change and the search space

  1. The box is written in 1.5×-era absolute mm. If the program has standardized on S0-size prints (done for auto-support + housing reasons), the box's own center of mass is off — and note you cannot just multiply the bounds by 0.7692: the cable_d floor would drop to 2.3 mm, below the empirically-established 3.0 mm Bambu printability floor that's baked into the current bounds. Any re-scoping has to keep cable_d ≥ 3.0 absolute. Deciding the box now matters for exactly the reason you give — shrinking or shifting bounds after the GP has data is a soft restart.
  2. The sensor housings don't scale (deliberately — they're absolute-mm physical pockets, t3-prism.scad L244). A fixed instrumented-head mass is a much bigger fraction of a 16 g corner design than an 88 g one, so mass-loading bias in T varies ~5× across the box, systematically correlated with specimen mass — a confound the GP can't separate. Cheapest mitigation: weigh every print and log it per ID (this is the still-unanswered batch01.csv metadata ask from May 22, which would also calibrate the mass model above), and consider a mass floor if the light corner isn't interesting.
  3. Rig fit: the heaviest corner is ~80 mm footprint × ~145 mm tall with housings, vs the S0 print's ~58 × 115 mm. The release clip / cap-upward-travel fixtures and the 3×3 plate-packing cell (86.9 mm) were tuned in the S0/1.5× era — worth a dry-fit check before BO proposes a big design.

4. What I'd actually do (cheap insurance vs. restarting)

  1. Resolve BOT now — re-range, replace, or drop. Only real restart risk.
  2. Corner-qualification session (~30 drops, one sitting) before trial 1: print the stocky-stiff corner (R25/H60/strut_d 12) and one max-mass-class design, 10 drops each at 10 in / 500 G alongside an S0-class reference. That converts my "rigid-transmission ceiling ≈ 45 % FS" bound from extrapolation into a measurement, and verifies trigger + CH5 margins at the stiff end.
  3. Stay at 10 in — one more reason on the pile: CH5's 13-in headroom (86 % FS on a soft print) is the kind of margin a stiff search-space design eats.
  4. Implement the mass/volume constraints in the generator and log as-printed mass per ID — closes both the constraint gap and the mass-loading confound, and finally ties IDs back to parameters (still open since May 22).

Question-only task — no repo changes were made. Mass numbers are solid-infill volume-model estimates; one kitchen scale session on existing prints would calibrate them.
· Branch

@ctrhjk

ctrhjk commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

@claude

This test was done with the specimen in #35 (comment)
I tried to run a failure test, so I set up the drop counts to 500 times. The trigger was ch5 and the trigger level was lowered to 300G as you recommended in #82 (comment)

Drops couldn't be gone to 500 times, because at the 256th drop, I realized Lansmont Test Partner 4 showed an overload condition, and all the signals were disconnected.

Here are the data measured. Drop height was 10 in.

500drops_1.zip
500drops_2.zip
500drops_3.zip
500drops_4.zip
500drops_5.zip
500drops_6.zip
500drops_7.zip
500drops_8.zip
500drops_9.zip

Analyze these data, and report the result in connection with the overload condition.

@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Claude finished @ctrhjk's task in 11m 44s —— View job


Overload diagnosed: CH6 walked over its 1,002 G full scale — first at drop 118, continuously from drop 134 to the stop at 256. Nothing physically disconnected; the specimen shows no structural-failure signature. ✅

  • Gather context (channel map, check-run analysis pattern, specimen info from the PR #35 comment)
  • Download + extract the nine 500drops_*.zip attachments → 256 CSVs (Signal1–256), committed under data/drop-tests/500drops/raw/ (SHA-256-verified against the zip contents)
  • Write + run the analysis (scripts/analysis/drop_test_500drops_analysis.py)
  • Diagnose the overload condition
  • Figures + metrics JSON + dataset README + docs/drop-test-500drops-analysis.md + index update
  • Commit + push (f257ccf)

1. What tripped the overload

A TP4 overload means a channel's input exceeded its calibrated range, and exactly one channel did that — CH6, one axis of the low-range bottom-vertex tri-axis (FS 1,002 G):

channel full scale median max > FS first > FS sustained from
CH6 1,002 G 99.8 % FS 108.4 % 128/256 Signal 118 Signal 134
CH8 989 G 94.6 % 98.2 % 0/256
CH7 991 G 56.3 % 87.0 % 0/256
CH5 (trigger) 9,443 G 68.4 % 83.6 % 0/256
CH2/CH3/CH4 13.6–15 kG 4.6–26.9 % ≤ 30 % 0/256

So by the time you saw the overload at drop 256, CH6 had been over its range on essentially every drop for the previous ~120 drops. And its path there was not a slow drift but a transition event: flat at ~475 G (≈47 % FS) for the first ~96 drops → rapid climb over drops ~97–130 → a censored shelf at ~105 % FS for the rest of the run. Suggestively, the ~122 Hz low ringdown mode (the old 200-drop watch item, absent in both check runs) flickered on exactly 3 of 256 drops — Signals 94, 96, and 130 — bracketing that same transition window. The BOT resultant grew only ~+11 % while CH6 alone grew +127 % (and CH7 partially mirrored it), so the reading is bottom-vertex key-seat rotation re-projecting the resultant onto CH6, on top of a genuine ~10 % rise in bottom-vertex transmission — plausibly a settling/stretching event in this specimen's three bubbled diagonal TPU tendons. Worth inspecting/re-seating the bottom sensor and photographing the tendons before the next run.

2. "All signals disconnected" — reassurance

Nothing in the data disconnected. All seven channels are alive with normal noise floors and offsets on all 256 captures, including Signal 256 itself (a perfectly normal impact). The disconnect display is the TP4's reaction to the latched overload state, not a sensor/cable failure. All 256 captures are fully usable — except CH6's amplitudes after ~Signal 118, which are range-censored (the ~1,050–1,087 G shelf is the digitizer ceiling, not physics).

3. The failure test itself: the specimen did not fail in 256 drops

metric mean CV net over 256 drops
T = TOP/CH5 1.087 0.87 % +1 %
pulse width 1.49 ms 0.38 % −1 %
CH5 / TOP CFC-180 205.8 / 223.4 G 3.7 / 3.3 % −12 % / −11 %
input Δv 2.41 m/s 3.5 % −11 %

Despite the bubbled tendons, transmissibility is flat, the pulse shape is constant, and the ringdown mode is ~549 Hz on 253/256 drops — no structural-failure signature. What did drift is the delivered severity: input and output declined together (Δv −11 %, raw spikes −20 to −29 %) while their ratio stayed put — a rig/severity drift, the same slow decline seen in earlier long campaigns, now over its longest run. Two program notes: the 300 G trigger is validated at scale (256/256 clean, µs jitter, 30× above the worst 9.9 G pre-impact activity — it played no role in the stop), and this fresh print pushed CH5 to 83.6 % FS at 10 in (vs ~62 % for 7xadt6), further confirming 10 in as the height ceiling.

4. Before re-running the 500-drop test

  1. Take the low-range BOT station out of the overload path — it is the only thing that can stop the TP4 at 10 in, and its amplitudes are censored there anyway: disconnect/disable CH6–8 for long campaigns, check whether the TP4 overload can be set to warn rather than halt, or re-range the bottom station (the standing recommendation since the 200-drop campaign).
  2. Inspect + re-seat the bottom-vertex sensor and check the bubbled tendons — the drop-~100 transition is a real mechanical change.
  3. Keep 10 in + 300 G — both performed exactly as designed for all 256 drops.

Committed (f257ccf)

data/drop-tests/500drops/ (256 raw CSVs — byte-verified vs the zips — README, 3 figures, metrics JSON) · scripts/analysis/drop_test_500drops_analysis.py · docs/drop-test-500drops-analysis.md · dataset-index update in data/drop-tests/README.md (now 985 raw CSVs).
· Branch

…gnosis: CH6 walked over its 1002 G full scale from ~drop 118 (sustained from 134), tripping the TP4 overload; no channel physically disconnected, 300 G trigger 256/256, specimen shows no structural-failure signature (T flat at ~1.087)

Co-authored-by: Jinkwan Han <282969777+ctrhjk@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ctrhjk

ctrhjk commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

@claude

This test is 500 drops test, which means that the drops were conducted 500 times.

The specimen used for this test is the same specimen as I used yesterday (see #82 (comment)).
This time, I removed ch6~8 so that the bottom tri-axial accelerometer wasn't included in this test.
The settings were the same, drop height was 10 in and ch5 was the trigger channel with the trigger level of 300G.

Conduct the OLS regression analysis, and assess the need for the bottom tri-axis accelerometer compared to the result in #82 (comment).

Video link: https://youtu.be/uqn3qnJPfN8?si=agZOEUQYR_Ive12C

Here are the results
500_1.zip
500_2.zip
500_3.zip
500_4.zip
500_5.zip
500_6.zip
500_7.zip
500_8.zip
500_9.zip
500_10.zip
500_11.zip
500_12.zip
500_13.zip
500_14.zip
500_15.zip
500_16.zip
500_17.zip

@claude

claude Bot commented Jul 16, 2026

Copy link
Copy Markdown

Claude finished @ctrhjk's task in 12m 0s —— View job


2nd 500-drop test analyzed: removing the bottom tri-axis cured the stop — 500/500 complete, no channel near full scale; OLS shows the specimen still hasn't failed at ~756 cumulative drops; recommend keeping BOT off for long/BO campaigns at 10 in ✅

  • Gather context (first 500drops analysis + metrics, channel map, repo conventions)
  • Download + extract the 17 500_*.zip attachments → 500 CSVs (500_Signal1–500) committed under data/drop-tests/500drops-nobot/raw/
  • Write + run the analysis (scripts/analysis/drop_test_500drops_nobot_analysis.py) — OLS regressions + run-1 comparison
  • Assess the need for the bottom tri-axis accelerometer
  • Figures + metrics JSON + dataset README + docs/drop-test-500drops-nobot-analysis.md + index update
  • Commit + push (749b93d)

1. Run health — the overload diagnosis is confirmed by cure

500/500 real drops, zero spurious triggers, ~18 s cadence (18:24–20:41, ~137 min), CH5 crossing 300 G at 3.896 ± 0.000 ms on every record, worst pre-impact activity 10.4 G (29× below the level). And the saturation audit is now boring, which is the point:

channel full scale median max ≥95 % FS
CH2 / CH3 / CH4 (TOP) 13.6–15 kG 3.8 / 6.2 / 25.8 % ≤ 28 % 0/500
CH5 (trigger) 9,443 G 67.5 % 77.6 % 0/500

Last run the only channel that could trip the TP4 was BOT, and it did (CH6 over FS from drop 118). This run there was nothing left to overload, and the campaign ran to completion.

2. OLS regressions vs drop number

metric mean CV slope (%/drop) p net over 500 drops
CH5 raw |peak| 6,289 G 6.5 % −0.022 5e-32 −11 %
TOP raw resultant 3,648 G 3.3 % +0.009 2e-19 +4 %
CH5 CFC-180 198.7 G 1.24 % +0.0038 8e-26 +2 %
TOP CFC-180 223.9 G 1.32 % +0.0038 5e-22 +2 %
T = TOP/CH5 1.127 0.42 % −0.00002 0.86 0 %
pulse width 1.48 ms 0.29 % +0.0007 4e-15 +0.3 %
input Δv 2.33 m/s 1.28 % +0.0040 3e-26 +2 %
dominant ringdown mode 554 Hz 2.1 % +0.0001 0.92 0 %
  • No structural-failure signature at ~756 cumulative drops on this bubbled-tendon specimen: T is dead flat (the OLS slope is statistically zero), pulse width constant, ringdown mode at ~549 Hz on all 500 drops (never below 200 Hz). These are also the best CVs of any long campaign (T CV 0.42 % vs 0.87 % in run 1).
  • The chronic severity decline is gone this session — run 1 lost 11–12 % in levels/Δv over 256 drops; this run gained ~2 % over 500. So that decline is a session condition, not intrinsic to long campaigns.
  • One real disturbance, at drop 354 (no pause in the cadence): the CH5 raw spike collapsed 6,424 → 3,526 G in one drop, both stations dipped 4–7 %, T dipped 1.131 → 1.099, and everything recovered over ~30 drops. Both stations moving together points at a rig/coupling settling event, not the specimen — and notably CH2–5 detected and tracked it on their own.

3. Is the bottom tri-axis needed? Not for this program at 10 in

The honest accounting, using run 1's own data: during run 1's CH6 transition (drops ~97–134, the event that tripped the overload), the channels that survive into this run saw essentially nothing — T shifted +0.15 % (Welch p = 0.2), ringdown mode p = 0.17. So BOT is not redundant; it uniquely observed a real bottom-vertex load-path change. But three facts cap its value:

  1. It contributes nothing to the BO objective stack — T, output peak, pulse width, Δv, and the ringdown mode are all CH2–5 quantities, and this run measured them better than ever.
  2. At 10 in it's censored anyway (run 1: CH6 median 99.8 % FS, CH8 94.6 %) — a binary "something changed" flag, not a quantitative sensor.
  3. It's the only thing that can halt a campaign — demonstrated by cure: with it, stop at 256; without it, 500/500.

Recommendation: run BO campaigns and long failure tests at 10 in without the BOT station, exactly as configured this run. If bottom-vertex observability is wanted, re-introduce it either as an occasional short health check at 5 in (where it stays in range) or permanently once re-ranged to a multi-kG tri-axis — not as a standing overload liability in every unattended batch.

One caveat worth flagging: T stepped 1.086 → 1.127 between the two runs while the TOP station stayed statistically identical (223.4 vs 223.1 G, p = 0.58) — the step is entirely CH5-side, the familiar tape-coupling session dependence. Within-run T is superb; between-session comparability still argues for the rigid keyed CH5 seat.

Committed (749b93d)

data/drop-tests/500drops-nobot/ (500 raw CSVs, README, 3 figures, metrics JSON) · scripts/analysis/drop_test_500drops_nobot_analysis.py · docs/drop-test-500drops-nobot-analysis.md · dataset-index update in data/drop-tests/README.md (now 1,485 raw CSVs).

--- · Branch

@sgbaird

sgbaird commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

Hmm.. might be the same issue as before. Jinkwan, here's an example of how you can upload directly to the branch instead of attaching files to comments:

Screen.Recording.2026-07-17.163724.mp4
TypeError: null is not an object (evaluating 'pullRequest.files.nodes')
      at fetchGitHubData (/home/runner/work/_actions/anthropics/claude-code-action/v1/src/github/data/fetcher.ts:293:36)
      at async prepareTagMode (/home/runner/work/_actions/anthropics/claude-code-action/v1/src/modes/tag/index.ts:52:28)
      at async run (/home/runner/work/_actions/anthropics/claude-code-action/v1/src/entrypoints/run.ts:224:17)

Error: Action failed with error: Failed to fetch PR data
Error: Process completed with exit code 1.

@copilot have a look at https://github.com/vertical-cloud-lab/tensegrity-optimization/actions/runs/29615568750/job/88000448307 and see if you can find somewhere (probably an official github repo or maybe github community or somewhere else online) that talks about this particular error on pull requests with lots of inline attached files.

@sgbaird

sgbaird commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

@copilot address #82 (comment)

Copilot AI commented Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

Hmm.. might be the same issue as before. Jinkwan, here's an example of how you can upload directly to the branch instead of attaching files to comments:

https://github.com/user-attachments/assets/8...

Your instinct is right — this is the huge attachment-heavy comment thread, not anything wrong with PR #82's files. Here's what's happening and where it's documented.

Root cause

The crash is in the action itself, at anthropics/claude-code-action src/github/data/fetcher.ts:293:

if (prResult.repository.pullRequest) {
  const pullRequest = prResult.repository.pullRequest;
  contextData = pullRequest;
  changedFiles = pullRequest.files.nodes || [];   // 293: pullRequest.files is null here

It null-guards pullRequest but not pullRequest.files. So null is not an object (evaluating 'pullRequest.files.nodes') means the GraphQL response came back with pullRequest present but its nested files connection null.

Why files comes back null: the action fetches everything in one monolithic query (PR_QUERY) — files(first:100) plus comments(first:100) with full bodies plus reviews(first:100) each with comments(first:100). On this thread each comment body carries hundreds of attachment links ("436 attachment links"), so the single response is enormous and expensive. When GitHub's GraphQL API hits its per-query timeout / node-complexity limit, it doesn't fail the whole request — it resolves the expensive nested connection (files) to null and returns the rest. The unguarded deref then throws.

Where this is discussed online

  • GitHub GraphQL resource limits (official docs): the node-limit and query-cost/timeout behavior that produces this — https://docs.github.com/en/graphql/overview/resource-limitations and the pagination guide https://docs.github.com/en/graphql/guides/using-pagination-in-the-graphql-api
  • The documented "partial data, nested field = null + timeout" behavior: GitHub's API returns the generic "Something went wrong while executing your query. This may be the result of a timeout…" and nulls the offending connection rather than paginating it. This is a widely-reported GraphQL-on-large-PRs failure mode (GitHub Community / Stack Overflow threads on "GraphQL pullRequest files/comments returns null on large PRs").
  • In the action's own tracker: there's no open issue for this exact files.nodes null-deref yet (I searched anthropics/claude-code-action issues). The closest precedent is #1489 "null author dereference", which they fixed with the same one-line pattern (author?.login ?? …). A pullRequest.files?.nodes ?? [] guard here would be the analogous fix — worth filing upstream. Note: I checked main and it's byte-identical to the pinned v1 at this line, so bumping the action version will not fix it.

What actually unblocks @claude on this PR

This is an upstream bug, so nothing in our repo changes it. Practical options:

  1. Reduce the query payload — collapse (minimize) or trim the giant attachment-link comments so the single query stops timing out. Your suggestion to Jinkwan (upload data directly to the branch instead of attaching files to comments) is exactly the right long-term fix — it keeps comment bodies small.
  2. Move new analysis requests to a fresh PR/issue with a short comment thread (which is effectively why we're continuing on this new branch).
  3. File the upstream issue requesting (a) pullRequest.files?.nodes ?? [] null-guarding and (b) splitting/paginating PR_QUERY so a large comments/reviews set can't null out files. I can draft that report if you want.

For what it's worth, I (Copilot) don't hit this because I don't fetch the thread through that single GraphQL query — which is why this branch's work is proceeding fine.

Copilot AI commented Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

@copilot address #82 (comment)

Done — analyzed the felt-sheet sweep from #82 (comment). All 45 CSVs are committed under data/drop-tests/felt-sheet/raw/, with the script (scripts/analysis/drop_test_felt_sheet_analysis.py), findings (docs/drop-test-felt-sheet-analysis.md), and figures added (commit 5f10909).

Did saturation occur? Yes — on the base-plate single-axis CH5 (FS 9,442.9 G), which is the rig's bottleneck.

height / felt CH5 max %FS over-FS CH4 max %FS TOP180 (CV)
20 in / 1 f 105 % 4/5 56 % 369 G (0.6 %)
30 in / 2 f 99 % 0/5 31 % 375 G (0.2 %)
40 in / 3 f 79 % 0/5 28 % 416 G (1.3 %)
20 in / 2 f 50 % 0/5 23 % 306 G (0.7 %)
30 in / 3 f 36 % 0/5 21 % 339 G (1.0 %)
60 in / 5 f 30 % 0/5 19 % 462 G (0.7 %)
50 in / 4 f 24 % 0/5 17 % 416 G (0.3 %)
40 in / 4 f 15 % 0/5 14 % 376 G (2.1 %)
50 in / 5 f 15 % 0/5 14 % 400 G (1.3 %)

20 in/1 felt clips CH5 on 4/5 drops (visible analog flat-topping) and 30 in/2 felt sits at 99 % FS — both unusable. The top tri-axis CH4 never exceeds 56 % FS, so the ceiling is entirely the low-range single-axis CH5. This is exactly @sgbaird's search-space concern: a print that's already at ~100 % FS leaves zero head-room for a stiffer BO design.

saturation

OLS (n = 45, R² = 0.87) cleanly de-confounds the two knobs (they were stepped together): each +10 in ⇒ ×1.85 on the CH5 peak, each +1 felt sheet ⇒ ×0.36 (≈64 % attenuation) — so one felt sheet cancels ~24 in of height (both p < 1e-8).

traces

Recommendation — the ideal height/felt combo: 60 in + 5 felt sheets (alt: 50 in + 4 felt). The key insight is that the output we actually care about (TOP CFC-180, the BO objective surrogate) only ranges 306–462 G across a 7× swing in CH5 input — it's set by the specimen, not by how hard the base is hit. So a near-saturating input buys ~no extra signal while spending all the head-room. Maximizing repeatable output under a 3× CH5 head-room rule (worst-case ≤ FS/3, room for a ~3× stiffer design) lands on 60 in/5 f: strongest, most repeatable output (462 G, CV 0.7 %) with CH5 only ~30 % FS (3.4× margin) and CH4 at 19 % FS. Rule of thumb from the model: add ~1 felt sheet per 24 in of height, and avoid the two saturating settings.

Caveat: n = 1 specimen (5 repeats/condition); the 3× factor is an engineering choice — tighten it once the stiffest #35 search-space design's expected peak is known, since that (not this print) sets the true required margin. The real long-term fix for head-room is a higher-range base sensor, not more felt.

@sgbaird

sgbaird commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

@copilot is this going to give us something reasonable in terms of specific energy absorption and any other objective(s) of interest, assuming that we'll also have high speed video (for SEA specifically)

Copilot AI commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

@copilot is this going to give us something reasonable in terms of specific energy absorption and any other objective(s) of interest, assuming that we'll also have high speed video (f...

Short answer: yes for SEA — but only via the high-speed video, not the accelerometers alone — and only once the force channel has saturation head-room and the capture window is extended. Here's the objective-by-objective read on what this rig currently supports.

SEA (specific energy absorption)

There are two routes, and they need different things:

  • Accelerometer-only (energy/momentum balance): SEA = ½·m_drop·(v_in² − v_out²) / m_specimen, with v from integrating the carriage/top accelerometer. This is not reliable on the current data — the 200 ms window truncates the pulse, so our Δv is partial-pulse (docs/drop-test-input-output-analysis.md flags ~2.85–2.96 m/s vs ~3.4–3.7 m/s over the full window). It also can't separate energy absorbed by the specimen from energy lost to the felt/plates.
  • High-speed video + accelerometer (force–displacement work integral): SEA = ∮F dδ / m_specimen, where F(t) = m_carriage·a(t) from the top tri-axis and δ(t) is the specimen compression tracked in the video. This is the gold-standard (Edison's DIC recommendation, Pajunen 2019 / Dwyer 2023 analogues) and does give a reasonable SEA — it's exactly what the high-speed camera unlocks. So the plan of "video for SEA specifically" is the right call.

Three prerequisites the committed data already flags before that hysteresis integral is trustworthy:

  1. Force channel must not saturate across the whole Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 search space. This is your search-space concern from the felt-sheet sweep: the base single-axis CH5 (FS 9,442.9 G) already sits near 100 % FS at low-felt conditions, and a stiffer BO design clips it — a clipped F(t) corrupts ∮F dδ. Use the top tri-axis (FS ~13.6–15 kG) as the force channel and/or the recommended 60 in + 5 felt operating point (~30 % FS, ~3.4× head-room), or move to a higher-range base sensor.
  2. Extend capture past 200 ms so the full crush pulse and rebound are inside the window — needed both to close the hysteresis loop and for the full-pulse Δv.
  3. Sync + track the right displacement: trigger-sync the camera to the DAQ (frame from t=0, ≥~5000 fps), and track top-plate-relative-to-base compression, not carriage travel; keep the input-output geometry (bungees removed) so the specimen is actually crushed rather than plate-on-plate.

Other objectives

  • F_peak / peak transmitted g: works now — transmissibility T = output/input already discriminates geometry (input-output series: yqpmx1 0.96 attenuator vs practice/n0jdwk ~1.17–1.19, 20/20 clean), provided the force channel stays out of saturation.
  • Reusability / N_reuse: supported qualitatively — that's what the 200/500-drop campaigns exercise (BOT dropout, mount creep, felt wear are the failure modes to watch).
  • Ringdown / damping: needs the same >200 ms window fix; can't be read from the current shock-only captures.

Bottom line: with high-speed video, SEA and F_peak are both viable BO objectives from this rig; the gating items are (a) force-channel head-room over the full search space, (b) a longer capture window, and (c) video↔DAQ sync tracking specimen compression. None require restarting — they're rig/DAQ settings.

@vertical-cloud-lab vertical-cloud-lab deleted a comment from claude Bot Jul 20, 2026
@me-madsen

Copy link
Copy Markdown
Collaborator

@sgbaird I'd like to ping Claude about the following, however it doesn't seem to be responding on here. Could you ping copilot about this, or perhaps show me how to create a new PR to work with the drop data on?

"Recommend a minimum number of drop tests per specimen to get accurate data. How much variance have we had in our data per specimen being tested so far? Also provide how long each set of tests would take given that it currently takes ~42 seconds/drop at 60 inches with automatic dropping."

@sgbaird

sgbaird commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

@copilot address #82 (comment)

Also, @copilot I forget if you're able to create new PRs, but if so, please do so.

@me-madsen probably we can resume work on the new PR that gets created, then we'll want to upload directly to the branch instead of as comment files, at least when there are a large number of files involved.

Copilot AI commented Jul 20, 2026

Copy link
Copy Markdown
Contributor Author

@sgbaird I've opened a new pull request, #86, to work on those changes. Once the pull request is ready, I'll request review from you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants