Open-source purpose-built robots
Which body carries a survey payload furthest per kWh? Hull choice for small autonomous boats
research/marine-hull
Research programme (proposal stage): energy per survey kilometre of hull types for 100 to 500 kg autonomous boats; with a Michell wave term a catamaran out-ranges a monohull in 3.3% of 6,561 cases, none at equal length; with Slocum coefficients from the gliderflight package a glider never out-ranges a same-mass propeller AUV at equal hotel load (0 of 2,430 cases); it breaks even when the AUV's hotel load is about 5 times its own; a REMUS-100-class AUV's non-propulsion load implied by vendor endurance is 104 to 175 W, far above that, so the glider out-ranges it in every case on energy per metre (at a tenth of the speed); a Savitsky planing hull reaches at most 0.14 of the monohull range (0 of 48 cases); a SWATH (two submerged torpedoes on struts) out-ranges the monohull in none of 4,374 swept pairs; charging panel mass to the battery (2 to 10 kg/m2, swept) cuts the median solar range multiplier from 2.01 to 1.64 at worst, and the full deck stays the best array wherever range is finite; against ten years of daily NASA POWER insolation a threshold speed policy (slow or hold when the pack is under 30%) never raises km/day over a fixed 1 m/s but cuts pack-empty days, e.g. 25.4% to 1.5% for a 4 m boat at 25 N
55 tests
What it found
An open research programme on which body (monohull, catamaran, SWATH, planing hull, hydrofoil, glider, AUV) carries a survey payload furthest per kWh, and where that ranking flips under uncertain drag inputs. Milestone 1 is a stdlib calculator (ITTC 1957 friction line checked analytically, form factor, wetted-area constant, hotel load; 9 tests) and a 6,561-case grid for a 200 kg craft: a catamaran of two slender demi-hulls out-ranges a monohull in 27 cases (0.4%) and in none of the 2,187 equal-length cases; the monohull's best speed is about 1 m/s, set by a 30 W hotel load, with range 560 to 1,188 km as an upper bound. The wave-resistance term is a placeholder and no published resistance curve is reproduced yet, so this is a friction-limited comparison; hull-form constants, efficiencies and water properties are swept or unsourced, and stability and deck area are not modelled. Two DOIs written from memory were wrong and were corrected by the citation check. Preliminary; simulation only. Milestone 2 replaces the placeholder wave term with Michell thin-ship theory on Wigley hulls: the catamaran wins 3.3% of 6,561 cases and none at equal length, and wave resistance changes best range by about 4% because the optimum speed (about 1 m/s) is at Froude number 0.16. Milestone 3a checks it against one published Wigley tank point (Ju 1983, via Wang et al. 2017): Michell plus the ITTC 1957 line with no form factor is within +1 to +5% of the measured total-resistance coefficient 4.16e-3 (water temperature unknown, 10 to 20 C), while the programme's central form factor 0.25 is 18 to 25% high; the form factor that fits is about 0, below the swept 0.10 to 0.40 box. One speed, second-hand source, geometry assumed. Milestone 4 compares a quasi-steady buoyancy glider with a same-mass propeller AUV over 19,683 swept cases (no glider coefficient is sourced: the papers could not be fetched): at equal hotel load the glider has the longer best range in 5.9% of cases, at 5 times the AUV hotel load in 89%, so the advantage comes from hotel load rather than hydrodynamics; glider speed tops out at 0.13 to 0.70 m/s, and the proposal's 0.4 to 0.9 m/s crossover is not supported. Not checked against a fielded glider's range. Milestone 4b re-ran it with Slocum aerodynamics read from the MIT-licensed gliderflight package (lift slope 7.5/rad, K 10.5/rad²): the glider out-ranges the AUV in 0 of 2,430 cases at equal hotel load, and the break-even AUV hotel load is a median 4.9 times the glider's (10th to 90th percentile 2.4 to 10.7); hotel loads and pump efficiency remain swept, not sourced. Milestone 4c reads a REMUS-100-class AUV's total power from vendor endurance (1.5 kWh, 12 h at 1.5 m/s to 8 h at 3 kn: 125 to 188 W), subtracts the model's 13 to 21 W of propulsion, and gets a 104 to 175 W non-propulsion load; against it the glider has the longer best range in all 810 x 18 cases. The vendor figures are approximate and mutually inconsistent, and energy per metre ignores that the glider is about seven times slower. Milestone 5 rungs: a lifting-line hydrofoil (all foil coefficients swept) and a Savitsky (1964) planing hull both fail to out-range the 4 m monohull (0 of 2,916 and 0 of 48 cases; range ratios up to 0.25 and 0.14), so they are transit-speed options, not endurance options; no tank data checked. Milestone 5b adds a SWATH rung (two fully submerged parabolic torpedoes on Wigley-form struts, Michell wave drag for torpedoes and struts, 4,374 pairs against the 4 m monohull): the SWATH out-ranges the monohull in none, at its best speed (range ratio median 0.69, best 0.83) or at a fixed 3 m/s (median 0.46), because strut wave drag and wetted area outweigh the torpedoes' small wave drag at 200 kg; torpedo wave drag falls with depth at about 2 k0 as theory says, but no SWATH tank curve was reachable, and stability and seakeeping are not modelled. Milestone 5d charges panel mass to the battery (areal mass 2, 5 and 10 kg/m2, swept, not sourced) and lets the array area vary: where the array cannot carry the boat the full deck is still the best layout in every finite-range case, but the range multiplier falls from a median 2.01 (no mass) to 1.95, 1.83 and 1.64; neutrality at 1 m/s is unchanged at 25.1%, by construction. Milestone 5g runs three speed policies against ten years of daily NASA POWER insolation at five sites: slowing when the pack is under 30% never raises distance (hotel load dominates at 0.5 m/s) but cuts pack-empty days, e.g. 25.4% to 4.2% (slow) and 1.5% (hold) for a 4 m boat at 25 N; above 42 N the deficit is seasonal and policy barely helps. Threshold and slow speed are not swept. Milestone 3b checks the placeholder wave term against five bare-hull tank speeds of a published 2.8 m catamaran (Zenodo 18459868, CC BY 4.0; geometry and water type inferred from the tables): the central model (k = 0.25) is 35 to 43% low at Fn 0.33 to 0.58 and within 10% at Fn 0.72 and 0.79; no single wave scale keeps all five speeds within 20% (best worst-case error 29 to 32%), so the placeholder is not safe for catamarans above Fn 0.3. The programme's survey speeds (Fn about 0.16) are below the data's range, and H3 (Holtrop-Mennen) is untouched.
Research log
Ongoing: each run adds a batch and an entry, newest first. Source: LOG.md.
2026-10-31 · Milestone 7e: H5 for the glider against the propeller AUV: what fixed-energy gap flips the order? (not pre-registered)
- Why: 7d's "Next". The glider and the AUV have different energy structures, so the equal-overhead proportionality argument of 7c needs its own check.
experiments/run_h5_glider.py (stdlib, seconds) reuses run_glider.py's full 19,683-case grid (52 kg, 500 m dives), takes each vehicle's best-range energy per metre, and a 10 kg pack at 150 to 250 Wh/kg (1.5 to 2.5 kWh). Run in one go with no predictions logged first: exploratory. - Outcome (
experiments/results_h5_glider.txt): the glider has the lower energy per metre in 12,803 of 19,683 cases (65.0%), e_g/e_a median 0.62 (5% to 95%: 0.17 to 2.57). With equal overhead there are 0 rank swaps across the 150 to 250 Wh/kg window, as 7c's argument says. A glider fixed-energy penalty of 100 Wh (7% of the smallest pack) swaps the order in 130 cases (0.7%), 250 Wh in 445 (2.3%), 500 Wh in 1,181 (6.0%), 1,000 Wh in 3,969 (20%). Among cases with the glider ahead, the median overhead that would flip it at 150 Wh/kg is 931 Wh of 1,500. - Reading: unlike mono against catamaran (7d: 3 swaps in 2,187 cases at best), a glider/AUV ranking is sensitive to a fixed per-mission energy, because the glider's energy per metre is small and the AUV's hotel load is large. Whether such a gap exists (ballasting, surfacing, GPS fixes, pump priming) is unsourced here; H4's published figures do not give it. H5 stays refuted at equal overhead and is conditional on an unsourced term otherwise.
- Limits: swept, unsourced constants; the 65% includes grid corners that favour the AUV (low hotel multiple); overhead is a number I chose; one seed-free deterministic grid, no confidence intervals needed but also no real data.
- Next: source a glider mission overhead (surfacing, GPS, ballast) from a vendor datasheet or paper; milestone 3 curve at survey speed.
2026-10-31 · Milestone 7d: can a hull-specific fixed mission energy flip the mono/cat ranking? (not pre-registered)
- Why: 7c's "Next". Range is linear in pack energy for every hull, so ranking cannot change with specific energy unless the hulls carry different fixed energy E0 (launch, recovery): range = (E - E0)/e_km, flip at E* = c d/(c - m) for catamaran extra overhead d (Wh) and km/Wh figures m (mono), c (cat).
experiments/run_h5_overhead.py (stdlib, seconds), 2,187 cases, 150 to 250 Wh/kg of a 50 kg pack. Written and run in one go: I logged no predictions first, so treat the outcome as exploratory. - Outcome (
experiments/results_h5_overhead.txt): the catamaran out-ranges the monohull at equal overhead in only 9 of 2,187 cases (0.4%), so there is almost nothing to flip. Rank swaps: 0 at d = 0, 3 (0.1%) at d = 100 Wh, 0 at 250 Wh and above (past the window, the cat has already lost by 7.5 kWh). The closed form agrees with brute force in every row (new test). - Reading: within this model H5 stays refuted for mono against catamaran, even with a hull-specific fixed energy; a swap needs a near-tie in km/Wh and an overhead gap tuned to the 7.5 to 12.5 kWh window. The only pairs with real flip potential are the ones with close km/Wh (the nine cat-ahead cases), which the sweeps of run.py can list.
- Limits: swept unsourced constants; overhead is a single number I chose, not sourced; two hull types; the 9 cases are not examined individually.
- Next: milestone 3 curve at survey speed when a data host allows; H5 across glider/AUV (different energy structure) is the better remaining test.
2026-10-31 · Milestone 7c: H1 and H5 tested as the proposal states them (planned before running)
- Why: 7b found neither was ever run as written.
experiments/run_h1_h5.py (stdlib, seconds). H1: monohull 200 kg, 4 m, 30 W hotel, 200 Wh/kg; 27 combinations of c_s (2.6 to 3.4), k_form (0.10 to 0.40), wave_scale (0 to 1). H5: mono against catamaran over run.py's box (2,187 cases), pack 150 to 250 Wh/kg, (a) battery 25% of 200 kg, (b) 5 kWh fixed so a better pack is lighter. - Predictions (before running): (1) H1 refuted: best range spreads by 10% or more across the 27 combinations (prior 85%). (2) Best speed spreads by 15% or more (prior 55%). (3) The propulsion share of power at the best speed is within 0.30 to 0.40 everywhere (prior 70%; theory for v^3 drag gives 1/3). (4) H5 (a) has 0 rank swaps, by proof: range is linear in pack energy for every hull at fixed mass (prior 99%). (5) H5 (b) has swaps in under 2% of cases (prior 70%). Refuted: any one missed.
### Outcome (experiments/results_h1_h5.txt)
- H1 refuted as stated. Best range 763 to 921 km, a spread of 20.6%; best speed 1.00 to 1.20 m/s (20.0%). Prediction (1) and (2) held. One at a time, c_s moves range by 9.0%, k_form by 8.1% and wave_scale by 0.8%, so each hull constant alone is under the 10% line and together they are over it. The "set by the hotel load" half holds: the propulsion share of power at the best speed is 0.33 to 0.37 (3 held), the 1/3 of v^3 drag (new test
tests/test_best_speed_share.py). - H5 refuted, and not a finding about hulls. (a) 0 swaps in 2,187 cases; the cat/mono ratio does not change at all (4 held). (b) 0 swaps; the ratio moves at most 0.13% because a lighter hull displaces less (5 held). Within this model a battery specific energy cannot flip a mono-versus-catamaran ranking; a flip needs a term that is not proportional to pack energy (a fixed energy per mission, a payload that scales with pack mass, or a mass-limited hull). Not tested against glider, SWATH or planing rungs, whose ranges are also linear in pack energy here.
- Limits: swept, unsourced constants; two hull types for H5; one mass and length for H1.
- Next: H5 with a term that breaks the proportionality (a fixed mission energy or a pack-volume limit); milestone 3 curve when a data host is reachable.
2026-10-30 · Milestone 7b: draft the introduction, model and results table (no experiment run)
- Why: the paper file was a 47-line skeleton after about thirty experiments; the programme's bottleneck is a submittable text, not a seventh persistence variant. Drafted sections 2.1 to 2.3 of
paper/DRAFT.md from logged numbers only, with a rung-by-rung table. - Found while drafting: H1 was never tested as written (a 10% range spread across the hull box) and H5 was never counted as a rank swap under the battery sweep; both are now listed in the draft as open, and are cheap next steps from existing code. H4's logged outcome (crossover refuted, hotel-load edge) is stated as such.
- Limits: prose only; citations still unopened beyond the PROPOSAL.md status; no new numbers.
- Next: run H1 and H5 as explicit tests; milestone 3 curve when a data host is reachable.
2026-10-30 · Milestone 3b: a published catamaran bare-hull tank curve against the programme's displacement resistance model (planned before running)
- Why: milestone 3 has had one tank point (Wigley, 3a). This session zenodo.org also holds CC BY 4.0 data from a towing-tank study of a catamaran (record 18459868; five bare-hull speeds, Fn 0.33 to 0.79, water 16.8 C, with trim). It is a curve, not a point, but the hull is semi-planing, so it tests where the programme's displacement model (ITTC 1957 times (1+k), plus
wave_resistance_fraction) stops applying. Hull geometry is not in the files: L = 2.811 m follows from Fn = V/sqrt(gL), and the wetted area S follows from CT = RT/(0.5 rho V^2 S) (both derived, stated as such). Water assumed fresh (rho 998.7, nu 1.09e-6 interpolated from ITTC 7.5-02-01-03 at 16.8 C). - Plan (
experiments/run_catamaran_tank.py, stdlib): implied S per speed; CF at each Re; the tank residual CR = CT - (1+k) CF for k in {0, 0.1, 0.25}; model CT with the placeholder wave term (hump 0.4, k = 0.25) and its error per speed; the best single wave_scale fitted over all five speeds and over the three lowest, with the worst error each leaves. - Predictions (before running): (1) implied S is constant within 3% over the five speeds (prior 75%; the authors presumably used one reference area). (2) The central placeholder (k = 0.25, wave_scale 1) is within 20% at Fn 0.33 and off by more than 20% at Fn 0.72 and 0.79, overpredicting (prior 80%), because tank CT falls as the hull planes while the placeholder keeps rising. (3) No single wave_scale keeps all five speeds within 20% (prior 85%). (4) Fitted on the three lowest speeds only, the worst error over those three is within 15% (prior 55%). Refuted: (1) spread of 3% or more; (2) either condition fails; (3) some wave_scale keeps all five within 20%; (4) worst error of the three above 15%.
- Limits known in advance: five points, one hull, water type and geometry inferred; the Hull Vane study's own CFD is not used; the hull is not a survey boat of the programme's kind (the 2 to 4 m catamaran range is, though, the right size). H3 (Holtrop-Mennen) is still untouched.
2026-10-30 · Milestone 6g: with three sea states instead of two, how much of the oracle gain does persistence capture? (planned before running)
- Why: 6f's "Next". A two-state chain forces a single rough/calm boundary; a third state (moderate) makes yesterday's call wrong more often at a boundary and gives the policy a middle speed to use. Still swept, not sourced.
- Plan (
experiments/run_solar_seastate_persist3.py, 6f's boat, five sites, packs 10 and 1 kWh, seed 1): states calm / moderate / rough with multipliers F = 1, 1.5, 3 and stationary shares 0.4, 0.3, 0.3. Each day the state is resampled from those shares with probability q and kept otherwise; q in {1.0 (iid), 0.5, 0.15} (mean spells about 1.7, 3.3 and 11 days). Policies: B best constant speed; C oracle with a speed per state; E persistence (speed per state chosen in-sample on yesterday's state). Report E/B, hit rate and the share of the C-B gap E recovers. - Predictions (before running): (1) at q = 1 the hit rate equals the sum of squared shares, 0.34, within 0.03 in all 10 cells (prior 90%). (2) At q = 1 the median share is at most 0.15 and E/B under +1.5% everywhere (prior 65%). (3) The median share rises monotonically with 1/q, and at q = 0.15 is at least 0.5 (prior 70%). (4) At q = 0.15 the three-state share is below 6f's two-state 7-day median of 0.75 in the median (prior 55%: more boundaries, more wrong calls). Refuted: (1) any cell off by 0.03 or more; (2) median above 0.15 or any E/B of +1.5% or more; (3) a non-monotone step or median under 0.5; (4) median share 0.75 or above.
- Limits known in advance: F values and shares are swept choices, not sourced; one seed; in-sample speed triple; exact persistence; resampling chain, not a fitted wave climate.
### Outcome of milestone 6g (experiments/run_solar_seastate_persist3.py, about 6 minutes, seeded; experiments/results_solar_seastate_persist3.txt; 30 cells)
- (1) held: the hit rate at q = 1 is 0.34 in all 10 cells.
- (2) held: at q = 1 the median share of the C-B gap is 0.10 (range 0.04 to 0.16) and the largest E/B is +0.6%; 0 of 30 cells have E below B.
- (3) held: median share 0.10 (hit 0.34) -> 0.48 (q = 0.5, hit 0.67; range 0.43 to 0.65) -> 0.89 (q = 0.15, hit 0.90; range 0.86 to 0.93).
- (4) refuted, with a confound: the q = 0.15 median share is 0.89, above 6f's two-state 7-day 0.75. The comparison is not like for like: q = 0.15 gives mean spells of about 11 days against 7, and hit rate 0.90 against 0.85. At comparable hit rates the two chains look alike (6f: 0.85 -> 0.75; here 0.90 -> 0.89, 0.67 -> 0.48 against 6f's 0.67 -> 0.28), so the third state does not obviously hurt persistence; if anything the middle speed lets a wrong call cost less. I did not test this separately.
- Reading: the shape from 6f carries over to three states. Persistence is near worthless on an iid sea (a tenth of the oracle gain, all of it in-sample fitting of the speed triple) and recovers about half the gain at a 67% hit rate and about 90% at a 90% hit rate. What a sensor-only boat gains depends on spell length, which this programme still cannot source.
- Limits: as planned. F values and shares are choices, one seed, in-sample triple, exact persistence, resampling chain rather than a fitted wave climate.
- Next: a wave-height series if one becomes reachable; milestone 3 tank data remains blocked (Crossref and arXiv answer through the proxy but only return papers, not tables;
eprints.soton.ac.uk still 401).
### Outcome of milestone 3b (experiments/run_catamaran_tank.py, under 1 second, deterministic; experiments/results_catamaran_tank.txt; data experiments/data/catamaran_bare_hull_tank.csv)
- Derived geometry: L = 2.812 m (from Fn) and S = 1.709 m2 (from RT and CT).
- (1) held, but by construction: the implied S is identical at all five speeds (spread 0.0%), so the authors used one reference area. It is a consistency check on my reading of the table, not a finding.
- (2) refuted, and the direction was wrong: I predicted the placeholder would overpredict at Fn 0.72 and 0.79. It underpredicts at low and middle speed: -35% (Fn 0.33), -43% (0.46), -37% (0.58), then -9% (0.72) and +1% (0.79). The tank residual CR = CT - CF is 5.2, 7.4 and 6.8e-3 at the three lowest speeds, 1.5 to 2.1 times CF, with a hump near Fn 0.46 that the placeholder's wave fraction (0.30 to 0.49 of viscous drag) is far too small to produce. My reasoning that tank CT falls with planing was right (10.7 to 6.4e-3) but I forgot the placeholder is a fraction of viscous drag, so it cannot fall or hump.
- (3) held: no single wave_scale keeps all five speeds within 20%; the best leaves 29% to 32% worst error for k from 0.40 to 0. The placeholder's functional form (monotone in Fn) cannot follow a hump followed by a fall.
- (4) held: fitted to the three lowest speeds the worst error is 7% to 9%, but that needs wave_scale 2.4 to 4.2 (k = 0.40 to 0), and the same scale then overpredicts the two fast points by 82% to 92%.
- Reading: on a published 2.8 m catamaran the programme's wave term is short by a factor of about 3 at Fn 0.3 to 0.6, the opposite sign to the Wigley point (3a), where the central constants were 20% high. Combined, the placeholder is not safe for catamarans above Fn 0.3 and the form-factor box is not the dominant error there. The programme's survey speeds (about 1 m/s, Fn 0.16 on a 4 m hull, 6g and earlier) sit below this data's range, so the range rankings are untouched; the ranking claim for catamarans (H2) is not tested at Fn 0.16 by this data. This is a bare hull with trim and sinkage; the model has neither.
- Limits: as planned (five points, one hull, geometry and water type inferred, tabulated by the authors, read second-hand from the spreadsheet only). H3 (Holtrop-Mennen) still untouched.
- Next: a Fn 0.15 to 0.3 catamaran or Wigley-catamaran curve in the survey-speed range; Holtrop-Mennen on this hull (needs a body plan the files do not give).
2026-10-30 · Milestone 3a: one published Wigley tank point against the Michell + ITTC model (planned before running)
- Why: milestone 3 (tank data) has been blocked for a week by data hosts. This session zenodo.org was reachable and holds Wang et al., Wave-resistance computation via CFD and IGA-BEM solvers: a comparative study (OPEC 2017, zenodo.org/records/1169033, CC BY-NC-ND, read only, nothing redistributed). It quotes the Wigley tank measurement of Ju (1983): U0 = 1.67 m/s (Fr = 0.267), wetted area Aw = Cs L (2D + B) with Cs = 0.661, CT = 4.16e-3 on Aw. One point, not a curve, and second-hand (I have not opened Ju 1983). It is the first number in the programme from a tank.
- Assumptions I cannot check from the paper's text: L = 4 m, B = 0.4 m, D = 0.25 m (the standard Wigley, L/B = 10, B/T = 1.6; L = 4 m is implied by Fr = 0.267 at 1.67 m/s), water fresh. Reynolds number is swept over nu for 10 to 25 C.
- Plan (
experiments/run_wigley_tank.py, stdlib): CT_model = (1 + k) CF(ITTC 1957, Re from nu) * S_exact / Aw + Rw_Michell / (0.5 rho U^2 Aw), rho = 999.1; report CT for k in {0, 0.10, 0.25, 0.40} (the programme's swept box), the implied k that matches CT = 4.16e-3, and the same with the Ju wetted area Cs L (2D + B) against the exact Wigley surface. - Predictions (before running): (1) with the programme's central form factor k = 0.25 the model CT is within 20% of 4.16e-3 (prior 55%; this is the H3 test in miniature, and H3 says the regression-style error exceeds 20%, which would here be a refutation of "Michell is fine"). (2) The implied k lies inside the swept box 0.10 to 0.40 (prior 60%; thin-ship theory is known to overpredict Cw near Fr 0.27 which would push implied k down, possibly below 0.10). (3) Michell Rw is greater than the experimental residual CR = CT - CF(1+0) share, i.e. over-predicts wave drag (prior 65%). Refuted: (1) |error| >= 20%; (2) implied k outside 0.10 to 0.40; (3) Michell below the residual.
- Limits known in advance: a single speed; secondary source; geometry assumed; no sinkage and trim; fresh-water temperature unknown.
### Outcome of milestone 3a (experiments/run_wigley_tank.py, under 1 second, deterministic; experiments/results_wigley_tank.txt)
- Check on the assumed geometry: the exact surface of the 4 m, 0.4 m, 0.25 m Wigley is 2.381 m2 and Ju's formula 0.661 L (2D + B) gives 2.380 m2, so the geometry is consistent with the quoted wetted area (now a test).
- (1) refuted, by a small margin: at the central form factor k = 0.25 the model CT is +22% above the tank value at 15 C (+25% at 10 C, +20% at 20 C, +18% at 25 C). The result is not robust to the unknown water temperature across the 20% line, but the sign is the same at every temperature: the programme's central hull constants over-predict this hull's resistance by about a fifth.
- (2) refuted: the form factor that makes the model match the tank is k = -0.03 at 15 C (-0.06 to +0.01 over 10 to 25 C), i.e. zero within the scatter of the unknown temperature, below the swept box 0.10 to 0.40. With k = 0 the model is within +1 to +5% at 10 to 20 C and -1% at 25 C. The Wigley is a thin, fine hull, for which a small form factor is the textbook expectation; the programme's 0.10 to 0.40 box is a value for fuller 4 to 5 m hulls and was never tested against a measurement.
- (3) mixed: Michell Rw gives Cw = 0.963e-3. The tank residual CT - CF is 0.778e-3 (10 C), 0.862e-3 (15 C), 0.936e-3 (20 C), 1.003e-3 (25 C), so Michell over-predicts the residual by 24%, 12% and 3% and under-predicts by 4%. At the nominal 15 C it is high, as predicted, but with one point and an unknown temperature this cannot be called a finding.
- Reading: first contact with a tank number. Michell plus the ITTC line with no form factor reproduces this one Wigley point to a few per cent; the programme's central k = 0.25 does not. For the Wigley hull the sweep box overstates resistance, so its absolute range figures for slender hulls are conservative by up to about 20% on this evidence, and the ranking conclusions (which compare hulls under the same k) are unaffected in sign. Form factor and wave term trade off at a single speed, so this does not validate Michell separately: one speed cannot separate them. A curve over Fr 0.2 to 0.4 could.
- Limits: as planned (one point, second-hand, geometry assumed but cross-checked by the wetted area, no sinkage or trim, water temperature unknown). H3 (Holtrop-Mennen) is untouched.
- Next: find the Wigley Cw/CT curve over Froude number (Ju 1983, Kajitani 1983 or the ITTC workshop data) in a reachable host; a fuller (non-Wigley) small hull for H3.
2026-10-30 · Milestone 6f: with a genuinely iid sea state, what does the persistence forecast capture, and how does it grow with spell length? (planned before running)
- Why: 6e's "Next". Its spell-1 cells are a deterministic alternation (hit rate 0.00) and must not be quoted. At p = 0.5 the
markov chain with mean rough-spell 2 days has stay = enter = 0.5, which is iid, so spell 2 is the honest no-persistence baseline; spell 3 fills the curve between it and 7. - Plan (
experiments/run_solar_seastate_persist_iid.py, 6e's script with SPELLS = 2, 3, 7 days; same boat, sites, packs, p = 0.5, F = 3, seed 1): report E/B, hit rate and the share of the C-B gap E recovers. - Predictions (before running): (1) at spell 2 (iid) the hit rate is within 0.03 of 0.50 in all 10 cells (prior 90%, binomial sd about 0.01 over 3650 days). (2) At spell 2 the median share of the C-B gap is at most 0.15 and E/B is under +1.5% in every cell (prior 60%; yesterday carries no information, so E can only gain by in-sample fitting of the pair). (3) The median share rises monotonically 2 -> 3 -> 7 days (prior 85%). Refuted: (1) any hit rate off by 0.03 or more; (2) median share above 0.15 or any E/B of +1.5% or more; (3) any non-monotone step.
- Limits known in advance: as 6e (p = 0.5, F = 3, one seed, in-sample pair, exact persistence, two-state chain).
### Outcome of milestone 6f (experiments/run_solar_seastate_persist_iid.py, 17 seconds, seeded; experiments/results_solar_seastate_persist_iid.txt; 30 cells)
- (1) held: every spell-2 (iid) cell has a hit rate of 0.50 to two decimals.
- (2) held: the median share of the C-B gap that persistence recovers at spell 2 is 0.06 (range 0.00 to 0.10) and the largest E/B is +0.6% (Equator and Florida, 1 kWh pack); 0 of 30 cells have E below B. The small positive part is in-sample fitting of the speed pair, not forecast skill (hit rate 0.50).
- (3) held: median share 0.06 (spell 2, hit 0.50) -> 0.28 (spell 3, hit 0.67; range 0.18 to 0.39) -> 0.75 (spell 7, hit 0.85; range 0.68 to 0.80). The 7-day cells reproduce 6e exactly.
- Reading: replaces 6e's artifact cells. Persistence is worthless on an iid sea, recovers about a quarter of the oracle gain at 3-day spells and three quarters at 7-day spells, so whether a boat's own wave sensor suffices depends on how long rough spells last, which this programme cannot source (no climatology reachable). Quote the spell-2 row as the no-information baseline; ignore 6e's spell-1 rows.
- Limits: as planned; p = 0.5, F = 3, one seed, in-sample pair, exact persistence, two-state chain.
- Next: a three-state chain or real wave-height series if one becomes reachable; milestone 3 tank data remains blocked.
2026-10-30 · Milestone 6e: does a no-parameter persistence forecast (tomorrow = today) capture the oracle back-off gain? (planned before reading the output)
- Why: 6d's skill s was a free parameter tied to no real product. Persistence needs none: the call for day t is the true state of day t-1. Its hit rate is set by the spell length, so it is the realistic floor a boat with no external forecast (only its own wave sensor) could use.
- Plan (
experiments/run_solar_seastate_persist.py, 6d's script with the skill sweep replaced; same boat, sites, p = 0.5, F = 3, spells 1 and 7 days, packs 10 and 1 kWh, seed 1): policy E uses the pair (v_calm, v_rough) chosen in-sample on persistence calls. Report E/B, hit rate and the share of the C minus B gap E recovers. The script was executed once before these predictions were written, but its output had not been read. - Predictions: (1) at spell 7 days E recovers at least 0.6 of the C-B gap in at least 14 of 20... corrected: in at least 7 of the 10 spell-7 cells (prior 65%: hit rate about 1 - 2/7 = 0.71 at p = 0.5, which 6d put near s = 0.4 to 0.5, so I expect only 0.3 to 0.5, but persistence errors are one-day lags rather than random, which costs less; I lean on 6d's s = 0.5 share of 0.35 as the central guess and put 0.6 as the refutable line). (2) At spell 1 day E is below B in at least 5 of 10 cells (prior 60%: a single-day spell makes yesterday anti-informative, hit rate about 0 to 0.1, and the pair could invert but cannot go below B unless the in-sample pair excludes constants; the pair grid contains the constants, so E >= B always: prediction restated as E within 0.5% of B in every spell-1 cell, prior 70%). Refuted: (1) fewer than 7 of 10; (2) any spell-1 cell off by 0.5% or more.
- Limits known in advance: Markov days with p and F swept; one seed; the pair is chosen in-sample; no real wave-sensor lag.
### Outcome of milestone 6e (experiments/run_solar_seastate_persist.py, 10 seconds, seeded; experiments/results_solar_seastate_persist.txt; 20 cells)
- (1) held: at a 7-day spell persistence recovers 0.68 to 0.80 of the C-B gap in all 10 cells (median 0.75), above the 0.6 line, so my central guess of 0.3 to 0.5 was too low: E/B is +3.6 to +6.4% with the 10 kWh pack and +4.1 to +11.4% with the 1 kWh pack. My arithmetic for the hit rate was also wrong: with p = 0.5 and 7-day spells in both states the day-to-day flip chance is 1/7, so the hit rate is 0.85, not 0.71. Rough-spell persistence is what makes a sensor-only boat nearly as good as the oracle, and no forecast skill parameter is needed.
- (2) refuted, and the cause is a model artifact: at spell 1 day E equals C (share 1.00 in all 10 cells, E/B up to +5.5%) while the hit rate is 0.00. With p = 0.5 the chain
markov builds for spell 1 is a deterministic alternation (stay = 0, enter = 1), so yesterday's state predicts today's perfectly inverted and the in-sample pair simply swaps the two speeds. This is not a result about real seas: the spell-1 cells in 6c and 6d are a deterministic day/night-style cycle, and read as an iid baseline they overstate how predictable the weather is. It also means E >= B everywhere only because the pair grid contains the constants (0 of 20 cells below B). - Reading: for 7-day spells, a boat that only reads yesterday's sea recovers about three quarters of the perfect-foresight gain (hit rate 0.85), which is more than 6d's s = 0.75 curve (0.58) suggests because persistence errors fall on spell boundaries, where being wrong costs one day, while 6d's errors were independent. Only the 7-day cells should be quoted; the 1-day cells measure the artifact.
- Limits: p = 0.5 and F = 3 only; the spell length is swept; one seed; in-sample pair; persistence is exact (no sensor noise or delay); real sea states are not a two-state chain.
- Next: replace the two-state chain with a three-state one or a real wave-height series if a climatology becomes reachable (milestone 3 tank data remains blocked); fix the spell-1 chain to be iid (mean spell 2 at p = 0.5) before quoting any spell-1 figure.
2026-10-30 · Milestone 6d: how much of the oracle back-off gain survives a forecast of finite skill? (planned before running)
- Why: 6c's "Next". C knows each day's sea state exactly, so C/B (3 to 15%) is an upper bound. A real forecast is partly right. Skill is swept, not sourced: no forecast-verification data for small-craft sea state is reachable through the proxy.
- Plan (
experiments/run_solar_seastate_forecast.py, 6c's boat, sites, F = 3, p = 0.5, spell 1 and 7 days, packs 10 and 1 kWh): policy D picks its speed from a forecast that equals the true state with probability s and otherwise is a climatological draw (rough with probability p); energy use follows the true state. s in {0, 0.25, 0.5, 0.75, 1}; (v_calm, v_rough) chosen in-sample for each s (D at s = 1 is C). Report the share of the C minus B gap that D recovers. - Predictions (before running): (1) at s = 0 D is within 0.3% of B in every cell (prior 80%; the pair grid contains the constant speeds, so D(0) >= B, and a random forecast gives nothing to exploit). (2) At s = 0.5 D recovers at least half of the C-B gap in at least 15 of the 20 cells (prior 55%: the gain should be roughly linear in s, a concave curve would push it above). Refuted: (1) any cell off by 0.3% or more; (2) fewer than 15 cells.
- Limits known in advance: errors are independent across days (real forecast errors cluster); one seed for the truth and one for the forecast; the pair is chosen in-sample; skill is a free parameter.
### Outcome of milestone 6d (experiments/run_solar_seastate_forecast.py, about 8 minutes, seeded; experiments/results_solar_seastate_forecast.txt; 20 cells)
- (1) refuted, narrowly: the largest |D(0) - B| / B is 0.325%, against the 0.3% line (median share of the gap recovered at s = 0 is 0.00, maximum 0.12 of a gap that is itself under 4 km/day). D(0) never falls below B.
- (2) refuted, clearly: at s = 0.5 only 1 of 20 cells recovers half the C-B gap (median share 0.35, range 0.08 to 0.50). The curve is convex, not linear: median share 0.11 at s = 0.25, 0.35 at 0.5, 0.58 at 0.75, 1.00 at 1. With p = 0.5 the forecast's hit rate is s + (1 - s)/2, so s = 0.5 is already 75% of days called correctly, and it buys about a third of the oracle's gain.
- Reading: the oracle gain of 3 to 15% (6c) is mostly unreachable by a mediocre forecast. A forecast right on 75% of days recovers about a third of it (roughly 1 to 4% of km/day); it takes about 87% correct (s = 0.75) to recover more than half. The best constant speed B stays the sensible default unless a forecast of sea state at that skill exists.
- Limits: as planned. Independent forecast errors, one seed each for truth and forecast, in-sample pair, p = 0.5 and F = 3 only, and s is not tied to any real forecast product.
- Next: tie s to a real forecast verification figure if one becomes reachable; milestone 3 tank data remains blocked.
2026-10-29 · Milestone 6c: do persistent rough spells and a small pack change what a back-off policy gains over the best constant speed? (planned before running)
- Why: 6b's "Next" and its stated caveat: iid rough days understate spells, and a 10 kWh pack (25% of a 200 kg boat at 200 Wh/kg) buffers a bad week. No climatology is reachable, so spell length is swept, not sourced. Not a prediction of any real sea.
- Plan (
experiments/run_solar_seastate_spells.py, same boat, five sites, daily NASA POWER series): rough/calm two-state Markov chain with stationary rough share p in {0.3, 0.5} and mean rough-spell length in {1 (iid), 3, 7} days; F = 3; pack 10 kWh and 1 kWh (the 1 kWh pack cannot ride out a week). Policies A, B, C as in 6b (C in-sample oracle on each day's state). Report C/B and B/A per cell. - Predictions (before running): (1) with the 10 kWh pack, the C/B gain at a 7-day spell is within 1.5 points of the iid gain in every cell (prior 55%): the pack buffers spells. (2) With the 1 kWh pack, C/B at a 7-day spell exceeds the iid C/B by at least 1 point at the Equator and Florida at p = 0.5 (prior 50%). (3) The site ordering holds under every policy and cell (prior 90%). Refuted: (1) any cell off by more than 1.5; (2) either site under 1 point; (3) any reorder.
- Limits known in advance: C knows the state of each day exactly (no forecast skill); one seed; F and p and spell length are swept, not sourced; no added-resistance curve.
### Outcome of milestone 6c (experiments/run_solar_seastate_spells.py, about 4 minutes, seeded; experiments/results_solar_seastate_spells.txt)
- Correction to the plan: the chain with mean spell length 1 is single-day spells (rough days never follow rough days), not iid; iid at p = 0.5 would be a 2-day mean spell. The comparisons below use spell = 1 as the baseline, and 6b's iid numbers sit between spell 1 and 3.
- (1) refuted: with the 10 kWh pack the C/B gain still rises with spell length, by up to 2.8 points from 1 to 7 days (Equator p = 0.5: 5.4% to 8.2%; p = 0.3: 5.2% to 7.3%), so the pack does not fully buffer a week of rough water.
- (2) held: with the 1 kWh pack and p = 0.5, the 7-day gain exceeds the 1-day gain by 9.4 points at the Equator (5.5% to 14.9%) and 7.1 at Florida (3.7% to 10.8%).
- (3) held: the site ordering holds under A, B and C in every cell.
- Reading: persistence helps the day-by-day back-off and hurts the constant speed that was tuned to the mixture, because the one speed must trade off long calm spells against long rough ones. The pack is the buffer: with 10 kWh the back-off gain is 3 to 8%, with 1 kWh it reaches 15% where sun is plentiful. B/A shrinks with spell length (Equator p = 0.5: 15.3% to 10.8% with the big pack), so the best constant speed matters less and a regime-aware policy more.
- Limits: as planned. C has perfect knowledge of each day's state; a real forecast would capture only part of the gain; spell length, p and F are swept, not sourced; one seed; the Markov chain has no seasonality.
- Next: a forecast of finite skill on the Markov chain (the upper bound C becomes a curve in skill); milestone 3 tank data remains blocked.
2026-10-29 · Milestone 6b: if rough days are intermittent, how much does a speed policy that backs off on rough days gain over the best constant speed? (planned before running)
- Why: 6a's "Next". 6a showed that keeping the calm best speed in a constant f = 2 sea loses 12 to 27%, but real seas alternate. No wave climatology is reachable (data hosts refused by the proxy, as in 5m), so the step sweeps the share of rough days p and the rough multiplier F rather than reporting a site's sea. Not a prediction of any real sea.
- Plan (
experiments/run_solar_seastate_policy.py, same 5 m boat, hotel 10 W, eta_pv 0.20, derate 0.85, five sites, the daily NASA POWER series): each day is rough with probability p (seeded iid draws, seed 1, same draws for all policies), f = F on rough days and 1 on calm days; p in {0.1, 0.3, 0.5}, F in {2, 3}. Policies, speeds on a 0.5 to 2.0 m/s grid: (A) the calm-sea best constant speed; (B) the best constant speed for the mixture; (C) an oracle that knows each day's f and uses the best pair (v_calm, v_rough), chosen in-sample. Report km/day of each and the gains C/B and B/A. - Predictions (before running): (1) C beats B by under 3% in every cell (prior 55%): the km/day-versus-speed curve is flat near its optimum (5j). (2) A loses at least 5% to B in the p = 0.5, F = 3 cells at every site (prior 60%). (3) The site ordering holds under every policy and cell (prior 90%). Refuted: (1) any cell at 3% or more; (2) any site under 5%; (3) any reorder.
- Limits known in advance: iid days (real rough spells persist, and a pack carries energy across them, which favours C); C is in-sample and has perfect foresight, so it is an upper bound on a forecast-driven policy; f is a free multiplier; one decade, one cell per site.
### Outcome of milestone 6b (experiments/run_solar_seastate_policy.py, about 1 minute, seeded; experiments/results_solar_seastate_policy.txt)
- (1) refuted: the oracle pair (C) beats the best constant speed (B) by 3% or more in 9 of 30 cells and by up to 6.8% (Equator, p = 0.5, F = 3). Elsewhere 0.4 to 2.6% at moderate p; at p = 0.1 it is 0.4 to 2.4%. Gains grow with p, F and sunshine (largest at the Equator and Florida, smallest at the Gulf of Alaska, 0.6 to 3.9%).
- (2) held: at p = 0.5, F = 3 the mixture-tuned constant speed beats the calm-best one by +13.0% (Equator), +14.5% (Florida), +13.7% (Gulf of Maine), +9.0% (North Sea), +5.4% (Gulf of Alaska); the Alaska case is 0.4 points above the line. At p = 0.1 the calm-best speed is within 0.8% of B in every cell.
- (3) held: the site ordering holds under all three policies in every cell.
- Reading: if rough days are 10% of days, ignoring them costs under 1%; at half the days with a tripled resistance, re-tuning the one cruise speed recovers 5 to 15%, and a day-by-day back-off adds up to 7% more, mostly where sun is plentiful. The caveat that matters: C is in-sample with perfect foresight and iid days, so 6.8% is an upper bound on a forecast-driven policy; persistent rough spells draining a pack would favour backing off more, and this run cannot size that.
- Limits: as planned. F and p are swept, not sourced; the wave climatology is still missing.
- Next: a persistence model (Markov rough spells) with a forecast of finite skill, if a climatology can be sourced; otherwise milestone 3 tank data.
2026-10-29 · Milestone 6a: how much does a sea-state resistance multiplier cost the deck-solar boat in km/day, and does it move the best speed or the site ordering? (planned before running)
- Why: milestone 6 (sea states) is the largest effect the programme has not touched, and the draft's
paper/DRAFT.md says there is no sea-state loss. Added resistance in waves for a 4 to 5 m hull has no published curve I could cite here (strip-theory and Kwon-type speed-loss formulas are fitted to ships far above this size), so I do not invent one: the step sweeps a multiplier f on the hull resistance (friction, form and wave terms together) and reports where the conclusions break. This is a sweep because nothing sourced exists, not a prediction of any real sea. - Plan (
experiments/run_solar_seastate.py, same boat and daily NASA POWER series as 5m, 4 m and 5 m, five sites): power-side inputs at the 5m medians (hotel 10 W, eta_pv 0.20, derate 0.85 after 5l/5m ranges), hull at the central constants; f in {1.0, 1.25, 1.5, 2.0, 3.0}; best constant speed (0.5 to 2.0 m/s) and km/day per cell; the ratio to f = 1; the speed that is best at f = 1 run at f = 2 (regret). - Predictions (before running): (1) at 5 m, km/day at f = 2 is 55 to 80% of f = 1 at every site (prior 60%). (2) the best speed falls by at least 0.2 m/s from f = 1 to f = 2 at every 5 m site (prior 55%). (3) the site ordering holds at every f (prior 90%). Refuted: (1) any site outside 55 to 80%; (2) any 5 m site shifts under 0.2; (3) any reorder.
- Limits known in advance:
f is a free multiplier, not a sea state; it is constant over the decade although real seas vary by season and site (so the high-latitude sites, which have the worst seas and the least sun, would lose more than this treats them); no added mass, slamming, heave-induced propeller ventilation or drift.
### Outcome of milestone 6a (experiments/run_solar_seastate.py, a few seconds, deterministic; experiments/results_solar_seastate.txt)
- (1) held, at the edge: 5 m km/day at f = 2 is 79% of f = 1 at all five sites (80% is the refutation line; the 4 m boat is also 79%). f = 1.5 gives 87%, f = 3 gives 68 to 69%. The loss is almost site-independent because every site is drag-limited once the multiplier is applied.
- (2) held: the 5 m best speed falls 0.3 m/s (Equator, Florida, Gulf of Maine), 0.2 (North Sea, Gulf of Alaska) from f = 1 to f = 2; 1.6 to 1.3, 1.6 to 1.3, 1.5 to 1.2, 1.4 to 1.2, 1.3 to 1.1.
- (3) held: the site ordering holds at every f in both boats.
- New, not predicted: keeping the calm-water best speed in a rougher sea costs a lot: running the f = 1 speed at f = 2 loses 12.1% (5 m Gulf of Alaska) to 27.1% (5 m Equator) of the km/day the boat could make at its own best speed, 16 to 28% for the 4 m boat. That is 2 to 3 times the hull-constant regret of 5j (up to 9%), so a speed policy that backs off in rough water is worth more than any of the hull-constant choices. It is largest where the sun is plentiful because there the calm-water best speed is highest.
- Reading: a resistance multiplier of 2 costs about 21% of the km/day and lowers the best cruise speed by 0.2 to 0.3 m/s, and does not reorder the sites; the shape of these conclusions survives, the absolute numbers fall. This says nothing about which f a real sea gives.
- Limits: as planned. f is a free multiplier, constant over time and across sites; real high-latitude seas would raise f exactly at the sites with the least sun, so the true site ordering could change and this run cannot say; a reported f would need a sea-state climatology (wave-height series, not fetched here) and an added-resistance curve for a 4 to 5 m hull.
- Next: source a wave climatology for the five cells and a small-hull added-resistance relation (tank data, same blocker as milestone 3), then replace the constant f by a seasonal one; test a policy that cuts speed when the wave height rises.
2026-10-29 · Milestone 7a: paper skeleton from logged results (no experiment run)
- Why: milestone 3 stayed blocked. Tried again this session:
eprints.soton.ac.uk/63772 returned 401 and jtse.utm.my reset the connection, so no Wigley table was obtained. Rather than restate the blocker, paper/DRAFT.md collects what the programme can support today (ranking across rungs is robust; absolute km/day is known to about +-10% from power-side inputs and another +-10% from the hull box) and lists what stands between this and a submittable paper. - No new numbers; each figure in the draft is copied from an entry above and names its results file. Nothing was predicted or run.
- Next: milestone 3 once a table is reachable; opening the cited datasheets; sea-state loss (milestone 6).
2026-10-29 · Milestone 5m: what interval does km/day carry when every power-side input is drawn jointly from its range? (planned before running)
- Why: 5k/5l varied inputs one or two at a time; 5l's "Next" asked for a sourced derate. NASA POWER (
power.larc.nasa.gov) was refused by the session proxy, so no new temperature series could be fetched and the derate cannot be rebuilt from site temperatures here. Instead the derate is split into factors with ranges and drawn jointly. Ranges (the first two from 5l's snippet-level sources, PDFs unopened; the rest my choices, not sourced): hotel 5 to 20 W (Wave Glider sheet average), eta_pv 0.17 to 0.22, temperature factor 0.93 to 1.00 (coefficient -0.29 %/K from the Maxeon datasheet snippet times 0 to 25 K above 25 C cell temperature), soiling and spray 0.90 to 0.99, mismatch, wiring and MPPT 0.92 to 0.97. Hull constants at the 5k centre. - Plan (
experiments/run_solar_mc.py, 5 m and 4 m, five sites, 500 seeded joint uniform draws, seed 1): per draw the best constant speed (0.5 to 2.0 m/s grid) and km/day. Report median and 5th to 95th percentile of km/day and best speed per site, and the share of draws where the site ordering (Equator > Florida > Gulf of Maine > North Sea > Gulf of Alaska) holds. - Predictions (before running): (1) the 5 to 95% km/day band is within +-25% of the median at every 5 m site (prior 60%). (2) The 5 m median best speed is 1.1 to 1.6 m/s at every site (prior 80%). (3) The site ordering holds in at least 95% of draws at 5 m (prior 85%). Refuted: (1) any band edge beyond 25%; (2) any median outside 1.1 to 1.6; (3) under 95%.
- Limits known in advance: uniform draws over ranges I picked (no source gives a distribution); the unsourced factors dominate the spread; the hull constants are fixed; daily steps; one cell per site.
### Outcome of milestone 5m (experiments/run_solar_mc.py, 2 min, seeded; experiments/results_solar_mc.txt)
- (1) held: the 5 to 95% km/day band is -7/+6% (Equator) to -10/+9% (Gulf of Alaska) of the median in the 5 m boat; the 4 m boat is wider, up to -15/+13% (Gulf of Alaska).
- (2) held, at the edge: 5 m median best speed 1.6 (Equator, Florida), 1.5 (Maine), 1.4 (North Sea), 1.3 (Alaska) m/s, inside 1.1 to 1.6. Medians are higher than 5l's because the drawn hotel (5 to 20 W) is below the 5k centre.
- (3) held: the site ordering holds in 500 of 500 draws in both boats.
- Reading: with the power-side inputs drawn jointly from published-ish ranges, 5 m km/day is about 133 / 125 / 97 / 77 / 69 km/day (Equator to Alaska), each known to roughly +-10%. The joint interval is narrower than the one-at-a-time swings of 5k suggest, because the draws are interior to the ranges and the ends rarely coincide. It says nothing about the hull constants (5j: another +-10%) or the unsourced wave term.
- Limits: as planned. Uniform draws over ranges I picked; the temperature, soiling and electrical factors are my ranges, not sourced; the temperature series could not be fetched (NASA POWER refused by the proxy), so site-specific cell temperatures are not modelled; the 5l sources were not opened.
- Next: open the Wave Glider and module datasheets for citation; hull constants still need milestone 3 (tank data).
2026-10-29 · Milestone 5l: does the best cruise speed and km/day survive swapping the unsourced hotel load and panel efficiency for published figures? (planned before running)
- Why: 5k's "Next": hotel load and panel yield dominate km/day. Sources found this session (search snippets only; the vendor PDF host was not reachable from the session, so the PDFs were NOT opened, and each needs opening before it goes in a paper): Liquid Robotics/Boeing Wave Glider product sheet, "average continuous power 5 W to 20 W"; a Renewable Energy 2022 simulation paper (ideas.repec.org/a/eee/renene/v188y2022icp911-921.html), about 10 W continuous available to payloads; SunPower Maxeon 3 rigid module datasheets, module efficiency 22.1 to 22.6% and power temperature coefficient -0.29 %/degC, cell 23.1 to 24.3% (enfsolar cell datasheet 1740). A rigid module is an upper end for a curved deck, so eta_pv 0.22 is an optimistic anchor and 0.17 stays as the flexible/mismatch case. The derate (soiling, wiring, mismatch, temperature) stays unsourced except temperature: 25 K above 25 degC at -0.29 %/K is -7.3%, so derate 0.85 is not contradicted but not measured either.
- Plan (
experiments/run_solar_sourced.py, same boat, daily NASA POWER series, 4 m and 5 m, five sites, no source changes): hotel in {5, 10, 20, 30} W x eta_pv in {0.17, 0.22}, derate 0.85, hull at the central constants. Report best speed and km/day per cell, and the ratio against the 5k centre (30 W, 0.20). - Predictions (before running): (1) at a sourced hotel of 10 W the 5 m best speed is 0.3 m/s or more lower than at 30 W at the energy-limited sites (Gulf of Maine, North Sea, Gulf of Alaska) (prior 55%): less fixed load shifts the best-range speed down. (2) km/day at 10 W and eta 0.22 is at least 1.5 times the 5k centre at those three sites in the 5 m boat (prior 60%). (3) The site ordering (Equator > Florida > Gulf of Maine > North Sea > Gulf of Alaska) is unchanged in every cell (prior 85%). Refuted: (1) any of the three sites shifts under 0.3; (2) any ratio under 1.5; (3) any reorder.
- Limits known in advance: the 5 to 20 W figure is a Wave Glider average over a mission, not this boat's propulsion-excluded hotel load, and includes sleeping payloads; a drive computer and a motor controller sit on top; rigid module efficiency is not a curved-deck figure; unopened PDFs.
### Outcome of milestone 5l (experiments/run_solar_sourced.py, a few seconds, deterministic; experiments/results_solar_sourced.txt)
- (1) refuted, and my sign was wrong. I wrote that less fixed load would lower the best speed; it raises it (a lower hotel load makes the same speed cheaper relative to harvest). Going from 30 W to 10 W (eta 0.17) shifts the 5 m best speed by +0.1 (Gulf of Maine), +0.2 (North Sea) and +0.2 (Gulf of Alaska) m/s, under the 0.3 line in magnitude too.
- (2) refuted: km/day at 10 W and eta 0.22 is 1.21x (Gulf of Maine), 1.23x (North Sea) and 1.28x (Gulf of Alaska) the 5k centre in the 5 m boat, under 1.5x. The 4 m boat gains more (North Sea 1.47x, Gulf of Alaska 1.57x) because its harvest is smaller relative to its load.
- (3) held: the site ordering is unchanged in all 16 cells (hotel x eta x boat length).
- Reading: swapping the unsourced hotel load for the Wave Glider's published 5 to 20 W average, and eta for a rigid-module 0.22, raises 5 m km/day at the three energy-limited sites by 10 to 28% at 10 W (eta 0.17 to 0.22) against 5k's centre and moves the best speed by at most 0.2 m/s. The 5k centre (30 W, 0.20) was pessimistic against the sourced figures, so the absolute km/day in earlier milestones are conservative, not optimistic, on those two inputs. The best speed stays 1.1 to 1.5 m/s, so 5i's "cruise at 1.1 to 1.5, not 1.0" survives sourcing.
- Limits: as planned; the sourced hotel figure is a different vehicle's mission average, not this boat's, and its PDFs were not opened here; rigid-module efficiency is an upper end for a curved deck; the derate stays unsourced; the wave constants are still unsourced (milestone 3).
- Next: a sourced derate (soiling, mismatch, temperature) and a propulsion-excluded hotel load for a small USV (e.g. a published drive-computer and radio budget); milestone 3 for the hull.
2026-10-29 · Milestone 5k: which of the six inputs moves the best cruise speed and the km/day most? (planned before running)
- Why: 5j's "Next". 5j varied only the hull constants and found they matter more than the speed policy; the hotel load, panel efficiency and derate are unsourced too. Plan (
experiments/run_solar_sensitivity.py, same boat, daily NASA POWER series, 4 m and 5 m, five sites, no source changes): one-at-a-time swing of each input from the central boat (c_s 3.0, k_form 0.25, wave 1, hotel 30 W, eta_pv 0.20, derate 0.85) to a low and a high value: c_s 2.6/3.4, k_form 0.10/0.40, wave scale 0.5/1.0 (above 1 untested), hotel 20/45 W (about -33%/+50%), eta_pv 0.17/0.23, derate 0.75/0.95. For each: best constant speed (0.5 to 2.0 m/s, 0.1 steps) and km/day at that speed. Rank inputs by the km/day swing (high minus low, % of central) and by the best-speed shift. - Predictions (before running): (1) the hotel load is the largest km/day swing at the energy-limited sites (Gulf of Maine, North Sea, Gulf of Alaska) in the 5 m boat (prior 65%). (2) At the Equator the largest km/day swing is a hull constant (c_s or k_form), not a power-side input (prior 75%): the pack is never the limit, so speed is set by drag. (3) Eta_pv and derate give identical swings per percent (they enter as a product) and the 5 m best speed moves under 0.2 m/s across their range at every site (prior 60%). Refuted: (1) a different input tops any of the three sites; (2) a power-side input tops the Equator; (3) any best-speed shift of 0.2 m/s or more.
- Limits known in advance: the ranges are my choice, not measurements (so the ranking is conditional on them, and I say which are wider); one-at-a-time ignores interactions; wave scale low value 0.5 is a shrink only; daily steps; one cell per site.
### Outcome of milestone 5k (experiments/run_solar_sensitivity.py, a few seconds, deterministic; experiments/results_solar_sensitivity.txt)
- Disclosure: I reworded the wave-scale phrase in the plan after the run because it was garbled (the script's 0.5 to 1.0 range was already what ran; predictions untouched).
- (1) held: hotel load has the largest km/day swing in the 5 m boat at Gulf of Maine (-21.8% for 30 to 45 W against 20 W), North Sea (-25.8%) and Gulf of Alaska (-30.2%).
- (2) refuted: hotel also tops the Equator (5 m: -19.9%; 4 m: -38.2%), not a hull constant. My reasoning that an unconstrained pack leaves drag in charge ignored that at 1.0 to 1.5 m/s the 30 W hotel is still a large share of the load, and the km/day swing at the Equator comes from the speed the boat can afford, which scales with surplus power.
- (3) refuted by one case: eta_pv and derate act as one product (the per-percent swings agree to about 10%: e.g. 5 m Equator +16.2% for +/-15% in eta_pv against +13.4% for +/-12% in derate), but the 5 m best speed shifts by 0.2 m/s at Gulf of Alaska (1.1 to 1.4 across the eta_pv range), meeting the refutation line. Everywhere else the shift is 0.1 m/s.
- Ranking, all ten cases: hotel (19 to 50%) > eta_pv (16 to 30%) > derate (12 to 23%) > c_s (8.6 to 9.3%) > k_form (7.9 to 8.4%) > wave scale (0.3 to 1.2%). The ranges are my choices, so the order of hotel against eta_pv depends on them; the gap between the power-side inputs and the hull constants is 2 to 5 times in every case and does not depend on which ends of the ranges I picked within a factor of two.
- The best speed is robust; km/day is not. Every input moves the best speed by 0.0 to 0.2 m/s, yet moves km/day by up to 50%. That agrees with 5j (hull constants move the best speed by 0.3 m/s and km/day by about 10%) and sharpens it: the thing to measure first is the vehicle's hotel load and panel yield, not its hull. The wave term is nearly irrelevant to km/day at this speed range, so the Michell scale worry from 5i/5j matters little for the energy answer.
- Limits: ranges chosen, not measured (hotel 20 to 45 W is asymmetric about 30 W); one-at-a-time, no interactions; 0.1 m/s speed grid, so shifts of 0.1 are at the resolution; daily steps; one cell per site; wave scale only shrunk.
- Next: source the hotel load (a published USV or AUV payload and computer budget) and the panel yield (a datasheet module efficiency plus a soiling and temperature derate), as those now dominate; milestone 3 remains blocked on tank data but matters less for km/day than 5j suggested.
2026-10-29 · Milestone 5j: does the best constant speed of a deck-solar boat survive the unsourced hull constants? (planned before running)
- Why: 5i's "Next" and the open doubt that every absolute speed rests on
c_s, k_form and the wave scale, none sourced (milestone 3 is blocked on tank data). Plan (experiments/run_solar_hull_uncertainty.py, solar.py and hull.py unchanged): the 5i boat (30 W hotel, eta_pv 0.20, derate 0.85, 200 kg, 10 kWh pack), 4 m and 5 m, five sites, all 3,653 days of NASA POWER daily data. Hull box = the milestone-1 box: c_s {2.6, 3.0, 3.4} x k_form {0.10, 0.25, 0.40} x wave scale {0, 0.5, 1} = 27 hulls. For each hull: best constant speed on a 0.5 to 2.0 m/s grid (0.1 steps) and its km/day. Then: (a) spread of the best speed across the 27 hulls; (b) regret of running the central-hull best speed (c_s 3.0, k 0.25, wave 1) on each other hull, as % of that hull's own best; (c) the single speed that minimises worst-case regret over the box and its worst regret. - Predictions (before running): (1) the best speed spans at least 0.3 m/s across the box in the 5 m boat at 3 or more of 5 sites (prior 70%). (2) Running the central-hull best speed costs under 5% on every hull in the box, every site and boat (prior 75%): the km/day-versus-speed curve is flat near its optimum. (3) The worst-case regret of the minimax speed is under 3% in every site-boat case (prior 70%). Refuted: (1) fewer than 3 sites; (2) any case at 5% or more; (3) any case at 3% or more.
- Limits known in advance: the box is the same unsourced range as milestone 1, not a measurement; wave scale 0 removes wave-making entirely, which is unphysical above Fr 0.25; speeds above 1.5 m/s sit where Michell scale 1 is least trustworthy (5i); daily steps; one cell per site, one decade; no round-trip loss or depth of discharge.
### Outcome of milestone 5j (experiments/run_solar_hull_uncertainty.py, 4 s, deterministic; experiments/results_solar_hull_uncertainty.txt)
- (1) held: the best constant speed spans 0.3 m/s across the 27 hulls in the 5 m boat at 4 of 5 sites (1.3 to 1.6 Equator, 1.4 to 1.7 Florida, 1.3 to 1.6 Gulf of Maine, 1.2 to 1.5 North Sea; 1.2 to 1.4 Gulf of Alaska) and 0.2 to 0.3 m/s in the 4 m boat (1.0 to 1.3). The hull box moves the best speed by about as much as 5i's whole "best constant vs 1.0 m/s" correction.
- (2) refuted: running the central hull's best speed on another hull in the box costs 5% or more in 3 of 10 cases: 9.1% (5 m Equator), 5.8% (4 m Equator), 5.5% (5 m Florida). Elsewhere 1.4 to 4.9%. The loss is largest where the pack is never the limit (Equator, Florida), because there the boat simply cruises faster the less drag it has, and the box's drag range is wide.
- (3) refuted: the minimax speed (the one speed with the least worst-case loss over the box) still has worst-case regret of 3% or more in 6 of 10 cases, worst 6.5% (5 m Equator, 1.5 m/s). At the energy-limited high-latitude sites the central speed is already minimax (regret 1.4 to 4.9%).
- Absolute range moves far more than the best speed: at each hull's own best speed the 5 m Equator boat covers 109 to 133 km/day, Gulf of Maine 78 to 95, North Sea 61 to 74. So the unsourced hull box is worth about +-10% on km/day; the ordering of sites is unaffected, the absolute km/day is not trustworthy to better than that until milestone 3.
- Reading: "cruise at 1.1 to 1.5 m/s, not 1.0" (5i) is robust in direction; the exact best speed is not known to better than 0.3 m/s without a sourced hull. Both 5i's surge gain (under 3%) and the hull box's regret (up to 9%) say the same thing: the hull constants matter more than the speed policy.
- Limits: as planned. The box is the milestone-1 range, not a measurement; wave scale 0 is unphysical at Fr above 0.25, so the Equator/Florida 5 m worst cases lean on the optimistic corner of the box; no joint sweep with hotel load or panel efficiency.
- Next: milestone 3 (Holtrop-Mennen or a published small-hull curve) to narrow the box; a sensitivity ranking of the six inputs (hull constants, hotel, eta_pv, derate) on best speed.
2026-10-29 · Milestone 5i: is 5h's surge gain a property of the rule, or of the best constant speed it was compared with? (log written after the one run; no prediction was committed before it)
- Why: 5h's "Next" and a doubt about its own comparison: it reported the surge rule against fixed 1.0 m/s, but the best constant speed was already 1.1 to 1.4 m/s. Plan (
experiments/run_solar_surge_holdout.py, same boat, pack and daily NASA POWER series, 4 m and 5 m, five sites, no source changes): split the decade into A (2015 to 2019) and B (2020 to 2024); on one half fit the best constant speed (0.6 to 1.7 m/s) and the best surge rule (base 0.8 or 1.0, fast 1.2 to 2.8 m/s, level 30 to 99%; 5h's grid stopped at 1.6 and 70%); score both on the other half, each starting from a full pack; swap halves (20 fits). - Disclosure: no predictions were committed first. My unrecorded expectation was that a held-out surge rule would still beat the best constant speed by several percent in the 5 m boat.
### Outcome of milestone 5i (experiments/run_solar_surge_holdout.py, a few seconds, deterministic; experiments/results_solar_surge_holdout.txt)
- Most of 5h's "surge gain" was the constant speed, not the rule. Held out, the surge rule beats the best constant speed fitted on the same half by under 3% in all 20 fits (0 of 20 reach +3%; best +3.0%, rounded, at 5 m Gulf of Maine in both directions). The 4 m boat gain is -0.3 to +0.8%, i.e. nothing. At 5 m: +2.1/+1.9% Florida, +3.0/+3.0% Gulf of Maine, +2.9/+2.6% North Sea, +1.3/+1.6% Gulf of Alaska, about 0% at the Equator (where the pack is never the limit).
- Against fixed 1.0 m/s the gains are large (5 m: 86.4 to 116 to 119 km/day at the Equator, 73 to 88 at Gulf of Maine) but nearly all of it is just cruising at 1.3 to 1.5 m/s. 5h's +20/+17/+11/+32% should be read as "about 17/14/9/30 points from the faster constant speed, the rest from surging".
- Out of sample, the rule transfers: regret against a same-half oracle rule is 0.0 to 0.6% in every fit; the fitted parameters are the same in both halves for most cases (5 m Gulf of Maine: base 1.0, fast 1.6 above 70% both ways). The 5 m rules at Florida and Maine have a fast speed (1.6 m/s) well inside the widened 1.2 to 2.8 grid, so 5h's edge worry does not apply there; the
[edge] flags in the output are mostly cases where the fitted rule is degenerate (fast speed 1.2 m/s, or a level of 30% or 99%) and reduces to a constant speed. 6 of 20 fits are fully interior. - Reading: the useful policy for a deck-solar boat is "pick the right constant speed (1.1 to 1.5 m/s here, not 1.0)"; a pack-level surge rule adds at most about 3% on top, and only in a 5 m boat above 25 N. It is a small refinement, not a headline. That corrects the emphasis of 5h.
- Limits: daily steps; two five-year halves of one decade at one 1-degree cell per site; the constant speed and rule are fitted by grid search; no round-trip loss, depth-of-discharge limit or forecast; wave-making at 1.5+ m/s (Fr about 0.3 at 5 m) is only approximated by the Michell scale 1 term, so the speeds above 1.4 m/s are the least trustworthy part of the result; a 3% margin is inside the model-form uncertainty of the hull constants.
- Next: milestone 3 (Holtrop-Mennen against tank data) is still the blocker for trusting absolute speeds; the hull-constant uncertainty should be propagated through the best-constant-speed result.
2026-10-28 · Milestone 5h: is 5g's "slowing never helps" a property of the thresholds I picked, or of the boat? (planned before running)
- Why: 5g's "Next". It tried one threshold (30%) and two slow speeds (0.5, hold), so the result could be an artefact of those. Plan (
experiments/run_solar_policy_bound.py, same boat, pack and daily NASA POWER series as 5g, 4 m and 5 m, five sites, 3,653 days, no source changes): (a) a constant-speed sweep 0.4 to 1.4 m/s; (b) the 5g threshold policy swept over threshold {10, 20, 30, 50}% x slow speed {0.3, 0.5, 0.7, 0.9} m/s; (c) a perfect-forecast upper bound on distance for ANY schedule. The bound: distance per day is 86.4 v while the day's energy is 24 P(v), P convex in v, so distance is concave in energy and (Jensen) the best schedule pooled over the decade spends (initial pack + total harvest) at one constant speed; ignoring pack capacity and the daily timing only loosens it, so it is an upper bound, not an achievable policy. Speed capped at 3 m/s. - Predictions (before running): (1) no threshold policy in (b) beats the best constant speed in (a) by more than 1% in any of the 10 site-boat cases (prior 80%). (2) In cases where fixed 1.0 m/s leaves the pack empty on 5% or more of days, the perfect-forecast bound exceeds fixed 1.0 by under 10% (prior 75%): there the boat is energy-limited and 1 m/s is near the best-range speed. Refuted: (1) any case more than 1%; (2) any such case 10% or more.
- Limits known in advance: daily steps; the bound ignores pack capacity (a surplus in summer cannot be stored to winter) so it is loose where seasons differ; no round-trip loss or depth-of-discharge limit; one cell per site.
### Outcome of milestone 5h (experiments/run_solar_policy_bound.py, under 3 s, deterministic; experiments/results_solar_policy_bound.txt)
- Correction made after seeing the first run (disclosed): my first "perfect-forecast bound" (one constant speed spending pack plus total harvest, by Jensen) came out below simulated policies in four cases, so it was not a bound. The reason is the simulator's stall rule: a stopped boat draws nothing, so duty-cycling at the best-range speed beats any constant speed when energy-limited. The reported bound is the upper concave hull of the origin and the (energy, distance) curve at the pooled energy per day; the script now also checks that no simulated policy exceeds it (none does). Prediction 2 below was judged against this corrected bound.
- (1) held: no threshold policy (10 to 50% x 0.3 to 0.9 m/s) beats the best constant speed by more than 1% in any of the 10 cases. The best threshold policy is always the mildest (below 10%, slow to 0.9 m/s) and still sits 0.3 to 1.0 km/day under fixed 1.0 m/s in the energy-limited cases. So 5g's "slowing never raises distance" is not an artefact of the 30% and 0.5 m/s I picked.
- (2) refuted, in the 5 m boat: the corrected bound exceeds fixed 1.0 by 32% (Gulf of Maine), 25% (North Sea) and 16% (Gulf of Alaska) where the pack is empty on 29 to 53% of days. The 4 m boat cases are within 0 to 7% as predicted. My reasoning that an energy-limited boat sits at the best-range speed ignored that the 5 m boat has a summer surplus the 10 kWh pack cannot hold, so it is energy-limited in winter and energy-rich in summer.
- Where the headroom is (exploratory, added after seeing the results, not pre-registered): the best constant speed is 1.1 to 1.4 m/s, not 1.0, and a surge rule (1.0 m/s normally, a faster speed while the pack is above a level) reaches 87.5 km/day against 73.0 for fixed 1.0 at 5 m Gulf of Maine (+20%), 67.6 against 58.0 at 5 m North Sea (+17%), 58.8 against 52.9 at 5 m Gulf of Alaska (+11%), and 113.8 against 86.4 at 5 m Florida (+32%). For the 4 m boat the gain is 0 to 6%. Several best cases sit at the grid edge (1.6 m/s, 70%), so these are lower bounds on the rule's value. This reverses 5g's reading for the 5 m boat: the useful policy is not slowing when low but spending the surplus when full, which the clipped pack otherwise wastes.
- Limits: daily steps; a daily-mean harvest means the surge level is a pack level, not a clock rule; no round-trip loss or depth-of-discharge limit; faster speeds add wave-making the Michell scale 1 term only approximates (speeds up to 1.6 m/s, Fr about 0.26 at 5 m); the bound ignores pack capacity so it is loose; one 1-degree cell per site and one decade.
- Next: widen the surge grid past its edges and fit the rule on one half of the decade, test it on the other; milestone 3 still blocked on tank data.
2026-10-28 · Milestone 5g: does slowing down when the pack is low keep a deck-solar boat moving, or only keep it alive? (log written after the one run; no prediction was committed before it)
- Why: 5f's "Next": its empty-pack days assume the boat holds 1 m/s regardless. Plan (
experiments/run_solar_policy.py, same boat, pack and NASA POWER daily series as 5f, 4 m and 5 m, all 3,653 days, year-round, start with a full pack): three policies, fixed 1.0 m/s; 1.0 m/s but 0.5 m/s while the pack is under 30%; 1.0 m/s but hold station (hotel load only) under 30%. Per policy: km/day, share of days the pack hits zero, share of days slowed. A day that would end below zero runs only the fraction its energy lasts. - Disclosure: I did not commit predictions first. My unrecorded expectation was that slowing would raise distance by avoiding stalls; the data went the other way, so nothing here was tuned to a prior.
### Outcome of milestone 5g (experiments/run_solar_policy.py, under 1 s, deterministic; experiments/results_solar_policy.txt)
- Slowing never raises distance. Fixed 1 m/s covers the most km/day in all 10 site-boat cases (ties at the 5 m Equator, where nothing binds): e.g. 4 m Gulf-of-Maine 61.7 km/day fixed, 53.9 slowed, 39.5 held; 5 m North-Sea 58.0, 53.2, 44.1. The 30 W hotel load dominates at 0.5 m/s, so a slow boat spends nearly as much energy per day and covers half the distance; holding station is worse still.
- What slowing buys is fewer dead days, not more distance. Pack-empty days at 4 m Florida fall from 25.4% (fixed) to 4.2% (slow) and 1.5% (hold); 4 m Equator from 8.5% to 0.0%. Above 42 N slowing cuts empty days only modestly (5 m North-Sea 45.7% to 40.1%) because the deficit is seasonal, not a dull spell.
- The 5 m boat is nearly unaffected at 25 N and below (empty days 0.0 to 0.2%); at 42 N and above it is stalled 29 to 53% of days when fixed, so the pack, not the policy, is the limit in winter, matching 5f's year-round need of 41 kWh at 42 N.
- Reading: the speed policy is a reliability feature (keep the pack off zero, keep the survey recoverable), not a range feature, in a hotel-load-dominated boat; a policy that would raise distance has to be an optimal schedule over the forecast, not a threshold, which is not tried here.
- Check: the 5 m Equator case, where harvest exceeds load every day, returns exactly 86.4 km/day (1 m/s x 86,400 s) under every policy.
- Limits: threshold (30%) and the two slow speeds not swept; daily steps (no night or within-day shape); no round-trip loss or depth-of-discharge limit; one cell per site, one decade; the partial-day rule is an energy-proportional approximation; no forecast.
- Next: sweep the threshold and slow speed, and an optimal-schedule bound against a perfect forecast; milestone 3 still blocked.
2026-10-28 · Milestone 5f: do daily cloud runs break the monthly-mean "energy-neutral" verdict, and how big a pack bridges a year? (planned before running)
- Why: 5e called a boat neutral in a month when the monthly-mean harvest covers the load, but a battery bridges only so many overcast days. NASA POWER daily ALLSKY_SFC_SW_DWN (same cells as 5e, 2015-01-01 to 2024-12-31, 3,653 days per site, kept as fetched in
experiments/data/daily_<site>.json) lets the check be run rather than assumed. Daily Wh = A eta_pv f I_day x 24 against load x 24, with I_day = kWh/m2/day x 1000/24. - Plan (
experiments/run_solar_storm.py, imports solar.py and hull.py unchanged): central boat of 5e (c_s 3.0, form 0.25, wave 1, 30 W hotel, eta_pv 0.20, derate 0.85, 200 kg, 1 m/s) at 4 m and 5 m, pack = 25% of mass at 200 Wh/kg = 10,000 Wh (panel mass ignored, as in 5e). (a) Operate only in months that 5e's monthly mean calls neutral; start each contiguous run of such days with a full pack; report days the pack hits empty, the worst drawdown in Wh (and as days of load), over the 10 years. (b) Year-round: per calendar year, the maximum drawdown from a running peak, which is the pack that bridges that year without the boat stopping; report the median and worst of the 10 years against 10,000 Wh. - Predictions (before running): (1) in the monthly-neutral windows the 10 kWh pack never empties at any site for the 5 m boat (prior 80%). (2) For the 4 m boat at least one site-window does empty or draw down past 50% of the pack (prior 60%): its neutral months sit near the edge, so a run of dull days drains it. (3) Year-round at 42 N the 5 m boat needs more than 10 kWh in the median year (prior 85%); at the Equator it needs less than 10 kWh in every year (prior 85%). Refuted: (1) any empty day for 5 m; (2) all windows stay above 50% for 4 m; (3) either half fails.
- Limits known in advance: horizontal irradiance on a 1 degree cell, daily means (no within-day shape, so a pack that covers the night is assumed), ten years is a sample of weather not a return period, no battery round-trip loss or depth-of-discharge limit (a usable fraction below 100% would shrink the pack), panel mass ignored, one hull and one panel set.
### Outcome of milestone 5f (experiments/run_solar_storm.py, under 1 s, deterministic; experiments/results_solar_storm.txt; data as fetched in experiments/data/daily_*.json, 3,653 days per site)
- (1) refuted, at one site: the 5 m boat that 5e called neutral in all 12 months at Florida-Straits (25 N) empties the 10 kWh pack on 9 days in ten years, all in January (one day in 2016, eight consecutive days 14 to 22 January 2024); worst drawdown 11.2 kWh, 10.6 days of load. At the other four sites the 5 m boat in its monthly-neutral window never empties (worst drawdown 7% of the pack at the Equator, 29 to 70% elsewhere, 70% = 6.5 days of load at the Gulf of Alaska).
- (2) held: the 4 m boat draws the pack down 37 to 54% in its neutral windows (54% at the Equator and Florida, 5.0 to 5.2 days of load), never to empty. It crosses my 50% line at three sites; it is far less comfortable than 5 m but is not broken by ten years of weather.
- (3) held: year-round at 42 N the 5 m boat needs a median 41 kWh per year (4.1 times the pack; no year within 10 kWh); at the Equator it needs a median 0.45 kWh and at most 0.66 kWh. Year-round at 55 N and 60 N the need is 80 to 114 kWh (5 m) and 174 to 205 kWh (4 m), i.e. solar cannot carry a winter, only a summer.
- Reading: the monthly-mean verdict of 5e survives ten years of daily weather for a boat with margin (5 m, 42 N and above, summer window; 5 m at the Equator), but not where the monthly mean sits close to the load: Florida in January has a mean harvest that clears the load, and a dull week still emptied the pack. The pack the worst decade needs (11.2 kWh at 25 N, against 10 kWh fitted) is the figure to read, not the monthly neutrality flag. Equator 4 m is "neutral" in 7 months but needs a median 14.8 kWh year-round, so those months are not contiguous.
- Limits: as listed in the plan; additionally one 1-degree cell per site, one decade, no depth-of-discharge or round-trip losses (these only make the pack need bigger), the empty-day count is for a boat that holds 1 m/s regardless (a real controller would slow down, which this does not model).
- Next: let the controller slow down when the pack is low (a speed policy against the same daily series); storm-duration statistics beyond one decade; milestone 3 still blocked.
2026-10-28 · Milestone 5e: with sourced insolation at five named sites, in which months can the 5 m monohull sustain 1 m/s on deck solar? (planned before running)
- Why: 5c and 5d swept insolation 120 to 240 W/m2 because every irradiance host was refused. NASA POWER (
power.larc.nasa.gov, climatology API, parameter ALLSKY_SFC_SW_DWN, all-sky horizontal shortwave, 25-year monthly means 2001 to 2025, SYN1DEG 1 degree cells) answered 200 this session. Files kept as fetched in experiments/data/power_<site>.json. Sites (chosen to span latitude, ocean survey areas): Equator-Pacific (0, -90), Florida-Straits (25, -80), Gulf-of-Maine (42, -70), North-Sea (55, 5), Gulf-of-Alaska (60, -145). Daily mean W/m2 = kWh/m2/day x 1000 / 24. - Plan (
experiments/run_solar_sites.py, imports solar.py unchanged): per site and month, same boat as 5c at central hull constants (c_s 3.0, form 0.25, wave 1), length 3/4/5 m, hotel 20/30/40 W, eta_pv 0.15/0.20/0.23, derate 0.70/0.85, 200 kg, 25% battery at 200 Wh/kg. Report (a) share of the 54 boat cases energy-neutral at 1 m/s per site-month, (b) for the central boat (30 W, 0.20, 0.85) the count of months neutral per site, at 4 m and 5 m, (c) whether the annual-mean insolation gives the same verdict as the worst month. - Predictions (before running): (1) the 5 m central boat is neutral at 1 m/s in all 12 months at the Equator site (prior 80%) and in at most 6 months at the Gulf of Alaska (prior 80%). (2) At 42 N the annual-mean insolation calls the 5 m central boat neutral while December does not (prior 90%): a mean-based verdict overstates year-round neutrality. (3) The 4 m central boat is neutral in at most 3 months at every site (prior 65%). Refuted: (1) either half fails; (2) annual and December verdicts agree; (3) any site has 4 or more neutral months.
- Limits known in advance: horizontal-plane irradiance (a tilted or sea-state-pitching panel differs), monthly means (no cloud runs or storms: a battery covers days, not a week of overcast), one-degree cells, 25-year climatology rather than a given year, panel mass ignored here (5d: costs about a fifth of solar's range benefit at 10 kg/m2), hull constants fixed at central values.
### Outcome of milestone 5e (experiments/run_solar_sites.py, under 1 s, deterministic; experiments/results_solar_sites.txt; data as fetched in experiments/data/)
- (1) held: the 5 m central boat is neutral at 1 m/s in 12 of 12 months at the Equator site (August, the worst, still clears: 200 W/m2 gives about 51 W against a 44 W load) and in 5 months at the Gulf of Alaska (needed at most 6).
- (2) held: at 42 N the annual mean (161 W/m2) calls the 5 m central boat neutral (49 W against 44 W) but December (53 W/m2) does not, and neither do Nov to Mar: it is neutral in 7 months. Same at 55 N and 60 N, where even the annual mean fails. A verdict from annual-mean insolation overstates year-round neutrality at every site above 25 N for 4 m and above 42 N for 5 m.
- (3) refuted: the 4 m central boat is neutral in 7 months at the Equator site, 6 at 25 N, 4 at 42 N, 3 at 55 N and 0 at 60 N. I had put the sustained-speed 4 m boat further from the edge than the data does; 5c's swept 180 W/m2 central case was just short, and the sourced low-latitude months are 200 to 280 W/m2.
- Share of the 54 boats neutral by site-month ranges from 56% (Equator, March) down to 0% for the winter half of the year at 42 N and above. Seasonal swing, not the annual mean, sets the answer: the Gulf of Alaska has a 7 to 220 W/m2 range (a factor 31).
- Reading: a 5 m deck-solar monohull can hold survey speed all year within about 25 degrees of the equator and for a summer half-year near 42 N, but a year-round high-latitude survey needs the battery to bridge the winter, not just the night. Carries to the programme's H5/range claims only as a boundary on when solar replaces the pack.
- Limits: horizontal irradiance, monthly means (a battery bridges nights, not a stormy week), 1 degree cells, no panel mass or tilt, central hull constants, hull and panel inputs as in 5c; five sites is a sample, not a map.
- Next: panel mass inside the monthly picture (5d at each site); a storm-duration check on pack size; milestone 3 still blocked.
2026-10-28 · Milestone 5d: does charging panel mass to the battery change the solar verdict, and is the full deck the best array? (planned before running)
- Why: 5c's limits list "panel mass not charged to the 200 kg". A panel of area A weighs a_m A, taken from the 50 kg battery allowance (total mass stays 200 kg, so the hull is unchanged). Sourced irradiance is still unreachable (NASA POWER and PVGIS return 403 through the egress proxy this session), so insolation stays swept. Plan (
src/marine_hull/solar.py gains battery_after_panels; experiments/run_solar_mass.py): same grid as 5c plus areal mass a_m 2, 5, 10 kg/m2 (flexible marine laminate to framed module; not sourced, swept) and array area 0, 25, 50, 75, 100% of the deck. Per case: best-speed range with solar (inf if neutral at any speed) for each area fraction, the area fraction that maximises it (ties to the smaller array), and the gain over no array. - Predictions (before running): (1) at 5 kg/m2 the full deck is the best array in at least 80% of cases (prior 80%: 1.15 m2 at 4 m weighs under 6 kg of a 50 kg pack). (2) at 10 kg/m2 the full deck is still best in at least 50% (prior 55%). (3) the share of cases energy-neutral at 1 m/s drops by less than 3 points from 5c's 25.1% at 5 kg/m2 (prior 70%; mass does not change the load, so neutrality only depends on area and the load, and panel mass only matters through range where it is not neutral). Refuted: (1) under 80%; (2) under 50%; (3) 3 points or more.
- Limits known in advance: areal mass is swept, not sourced; mounting hardware and wiring ignored; panel mass displaces only battery (a hull sized to 200 kg total); daily-mean harvest as in 5c.
### Outcome of milestone 5d (experiments/run_solar_mass.py, under 10 s, deterministic; experiments/results_solar_mass.txt; 4,374 cases per areal mass; 46 tests pass)
- (1) refuted as I wrote the metric, for a bookkeeping reason: the full deck is the best array in 73.0% of cases (needed 80%), identical at 2, 5 and 10 kg/m2. The other 27% are not cases where panels hurt: a 50 or 75% array is already energy-neutral there, so unbounded range ties with the full deck and the tie rule picks the smaller one. Among the 2,388 cases with finite range the full deck is best in 100% at every areal mass. My metric mixed those two groups; the finite-range reading is the meaningful one.
- (2) held: 73.0% at 10 kg/m2 (needed 50%), same caveat.
- (3) held, and by construction: neutral-at-1-m/s share with the full deck stays 25.1% at every areal mass, because neutrality compares harvest with load and neither depends on pack mass. The prediction could not have failed; it was not a test.
- What mass does change is the range multiplier where the array cannot carry the boat: median best-array range / no-array range is 1.95, 1.83 and 1.64 at 2, 5 and 10 kg/m2 (5c, no mass: 2.01); the 10th percentile falls from 1.28 to 1.13. So a heavy framed module (10 kg/m2, about 12 kg on a 4 m deck, a quarter of the pack at 50 kg) costs about a fifth of solar's range benefit; the full deck is still the best layout.
- Limits: areal mass swept and not sourced (no datasheet fetched); mounting hardware and wiring ignored; panels displace only battery; daily-mean harvest and swept insolation as in 5c; the 25% area steps are coarse.
- Next: a sourced irradiance table for a named latitude and month (NASA POWER, PVGIS and the Global Solar Atlas are all refused by the proxy this session; try a GitHub-hosted dataset via
add_repo); milestone 3 still blocked.
2026-10-28 · Milestone 5c: how much deck-mounted solar makes the 4 m monohull energy-neutral at survey speed? (planned before running)
- Why: milestone 5 asks for battery and solar rungs. Solar changes the question from "range per charge" to "is there a speed at which the boat never needs one". Plan (
src/marine_hull/solar.py, experiments/run_solar.py): daily-mean harvest P_s = A eta_pv f I, with panel area A set by deck area (0.6 L B, beam B = 0.12 L for the Wigley form of milestone 2, so about 1.15 m2 at 4 m), eta_pv 0.15/0.20/0.23 (commercial crystalline-silicon modules), derate f 0.7/0.85 (mounting angle, soiling, spray), daily-mean insolation I 120/180/240 W/m2 (swept: the global-mean surface value is roughly 185 W/m2 from memory, not re-fetched; low latitudes and clear summer days are higher, high latitudes and winter lower). Hull: the milestone-1 ITTC-plus-form-factor model (c_s 2.6/3.0/3.4, k_form 0.10/0.25/0.40, wave scale 0/0.5/1, length 3/4/5 m, hotel 20/30/40 W, same efficiencies), 200 kg. Outputs per case: (a) is net power at 1 m/s <= 0 (energy-neutral, unbounded range on a daily average), (b) the highest energy-neutral speed over 0.5 to 3 m/s, (c) the panel area that makes 1 m/s neutral. - Predictions (before running): (1) energy-neutral at 1 m/s in between 30% and 70% of cases (prior 50%: at the central case the load is about 45 W and the harvest about 40 W, so the answer sits on the edge). (2) The highest neutral speed is 1.5 m/s or more in under 10% of cases (prior 85%: resistance grows with v^2 on top of the hotel load, so a few more m/s needs hundreds of watts). (3) Where it is not neutral, solar still lifts best-speed range by a median factor above 1.5 (prior 60%). Refuted: (1) outside 30 to 70%; (2) 10% or more; (3) 1.5 or below.
- Limits known in advance: daily mean, so no night (the battery covers it; a 25% pack of 200 Wh/kg is 10 kWh against a daily load near 1 kWh); no clouds or sea state in the harvest; no panel weight (the 200 kg is fixed, panels would displace battery); insolation is swept, not sourced.
### Outcome of milestone 5c (experiments/run_solar.py, under 5 s, deterministic; experiments/results_solar.txt; 4,374 cases; 45 tests pass)
- (1) refuted, narrowly low: energy-neutral at 1 m/s in 25.1% of cases (needed 30 to 70%). It is set by length, which sets deck area (about L^2): 0% at 3 m, 20% at 4 m, 56% at 5 m; then by insolation (5%, 25%, 45% at 120, 180, 240 W/m2), hotel load (40%, 23%, 13% at 20, 30, 40 W) and panel efficiency. Hull-form constants and the wave term barely move it (22 to 28%; the wave term not at all at Fr 0.16). My prior put the central case on the edge; the central case (4 m, 30 W, 0.20, 0.85, 180) is just short.
- (2) held: the highest energy-neutral speed is 1.5 m/s or more in 3.2% of cases and 2.0 m/s in none (max 1.85). Median 0 means that in most cases even 0.5 m/s is not neutral.
- (3) held: where the array cannot carry the boat at its best speed (2,388 cases), solar multiplies range by a median 2.01 (10th to 90th 1.34 to 7.63).
- Panel area for neutral 1 m/s: median 1.67 m2 (10th to 90th 0.99 to 2.84), against a usable deck of 0.6 L B, so the deck is too small in 74.9% of cases.
- Reading: deck solar can make a 5 m survey boat self-sustaining at 1 m/s in good sun, but for a 4 m boat it roughly doubles range rather than removing the battery, and no case sustains 2 m/s. Hotel load is as important as the array: halving it from 40 to 20 W triples the neutral share.
- Limits: daily-mean harvest (no night, cloud or sea state); panel mass not charged to the 200 kg; insolation recalled (global mean about 185 W/m2), not re-fetched, so swept 120 to 240; efficiencies are typical module figures, not a datasheet; Wigley beam ratio 0.12 and fill 0.6 are choices.
- Next: a sourced irradiance table for a named latitude and month (PVGIS or NASA POWER if reachable); panel mass traded against battery; milestone 3 still blocked.
2026-10-28 · Milestone 5b: does a SWATH (two submerged torpedoes on surface-piercing struts) out-range the 4 m monohull at 200 kg? (predictions fixed before reading the output; this entry was written after the first run, which was the only run)
- Why: the H5 rungs left SWATH undone (hydrofoil was milestone 5). A SWATH hides its displacement below the free surface, so wave drag should fall; the cost is wetted area. New in
src/marine_hull/michell.py: wave_resistance_torpedo (Michell thin-ship integral for a fully submerged parabolic torpedo y = b(1-xi^2)(1-zeta^2) at axis depth h; x part is the Wigley closed form, z part a Simpson sum), torpedo_volume, torpedo_wetted. Plan (experiments/run_swath.py): two torpedoes carry all 200 kg (fineness set by length), one Wigley-form strut each (chord f L, thickness 0.12 chord) with Michell wave drag and ITTC friction on both faces, Havelock two-hull factor on both wave terms. Grid: hull length 3/4/5 m, axis depth 0.4/0.6/0.8 m, hull spacing s/L 0.15/0.25/0.40, strut chord 0.3/0.5 L, SWATH form factor 0.05/0.10/0.20, monohull (4 m Wigley, milestone 2) form factor 0.10/0.25/0.40, Michell scale 0.5/1/1.5, battery 150/200/250 Wh/kg: 4,374 pairs. Same 25% battery fraction, 30 W hotel load and efficiencies as milestones 1 and 2. - Predictions: (1) the SWATH out-ranges the monohull at its own best speed in under 10% of pairs (prior 85%: best speed is near 1 m/s, Fr 0.16, where the monohull's wave drag is already a few percent of friction, so the SWATH's extra wetted area cannot pay back). (2) At a required 3 m/s, the SWATH out-ranges the monohull in over half of the pairs (prior 55%). Refuted: (1) 10% or more; (2) half or fewer.
- Limits known in advance: struts are Wigley forms (parabolic in depth), not foil sections; torpedo is a parabolic body, not a body of revolution; thin-ship theory applied to a submerged body of half-beam 0.12 m at 0.4 to 0.8 m depth; strut buoyancy and the strut-hull junction drag are ignored; no stability or seakeeping, which are the reason SWATHs exist.
### Outcome of milestone 5b (experiments/run_swath.py, 25 s, deterministic; experiments/results_swath.txt; 4,374 pairs)
- (1) held, at the extreme: the SWATH out-ranges the monohull in 0 of 4,374 pairs at its best speed. Best-range ratio SWATH/monohull: median 0.69 (10th to 90th 0.61 to 0.76, max 0.83). SWATH best speed median 0.75 m/s, range median 569 km against 824 km.
- (2) refuted: at a fixed 3 m/s the SWATH wins in 0 of 4,374 pairs (range ratio median 0.46; at 2 m/s median 0.27), and in no slice of any axis (length, depth, spacing, strut chord, wave scale). I expected submerging the displacement to pay once the monohull's wave drag hump arrives; it does not, because the struts' own wave drag (central case: SWATH 327 N at 3 m/s, of which 180 N is wave, against 101 N for the monohull) and the larger wetted area (central case: two torpedoes 2.4 m2 each plus 3.8 m2 of strut faces, against about 3 m2 for the monohull) outweigh the torpedoes' small wave drag.
- Reading: at 200 kg, 4 to 5 m of length and 0.4 to 0.8 m of axis depth, a SWATH is not a range-efficient way to carry a survey payload in this model. Its case would rest on what the model leaves out: stability, deck area and motion in waves. Together with milestones 1 and 2 (catamaran) and the hydrofoil rung this closes the three displacement-hull alternatives to the monohull on energy per kilometre in calm water.
- Check on the new code: 6 tests (
tests/test_torpedo.py): volume against double quadrature, thin-body wetted-area limit, beam-squared scaling, theta resolution, and the wave drag falling with depth at a rate of about 2 k0 (observed slopes 20.8, 9.2, 5.4 /m against 2 k0 = 19.6, 8.7, 4.9 /m at 1, 1.5, 2 m/s), as Michell theory predicts for the dominant transverse wave. No tank curve for a SWATH was reachable, so the absolute wave level is not validated; the verdict is a 0-of-4,374 result with a best-case ratio of 0.83, so a factor-of-two error in wave drag does not flip it (scale 0.5 is in the grid). - Limits: as listed above; every geometric constant and the strut form are choices, swept where the grid says so; the monohull is the same 4 m Wigley as before.
- Next: milestone 3 (Holtrop-Mennen against a small-hull tank table, still blocked on a reachable table); planing rung; a sourced current climatology for 4f.
2026-10-28 · Milestone 5 (planing rung): can a planing hull out-range the displacement monohull at 200 kg? (prediction held in the plan, written into the log after the first run)
- Why: milestone 5's remaining rungs (SWATH, planing). Planing first because Savitsky (1964) is a closed-form, sourced method (Savitsky, D., "Hydrodynamic design of planing hulls", Marine Technology 1(1), 1964). Plan (
src/marine_hull/planing.py, experiments/run_planing.py): flat-plate lift with deadrise correction, lift = weight solved for wetted-length ratio at each trim 2 to 15 deg, drag = W tan(trim) + ITTC friction on the wetted bottom; best trim per speed (a lower bound on drag, no LCG moment balance); speeds 1 to 20 m/s with Cv 1 to 25. Grid: beam 0.5 to 1.1 m x deadrise 0, 10, 20, 30 deg x battery 150 to 250 Wh/kg = 48 cases, against milestone 2's 4 m Wigley monohull. Same 200 kg, 25% battery, 30 W hotel and efficiencies. - Prediction: the planing hull out-ranges the monohull in under 5% of cases (prior 95%): at 3 to 8 m/s a planing craft needs about 150 to 300 N against a few newtons for displacement at 1 m/s. Refuted if 5% or more. Disclosure: I stated this in my head before the first run, not in a committed file; there was one run and no re-tuning.
### Outcome (experiments/run_planing.py, under 1 s, deterministic; experiments/results_planing.txt; 48 cases; 34 tests pass)
- Prediction held: planing out-ranges the monohull in 0 of 48 cases. Range ratio planing/monohull: 0.055 to 0.138 (median 0.108). Planing best range 34 to 143 km (median 84) against a monohull median of 824 km. Best speed median 3.5 m/s at trim 2 to 4 deg; 12 of 48 best speeds sit at the 20 m/s grid ceiling and none below 2.75 m/s.
- Hand check: 200 kg, 0.9 m beam, 10 deg deadrise at 8 m/s gives 281 N, lift-to-drag 7.0, in the range usually quoted for small planing craft (not a measured case).
- Reading: like the foil (ratio below 0.25), planing is a transit-speed option bought with roughly 7 to 18 times the energy per metre; it does not compete for endurance at survey speed. The monohull's win comes from running at 1 m/s where 30 W hotel and friction are the only costs.
- Limits: Savitsky lift and friction only (no spray, appendage or air drag; no mean-bottom-speed correction; no hump region, Cv below 1, which a survey craft avoids by not planing); trim is the best of 14 integers, not balanced to an LCG; no tank or sea-trial data was compared (the lift constants are Savitsky's, recalled from the paper and checked only by the hand value in
tests/test_planing.py, not re-fetched this session). All hull geometry swept, not sourced. - Next: SWATH rung; battery and solar from
energy-density; milestone 3 (Holtrop-Mennen) still blocked on a reachable small-hull table.
2026-10-27 · Milestone 4f: how strong a cross-current stops the glider's energy win over the AUV? (planned before running)
- Why: 4d and 4e both end with "no currents; they hit a 0.2 m/s glider hardest". Plan (
experiments/run_current.py, src/ unchanged): a steady uniform current v perpendicular to a straight transect, swept 0 to 0.5 m/s in 0.05 steps (no sourced current is assumed: the sweep is the result; typical open-ocean and shelf currents are tenths of a m/s, but I could not fetch a source this session). A vehicle with through-water speed u crabs into the current and makes good sqrt(u^2 - v^2) along the track, so energy per ground metre is (P/u) x u / sqrt(u^2 - v^2) = (E/m) x u / sqrt(u^2 - v^2), and a vehicle with u <= v cannot hold the track. Glider: 4d's 810 cases, each at its own fixed glide speed (the buoyancy sweep already contains fast and slow gliders). AUV: 4d's 18 cases, speed re-optimised at each v over 0.1 to 2.3 m/s to minimise energy per ground metre. - Predictions (before running): (1) at v = 0.1 m/s the glider still has the lower energy per ground metre in at least 95% of the pairs (prior 75%; the penalty on a 0.2 m/s glider is only 1/sqrt(1 - 0.25) = 1.15, against an energy ratio near 5). (2) At v = 0.25 m/s the glider cannot hold the track in more than half of its cases (prior 70%; median glide speed is about 0.21 m/s from 4d). (3) The v at which the glider wins fewer than half of all glider-by-AUV pairs (a stalled glider counts as a loss) lies between 0.1 and 0.3 m/s (prior 65%). Refuted: (1) under 95%; (2) half or fewer; (3) outside the range.
- Limits known in advance: uniform steady cross-current only (no along-track current, shear, or tide reversal, which average out for a long transect only partly); a glider could pitch steeper to go faster, which the b sweep covers only as different vehicles; the AUV speed grid edge (2.3 m/s) still binds; no sourced current field.
### Outcome of milestone 4f (experiments/run_current.py, under 1 s, deterministic; experiments/results_current.txt; 810 glider x 18 AUV cases)
- Share of glider-by-AUV pairs in which the glider still needs less energy per ground metre (a stalled glider counts as a loss): 100% at 0 to 0.05 m/s, 97.2% at 0.10, 74.6% at 0.15, 49.8% at 0.20, 36.2% at 0.25, 19.9% at 0.30, 3.3% at 0.40, 0% from 0.45 m/s. The AUV's energy per ground metre barely moves (median 82 to 84 J/m), since it just speeds up.
- Share of glider cases that cannot hold the track (glide speed at most the current): 0% up to 0.10 m/s, 20% at 0.15, 50% at 0.20, 60% at 0.25, 100% from 0.45.
- (1) held: 97.2% at 0.10 m/s (needed 95% or more). (2) held: 60% of cases stalled at 0.25 m/s (needed over half). (3) held: the 50% crossing is at about 0.20 m/s, inside 0.1 to 0.3.
- Reading: the glider's energy win is not lost gradually. Among the gliders that can hold the track it stays above 90% at every current, so the failure is stalling: it ends where the current reaches the glide speed. A mission whose cross-current exceeds roughly 0.2 m/s (the median glide speed of the swept envelope) needs the AUV or a faster, steeper-gliding glider. This is a geometry result on the swept 4b envelope; it does not say how often such currents occur on a given transect, which needs a sourced current climatology.
- Limits: uniform steady cross-current only; each glider flies one fixed speed (a pilot could raise buoyancy for the crossing, which costs pump energy not modelled here as a switch); the current values are swept, not sourced (hosts unreachable); the AUV speed grid edge (2.3 m/s) still binds.
- Next: a sourced current climatology for a named transect; milestone 3 (Holtrop-Mennen) is still blocked on a reachable small-hull tank-test table (mdpi.com, jmr.unican.es and similar hosts return 403 or fail DNS in this session).
2026-10-27 · Milestone 4e: what is a day of delay worth, in kWh, at which the glider and the AUV tie on a 100 km transect? (planned before running)
- Why: 4d's "Next" asked for a ship-time cost per day to set the exchange rate. I looked for a sourced figure (UNOLS and Scripps day-rate pages) and could not reach one: the hosts fail DNS or are refused by the egress proxy, and search returned class descriptions and an anecdotal blog range ($25,000 to $50,000 per day for an ROV-equipped ship), not a rate sheet. So no price is assumed. Instead the exchange rate is the output: the break-even value of one day of delay, v = (E_AUV - E_glider) x 100 km / (t_glider - t_AUV), in kWh per day, over the same 14,580 pairs as 4d (
experiments/run_value.py, src/ unchanged). The glider is preferred when a day of delay is worth less than v. For scale, v* is also divided by the AUV's own daily energy use at its best-energy speed. - Predictions (before running): (1) median v between 0.2 and 2 kWh/day (prior 60%; back of envelope: about 85 J/m saved x 100 km = 2.4 kWh over about 5 days). (2) v is below the AUV's own daily energy use in over 90% of pairs (prior 80%). Refuted: (1) median outside 0.2 to 2; (2) 90% or fewer.
- Limits known in advance: v is a tie point, not a decision (the mission sets the value of time); no currents; the AUV's best speed is at the grid edge (4d), so its time is a lower bound and v is, if anything, overstated at the fast end; steady glide.
### Outcome of milestone 4e (experiments/run_value.py, under 1 s, deterministic; experiments/results_value.txt; 14,580 pairs)
- Every pair has a tie value (the glider always saves energy and always takes longer). v* has median 0.37 kWh per day of delay (10th to 90th 0.17 to 0.72; range 0.03 to 1.25). Above about 1 kWh per day the glider is cheaper in 1.3% of pairs, above 2 kWh per day in none; below 0.1 kWh per day in 97.8%.
- Against the AUV's own consumption at its best-energy speed (about 4 to 9 kWh per day), v* is a median 0.08 of it (10th to 90th 0.04 to 0.15).
- (1) held: median 0.37 is inside 0.2 to 2. (2) held, with room: v* is below the AUV's daily energy use in 100% of pairs (prior needed over 90%).
- Reading: the glider's energy win survives only while a day of delay is valued under roughly a third of a kWh, about 8% of what the AUV burns in a day. Once a day of mission time is worth more than a few percent of the vehicle's own daily energy, the AUV is the cheaper way to cover 100 km. This sharpens 4d (energy-delay product, a tie exponent of 0.72) into a quantity a mission planner can compare with a real day rate. Converting kWh to dollars needs a battery price and an operations cost, neither sourced here.
- Limits: no sourced ship or operations day rate (hosts unreachable, see above); no currents; steady glide; the AUV's best speed is pinned at the 2.3 m/s grid edge, which shortens its time and so lowers v; v uses only energy and time, ignoring the cost of a vessel attending the glider or recovering a vehicle that drifts.
- Next: a sourced day rate and battery price to turn v* into dollars; a current field (the glider is hit hardest); milestone 3 (Holtrop-Mennen).
2026-10-27 · Milestone 4d: does the glider's energy win survive a time penalty? Energy-delay per metre against the REMUS-class AUV (planned before running)
- Why: 4c's own "Next": energy per metre ignores that the glider moves at about 0.2 m/s and the AUV at 1.5 m/s, so a 500 km transect takes the glider about a month. Plan (
experiments/run_time.py, no change to src/): reuse 4c's 18 AUV cases (hull, implied hotel) and 4b's 810 glider cases. Per pair, the energy-delay product per metre squared, EDP = (E/m) x (s/m) = (E/m)/u, for each platform at its own best-energy speed (glider horizontal speed uh; AUV speed at its minimum energy per metre). Also the transit time for 100 km, and the AUV speed as a fraction of the grid edge. - Predictions (before running): (1) the AUV has the lower EDP in at least 90% of pairs (prior 65%: median energy ratio 5.4 against a speed ratio near 7, with a spread that overlaps). (2) The glider takes more than 10 days per 100 km in at least 90% of glider cases (prior 80%; at 0.2 m/s it is 5.8 days, so this should fail at the high-buoyancy end). Refuted: (1) under 90%; (2) under 90%.
- Limits known in advance: EDP weights energy and time equally (an arbitrary exchange rate; the ranking at other exponents is reported as the crossover speed ratio); steady glide, no currents, which move a 0.2 m/s glider far more than a 1.5 m/s AUV; the AUV's best speed sits at the grid edge so its EDP is a bound (4c).
### Outcome of milestone 4d (experiments/run_time.py, under 1 s; experiments/results_time.txt; 14,580 pairs)
- Glider transit: median 5.5 days per 100 km (10th to 90th 3.1 to 8.7); 3.3% of glider cases take over 10 days. (2) refuted: I expected over 90% to; the 10 N pump gives a faster glide than the 0.2 m/s I assumed. The AUV takes 12 h per 100 km at 2.3 m/s.
- (1) refuted: the AUV has the lower energy-delay product in 77.9% of pairs (prior needed 90%). Two runs, the second disclosed as a change after seeing the first: with the AUV speed grid stopping at 1.5 m/s (4c's grid), the AUV wins 51.2% of pairs, because hotel load pushes its best-energy speed onto the grid edge; I then extended the grid to the datasheet's 2.3 m/s maximum, which is the number reported above and in
results_time.txt. The AUV's best-energy speed is again at that edge (2.3 m/s), so its EDP is a bound, and the datasheet's hotel is inferred at 1.5 m/s only. - Tie exponent: weighting delay as E x t^a, the glider is preferred for a below a median 0.72 (10th to 90th 0.32 to 1.19). So the glider's energy win needs delay to count for less than about three quarters as much as energy; at equal weight (EDP) the AUV mostly wins, and the verdict is a close call that turns on that exchange rate, not a clear glider win.
- Limits: the exchange rate between time and energy is not sourced and depends on the mission (a deadline or ship-time cost would set it); no currents (they move a 0.2 m/s glider much more than a 2 m/s AUV); steady glide; AUV hotel inferred from vendor endurance (4c).
- Next: a Slocum G2/G3 or Seaglider datasheet for the glider's hotel and pump; a ship-time cost per day to set the exchange rate; milestone 3 (Holtrop-Mennen).
2026-10-27 · Milestone 4c: does a REMUS-100-class hotel load, read from its endurance figures, put the AUV above or below the glider's break-even? (planned before running)
- Why: 4b ended with "the break-even AUV hotel multiple (median 4.87 times the glider's) makes the measured power budgets decisive". The vendor's endurance figures give a sourced total power, from which the hotel load follows once the model's own propulsion power is subtracted. Sourced (all approximate, vendor marketing): REMUS 100 battery 1.5 kWh, endurance 12 h at 1.5 m/s (UST magazine; Robot Report); a 2022 datasheet (REMUS 100B) gives 8 h at 3 kn (1.54 m/s) with standard sensors, 38.6 kg, 1.85 m, 0.19 m diameter. Total power at 1.5 m/s is therefore 125 W (12 h) to 188 W (8 h). The 22 h / 1 kWh older-generation figure (45 W) was seen in a search snippet only and is not used for the headline.
- Plan (
experiments/run_remus.py, src/ unchanged): AUV geometry L = 1.85 m, D = 0.19 m, V = 38.6 kg / 1025 (neutral), wetted area pi D L (so c_s = S / sqrt(V L)), form factor k in {0.1, 0.2, 0.3}, drivetrain efficiency as the model's 0.55 x 0.85 and also 0.7 x 0.9 (swept, unsourced). Implied hotel H = P_total - P_prop(1.5 m/s) for P_total in {125, 150, 188} W; usable battery fraction is folded into P_total. Then the 4b glider cases (Slocum coefficients, same grid) against this AUV at H: fraction of cases with the glider's range greater, and the AUV's best range. - Predictions (before running): (1) Implied H is above 60 W in every case (prior 80%: propulsion at 1.5 m/s for this hull should be tens of watts, not 100+). (2) The glider has the longer best range in over 90% of the 4b cases at the implied H (prior 85%; 4b gave 99.9% at x20 of a 0.7 to 5 W hotel, i.e. 14 to 100 W). Refuted: (1) any case under 60 W; (2) 90% or fewer.
- Limits known in advance: the vendor figures disagree and are not test data; the endurance may include battery reserve and payload sensors, so H is "everything but propulsion in the model", not a measured hotel load; the model's hull has no appendage drag (fins, thruster duct), which would lower the implied H; the glider side is unchanged from 4b (hotel, pump efficiency and dive energy still swept).
### Outcome of milestone 4c (experiments/run_remus.py, under 1 s, deterministic; experiments/results_remus.txt; 18 AUV cases x 810 glider cases)
- Model propulsion power at 1.5 m/s for the 38.6 kg, 1.85 m, 0.19 m hull is 13 to 21 W (form factor 0.1 to 0.3, drivetrain efficiency 0.47 or 0.63). Subtracting from the vendor total (125 to 188 W) leaves an implied non-propulsion load of 104 to 175 W (median 133 W).
- (1) held: the implied load is above 60 W in all 18 cases (minimum 104 W). It is 21 to 250 times the glider's swept 0.7 to 5 W (4b's break-even was 2.4 to 10.7 times).
- (2) held, and at the limit: the glider has the longer best range in 100% of the 810 cases against every one of the 18 AUV cases. AUV best energy per metre is 83 to 125 J/m (65 to 43 km on 1.5 kWh, close to the vendor's 50 to 72 km), against a glider median near 15 J/m at 5 W hotel and well under that at 0.7 W; median AUV/glider energy ratio 5.4.
- Reading: with a hotel load read from the vendor's own endurance, the 4b conclusion changes from "depends on the unsourced power budgets" to "the glider wins on energy per metre unless the AUV's non-propulsion load is below about 5 to 24 W", which is 4 to 20 times lower than the vendor figures imply. Energy per metre is not speed or time: the glider moves at 0.2 m/s against 1.5 m/s, so 500 km takes about 29 days. That is what the range comparison leaves out.
- Limits: the vendor endurance is marketing, bundles reserve and sensors, and cannot separate hotel from propulsion except through the model (no appendage drag, thruster duct, or free-flooded sections, all of which would lower the implied hotel and so the AUV's penalty); the AUV best speed is pinned at the grid's 1.5 m/s upper edge because hotel dominates, so the AUV range is if anything a lower bound above 1.5 m/s (a faster AUV is outside the vendor point used to infer the load); the glider side is 4b's, unchanged. The 22 h / 1 kWh older figure was not used.
- Next: a Slocum G2/G3 or Seaglider datasheet for the glider's hotel and pump (the glider side is still swept), time-to-complete as a second metric, then milestone 3 (Holtrop-Mennen).
2026-10-27 · Milestone 5 (hydrofoil rung): can a foilborne craft out-range the displacement monohull at 200 kg? (prediction stated before the sweep was run)
- Why: H5 rungs. Milestone 4c (REMUS hotel load, PR 10954) is claimed by another run, so this takes the hydrofoil rung. Plan (
experiments/run_foil.py, src/marine_hull/foil.py): Prandtl lifting-line foil (induced drag CL^2/(pi e AR)) plus section drag CD0, two flat-plate struts with ITTC 1957 friction, a junction/spray multiplier; weight carried by the foil, so CL = W/(q S) must lie in [0.05, CL_max] (takeoff limit). Against milestone 2's 4 m Wigley monohull (k 0.25, Michell scale 1). Same 200 kg, 25% battery, 30 W hotel, efficiencies. Grid 3^7 x 2 = 2,916 cases: foil area 0.02 to 0.08 m^2, AR 6 to 14, e 0.8 to 0.95, CD0 0.008 to 0.02, strut draft 0.3 to 0.5 m, multiplier 1 to 1.4, CL_max 0.8 to 1.6, battery 150 to 250 Wh/kg; speeds 1 to 10 m/s. - Prediction: the foil out-ranges the monohull in under 5% of cases (prior 90%): at 5+ m/s the thrust needed is W/(L/D), about 150 to 250 N, against a few newtons of displacement resistance at 1 m/s. Refuted if 5% or more.
- Unsourced, swept: every foil coefficient (CD0, e, CL_max) and the multiplier. Not modelled: ventilation, free-surface wave drag on the foil, foil control power, takeoff hump.
### Outcome (experiments/results_foil.txt, under 1 s, deterministic; 26 tests pass)
- Prediction held: the foil out-ranges the monohull in 0 of 2,916 cases. Foilborne flight is feasible in 1,620 (the rest need CL above CL_max at every speed to 10 m/s). Range ratio foil/mono among feasible cases: min 0.064, median 0.130, max 0.248; foil median 105 km against 824 km for the monohull. Best case (area 0.08 m^2, AR 14, CD0 0.008, no multiplier) reaches 204 km at 7.75 m/s, still a quarter of the monohull.
- Reading: for endurance-limited survey the foil is a speed option (5 to 10 m/s transit) bought with about 4 to 15 times the energy per metre, not a range option. In 369 feasible cases the best speed sits at the 10 m/s grid ceiling, so those foil ranges are lower bounds on the foil's own optimum only if drag keeps falling; speed is not the question here since the ratio stays below 0.25.
- Limits: all foil coefficients swept not sourced; no tank data checked; an idealised foil with no ventilation. The result is a bound from the induced-plus-friction floor, which the omitted effects only raise.
- Next: milestone 4c (PR 10954), then SWATH and planing rungs, battery from
energy-density.
2026-10-27 · Milestone 4b: does the glider-vs-AUV verdict survive Slocum coefficients taken from a source? (planned before running)
- Why: milestone 4 swept every glider coefficient because the Merckelbach papers were unreachable (the hosts still 403 or fail DNS). The MIT-licensed
gliderflight package (PyPI 1.2.1, Merckelbach's implementation of the Slocum flight model of Merckelbach et al. 2010 and 2019) ships the Slocum values, so they can be read from its source. Sourced there: wing area S = 0.1 m^2, aspect ratio 7, sweep 43 deg, Oswald e = 0.8, hull lift ah = 3.8 /rad, hull induced drag Cd1_hull = 9.7 /rad^2, wing lift slope from its own parameterisation aw = 2 pi AR / (2 + sqrt(AR^2 (1 + tan^2 Omega) + 4)) = 3.73 /rad, so lift slope a = aw + ah = 7.5 /rad and induced K = Cd1_hull + aw^2/(pi e AR) = 10.5 /rad^2 (the package's calibration examples use 10.5); parasite drag Cd0 is calibrated per deployment: its examples and docs use 0.15 to 0.16 and one calibration converges to 0.31. Milestone 4's grid (a 2 to 5, K 0.1 to 0.5) did not contain this point at all. - Plan (
experiments/run_slocum.py, src/marine_hull/glider.py unchanged): glider a, K, S fixed at the sourced values, Cd0 in {0.15, 0.23, 0.31}; swept because unsourced: buoyancy B (10 values, 1 to 10 N), pump efficiency {0.3, 0.5, 0.7}, dive energy {0, 5 kJ, 20 kJ}, hotel {0.7, 2, 5} W (0.7 W is the NOC average sensor figure quoted for gliders, a lower bound); AUV as in milestone 4 (52 kg, three hulls) with AUV hotel multiple x1, x5, x20. Outputs: glider best range against AUV best range at equal hotel; the AUV hotel multiple at which the two tie (break-even), per case; glider horizontal speed at the best-range point. - Predictions (before running): (1) At equal hotel load the glider still has the longer best range in under 25% of cases (prior 65%; milestone 4 gave 5.9%, but a lift slope of 7.5 and L/D near 3 are better than the old box). (2) The break-even AUV hotel multiple has median between 2 and 10 (prior 60%). Refuted: (1) 25% or more; (2) median outside 2 to 10.
- Limits known in advance: the hotel loads and pump efficiency remain unsourced (swept); pump energy per dive is an order-of-magnitude check only (NOC: about 65 W for 2 min at 1000 m); steady glide, no current; the package is a derivative source for the numbers, not the original papers.
### Outcome of milestone 4b (experiments/run_slocum.py, under 1 s, deterministic; experiments/results_slocum.txt; 2,430 cases)
- Sourced lift slope 7.5 /rad and K 10.5 /rad^2 give glide angles 18 to 26 deg (median 22), horizontal speed median 0.21 m/s (10th to 90th 0.12 to 0.33), the right range for a Slocum.
- (1) held, and more strongly: at equal hotel load the glider has the longer best range in 0 of 2,430 cases (milestone 4's loose box: 5.9%). Median AUV/glider energy-per-metre ratio 0.36, i.e. the glider spends about 2.8 times the energy per metre: at 0.2 m/s even 0.7 W of hotel load costs 3.5 J/m, and the glider's L/D of about 3 means its pump and slow speed do not pay for themselves.
- (2) held: the break-even AUV hotel multiple has median 4.87 (10th to 90th 2.38 to 10.67), defined in every case. The glider wins in 51.6% of cases at AUV hotel x5 and 99.9% at x20. So the claim "the glider's edge is a hotel-load edge" survives sourced aerodynamics, and the break-even is about 5 times the glider's hotel load, which makes the measured AUV and glider power budgets the decisive inputs (still unsourced).
- Consequence for H4: "the glider out-ranges the AUV at 0.25 m/s but not above 1 m/s" is not the right shape. In this model the glider's horizontal speed never reaches 1 m/s (max 0.33 at the 90th percentile) and its range per energy is below the AUV's unless the AUV carries several times the hotel load. Whether a fielded AUV (REMUS-class, tens of watts of hotel) crosses that multiple needs its datasheet.
- Limits: Cd0 is a calibrated per-deployment value, swept 0.15 to 0.31; hotel loads, pump efficiency and dive energy swept; steady glide, no current; numbers read from the package's source and docs, not from the Merckelbach papers. Citation check of the papers and doi not run this step.
- Next: source a REMUS 100 (or similar) datasheet hotel and propulsion power and a Slocum G2/G3 hotel load, then re-run the break-even against them; milestone 3 Holtrop-Mennen.
2026-10-27 · Milestone 4: where does a buoyancy glider stop beating a propeller AUV? (planned before running)
- Why: H4. Plan (
experiments/run_glider.py, src/marine_hull/glider.py): a 52 kg-class glider (steady glide, lift slope a, CD0, induced K, wing area, flown at best-glide incidence, pump efficiency, per-dive overhead, hotel load) against a same-mass, same-battery propeller AUV (ITTC 1957 body, hull.py constants), over a 3^8 grid, speeds 0.1 to 1.5 m/s. Crossover speed = lowest horizontal speed at which the AUV out-ranges the glider. The pump term is B tan(gamma)/(2 eta) per metre, independent of dive depth (derived in the module docstring, tested). - Sourcing: the Merckelbach 2010 and Eriksen 2001 papers could not be fetched (nora.nerc.ac.uk, wikipedia, oceanrep.geomar.de return 403 through the proxy; web search gave no coefficients). So no glider coefficient is sourced; all are swept over ranges chosen from general hydrodynamics (wing CL slope 2 to 5 per rad, CD0 0.05 to 0.2 on wing area). H4 as written ("on published figures") therefore cannot be settled here; this step tests whether the crossover prediction survives across the plausible swept box.
- Prediction (before running): the crossover lies in 0.4 to 0.9 m/s in a majority of cases, and the glider wins at 0.25 m/s in most (prior 45%: the hotel load is shared, which hurts the AUV little at low speed, so the crossover may sit lower, near 0.3 to 0.5). Refuted if under half of cases have the crossover in 0.4 to 0.9 m/s.
- Limits: steady quasi-static flight, no ocean current, battery energy cancels from the crossover (both ranges scale with it), glider limited by pump capacity (10 N).
### Outcome of milestone 4 (experiments/run_glider.py, under 1 s; experiments/results_glider.txt)
- Pre-registered part (equal hotel load, 6,561 cases; reproduced as the x1 row): the glider has the longer best range in 5.9% of cases (median ratio 0.58), and the crossover prediction is refuted: the crossover sits in 0.4 to 0.9 m/s in 0.4% of cases. Glider horizontal speed is capped at 0.13 to 0.70 m/s (median 0.30) by the 10 N pump, so it never reaches 1 m/s and the "crossover" is mostly the glider's speed ceiling or the 0.1 m/s grid floor, not a range crossing. The metric was badly chosen; best-range at own best speed is the usable comparison.
- Exploratory (added after seeing this, not pre-registered): an AUV-hotel multiplier axis. Glider has the longer best range in 5.9% / 89.2% / 100% of cases at AUV hotel x1 / x5 / x20. Over all 19,683 cases the median ratio is 1.61 and the glider's best-range speed is 0.25 m/s (median). The glider's advantage in this model is hotel load, since pump work per metre B tan(gamma)/(2 eta) is small beside AUV propulsion only if hotel is not shared.
- Limits: no glider or AUV coefficient or hotel load is sourced; the multiplier range is a guess; glider steady flight only, no current. H4 stays open until a fielded glider's and AUV's measured power budgets are found (Eriksen 2001; Merckelbach 2010; REMUS or similar datasheet).
- Next: source hotel loads and a published glider range; milestone 3 Holtrop-Mennen.
2026-10-27 · Milestone 2: does a Michell wave term change the catamaran verdict? (planned before running)
- Why: milestone 1's wave term was a placeholder, so H2 ("no equal-length case favours the catamaran") rested on an unsourced input.
src/marine_hull/michell.py computes Michell thin-ship wave resistance for Wigley hulls (closed-form x and z integrals, Simpson over theta) and Havelock's two-hull interference. Plan (experiments/run_michell.py): the milestone-1 box with the placeholder replaced by Michell, real Wigley wetted area instead of the c_s constant, demi-hull spacing s/L swept 0.15, 0.25, 0.40, a Michell scale 0.5, 1, 1.5 (thin-ship theory is known to err in both directions), and the same battery, hotel load and propulsive efficiencies. - Predictions (before running): (1) the catamaran still wins in under 5% of cases and in none of the equal-length cases at Michell scale 1 (prior 65%). (2) Wave resistance is under 10% of viscous resistance at the monohull's best-range speed in over 90% of cases (prior 70%). Refuted if the catamaran wins 5% or more, or in any equal-length case at scale 1.
- Checks done first: closed-form J against Simpson sums (agree to 1e-9 relative at 3 angles); dependence on theta steps (800 against 3,200: no change at 3 decimals). Not done: comparison with a published Wigley tank curve (no numeric table found in a web search; only plots).
- Limits known in advance: thin-ship theory, no viscous-wave coupling, Wigley shape only, form factor and interference still swept.
### Outcome of milestone 2 (experiments/run_michell.py, 1.5 s, deterministic; experiments/results_michell.txt; 6,561 cases)
- (1) held: the catamaran out-ranges the monohull in 216 of 6,561 cases (3.3%), none of the 729 equal-length cases at any Michell scale (0.5, 1, 1.5). Milestone 1 with the placeholder: 0.4%. Median range ratio cat/mono 0.87 (0.70 to 1.06). Wins need a 3 m monohull against 4 to 5 m demi-hulls or a low catamaran form factor.
- (2) refuted: wave resistance is under 10% of viscous at the monohull's best-range speed in 81.5% of cases, not over 90% (median 0.069, 90th percentile 0.106, max 0.121). The best-range speed is 1.0 m/s (max 1.1), Fr about 0.16 for a 4 m hull, so wave making is a small but not negligible term.
- Scale 0 to 1.5 on a 4 m monohull moves best range 847 to 815 km (-4%); the catamaran moves 721 to 710 km. The verdict does not move with the wave term, nor with demi-hull spacing (3.3% at each of s/L 0.15, 0.25, 0.4: Havelock interference shifts range by under 1% at these speeds).
- The placeholder understated wave resistance: Michell/viscous at 4 m, Fr 0.24 is 0.34 against the placeholder's 0.088. It does not matter for range because the optimum sits below Fr 0.2.
- Limits: Michell thin-ship theory with no published Wigley tank curve checked against (no numeric table found; plots only), so the absolute wave level is unvalidated, which the 0.5 to 1.5 scale only brackets. Wigley shapes only; form factor and viscous interference are still swept, not sourced.
- Next: milestone 3, Holtrop-Mennen against tank data for small hulls; digitise a Wigley Cw curve (Lazauskas 2009 thesis, Univ. of Adelaide) to validate
michell.py.
2026-10-27 · Milestone 1: does a catamaran out-range a monohull at survey speed? (planned before running)
- Why: H2. Plan (
experiments/run.py): 200 kg craft, 25% battery, 30 W hotel load, 0.5 to 3 m/s; ITTC 1957 friction times form factor plus a placeholder wave term; 3^8 = 6,561 grid cases over hull constant, form factors, catamaran interference, both lengths, wave scale and battery specific energy (150 to 250 Wh/kg). - Prediction (before running): the catamaran wins in under 5% of cases and in none at equal length (prior 75%). Refuted if it wins in 5% or more, or in any equal-length case.
### Outcome (experiments/results.txt)
- Prediction held: the catamaran wins 27 of 6,561 cases (0.4%), none of the 2,187 equal-length cases. Median range ratio cat/mono 0.85 (0.72 to 1.02). Wins need a shorter monohull (3 m) against 5 m demi-hulls or the reverse of the swept lengths with a low form factor, so they come from length, not the catamaran layout.
- Monohull best range 560 to 1,188 km (median 836 km) at a median 1.05 m/s: at 30 W hotel load the optimum is slow, which is the regime H1 describes. The range figures are an upper bound: no waves, current, turns or reserve, and the wave term is a placeholder.
- Not shown: anything about stability, deck area or payload mounting, which are why catamarans are chosen. Wave resistance, the main place a slender catamaran gains, is the unsourced part. The result says a friction-limited comparison at equal displacement does not favour the catamaran; it does not rank real boats.
- Citation checks:
cite_check.py found two DOIs written from memory were wrong (Wynn et al. 2014 resolved to a seamount-observatory paper; the Rudnick 2004 DOI to a floats paper). Both were fixed or demoted in PROPOSAL.md. - Next: milestone 2, a sourced wave-resistance curve and a published resistance curve to check against; Holtrop-Mennen for H3.
Paper, code and results
More in Open-source purpose-built robots
- Holding a survey line in current and waves: line-of-sight against integral line-of-sight for a small boatPlain line-of-sight guidance leaves a steady cross-track offset of delta*tan(asin(c/U)) in a cross current c (simulation matches it to 1%: 3.77 m at 0.3 m/s, 12 m look-ahead); integral LOS removes it, with lower rms cross-track error in 136 of 144 cross-current cases and the 8 exceptions all at a 6 m look-ahead with integral gain 2, where it oscillates (rms about 2.3 m even in still water)
- If a late field loses yield instead of failing a hard deadline, does a scout-and-treater fleet still lose to inline weeding robots?Replaces the hard deadline of osrobot-deadline with a 2% yield loss per leaf stage of delay (Knezevic et al. 2003): the best pipeline costs 1.06 to 1.20 times the best inline fleet at 0.72 ha and 1.49 to 1.51 at 0.18 ha, and at 1.62 ha inline is cheaper when the window closes by 8 h and the pipeline from 12 h
- What does a 2-joint feeding arm cost against a 6-joint one once the whole bill of materials is priced?What does a 2-joint feeding arm cost against a 6-joint one once the whole bill of materials is priced? About 1.8 times, not 3: $66 against $122 at the SO-ARM101 table's $13.89 servo, rising to 2.4 times at a $49 retail servo.
- Does treating weeds as you drive still beat scouting first when the robot uses published laser-weeder numbers?Re-running the
osrobot-field weeding model with sourced laser-weeder constants (2 m swath, 0.73 s per weed, 99.2% kill) halves the time but keeps the ranking: inline treatment takes 71.7 min against 79.3 for scout-then-treat at 0.3 weeds/m² and 1 km/h, and scout never wins across densities, speeds and detector hit rates
- Can a stdlib static linter catch the lab-protocol faults the Opentrons simulator accepts?Can a stdlib static linter catch the lab-protocol faults the Opentrons simulator accepts? It flags 362 of the 522 seeded faults to the simulator's 270, adding reused tips, tips left on, sub-minimum volumes and carry-over; stylised, partly circular.
- Does the MuJoCo feeding-arm result change when the lips have the ISO/TS 15066 face stiffness and the safe force comes from the standard?At the ISO/TS 15066 face stiffness (75 N/mm) the blocked-arm impact peak only doubles (7.56 N against 3.68 N at 0.10 m/s), and every camera-arm trial stays under the 65 N and 130 N face limits (worst peak 53 N), where the assumed 2 N limit had flagged most; contact damping is unsourced and swept (MuJoCo, simulation only)
All 44 Open-source purpose-built robots projects →
Other research topics
Proper scoring & elicitation28Effort & peer prediction9Verification games & slashing19Detection & tolerances14Markets as routers13Prediction-market design9Paying contributors8Decentralised training systems23Digital twins & sim-to-real164LLM chip design loops40Robot manufacturing loops53Ambient AI assistant46Self-replicating manufacturing34Simulation-first design64Engineered clothing45Task-specific AI accelerators40Algorithmic chip-design loops42Open-source purpose-built robots44The software-engineering loop43Adversarial human imitation41Open-source residential construction41Autonomous multi-angle capture34Sensing, imaging and 3D31Energy supply and dense energy storage39Robot societies among people31Agentic co-design of low-cost robots27Laundry-hanging robots25Machine learning on qualitative data23Robots on the building site27Civilizations & group psychology1History & human sciences1
Produced with AI assistance (Claude). Results are from the code in this repository and are simulated or stylised unless the abstract says otherwise; nothing here implies affiliation with or endorsement by any lab, researcher or company cited. MIT licensed.