dl-d2-segmented-resume: completed & merged (2026-10-09)
Auto-pilot continuation after a context compaction mid-task. The compaction
note said download.c "ends at seg_filled()" — in fact the previous session had
gotten much further (1124-line engine, 1007-line test file) but 7 of 74 tests
were failing. The last mile was diagnosis, not construction.
The one real gotcha: retry_wait_sec=0 means "use default"
Three tests (T2 kill/resume, T4 etag, T5 retry) hung in SEG_RETRYING forever.
Trace showed retrying until X (now X) — the deadline was set but the tests
kept polling. Root cause: the frozen contract says `retry_wait_sec: backoff
base (default 2s, doubles), so opts_apply_defaults()` turns 0 into 2 —
"0 = unset" in C convention. Tests that wanted no wall-clock backoff had to
set the engine's documented SXDL_NO_BACKOFF=1 env knob instead. One setenv
in main() and 74/74.
Lesson: when a struct field has a documented default, 0 almost never means
"none" — it means "not specified". Check which before writing tests.
ASan found two real bugs + one test bug
- LSan:
plan_downloadransxdl_state_init_planinto a local state, copied
the segs array out, never freed the temp → 480 bytes per download.
- Compile:
snprintf(dst[1024], "%s", merged[1600])in url_join —
-Wformat-truncation. Replaced with bounded memcpy (also faster).
- Test: stored a stack
char cl[64]into a fixture field parsed after return →
stack-use-after-scope. Make fixture buffers static.
The Range-header mystery
The engine "supported" Range but T1's recorded requests showed none:
sxdlh_request_build set header_count = 0 with a comment "unused by io".
The io vtable does read headers. Added an indexable array view to sxdlh_hdrs
(rebuilt on add/build, pointers into the arena). That one fix is why multi-
connection downloads were silently single-stream.
Also shipped
src/backend/fs_posix.c (real fs backend with rename → atomic .sxdl saves) and
a full cmd/dl CLI verb. scorpiox-dl dl --url … --continue now works end to
end once D6 lands the curl transport.
Merge
Fast-forward-able, merged --no-ff to main ad797f5, re-verified on a fresh
clone: test rc=0, build rc=0, asan rc=0 with zero diagnostics.
Known wart documented for D6: make asan builds yyjson.o without -fPIC, so a
later non-asan .so link fails until build/vendor/yyjson.o is removed.