Nightly reds: libhv log-file switch, STYLE030 static_if require, Windows bash, seqbox window - #4158
Conversation
…uire, Windows bash in the manifest test, seqbox window dasHV carries a libhv patch (modules/dasHV/patch_libhv.cmake, the ExternalProject PATCH_COMMAND): logger_set_file closes the open log file under the logger mutex, so hv_set_log_file switches files after libhv has logged - test_log_file failed in every lane that runs the dasHV folder in one process. The same fix is upstream as ithewei/libhv#892; the patch drops when the pin moves past it. The script patches from a saved pristine copy and fails the build, naming the anchor, when one is gone; tests-cpp/big/dashv_patch_libhv (label small) drives it over a fixture. dasllama_fat_start.das: dasllama_env's only use sits in the llvm_tune static_if half, so the LLVM-off lint lane flags the require; nolint:STYLE030 like strings_boost beside it. ci/test_render_manifests.py runs checksum_assets.sh through Git's bash - a bare "bash" from Python on Windows is System32's WSL launcher. test_seqbox_concurrent_writers keeps running past its 250 ms window until a snapshot was published and read (10 s cap) - a starved runner stopped the workers before they ran. tests-cpp/REVIEW.das skips the lane-wiring check for a file whose every test runs ${CMAKE_COMMAND} or ${CMAKE_CTEST_COMMAND} and that declares no target or custom command - the patch test builds nothing; writing_cpp_tests.md names that shape, and tests-cpp/REVIEW.md binds any later change to that check to keep reporting a file that builds something and leaves its lane unwired. make-pr reads at info unless DAS_LOG_LEVEL is set - under the default warning floor its gate ledger printed nothing. The guard is utils/common/log_floor.das, which preflight now calls too. CLAUDE.md's to_log line names the floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
It patches an external dependency's C source at build time and alters concurrency-test timing and build-wiring across the full CI matrix, which cannot be fully verified here and warrants human review.
Review effort: Balanced
Findings: None
What changed in this PR
This PR fixes four of the five root causes behind a red 2026-09-28 nightly (16 jobs). It patches libhv's logger_set_file at build time so hv_set_log_file actually switches log files, silences a false STYLE030 lint on a static_if-only require, makes a Windows CI test invoke Git's bash instead of the WSL launcher, widens a concurrency test's snapshot-landing window on starved runners, and centralizes the DAS_LOG_LEVEL default-to-info behavior into a shared log_floor helper. It also narrows the tests-cpp lane-wiring gate so a build-nothing cmake/ctest-only test folder is not falsely required to wire a lane.
Changes:
- Add
modules/dasHV/patch_libhv.cmake(idempotent, pristine-anchored source patch) plus acmake -Pfixture test, and wire it into dasHV'sExternalProject. - Extract
default_log_floor_to_info()intoutils/common/log_floor.das, adopt it in make-pr and preflight, and add tests. - Narrow the
tests-cpp/REVIEW.daslane-wiring check viabuilds_nothing_for_its_tests, fix the Windows bash resolution inci/test_render_manifests.py, widen the seqbox test window, and add a STYLE030 suppression.
| File | Description |
|---|---|
utils/common/log_floor.das |
New shared helper that defaults DAS_LOG_LEVEL to info when unset. |
utils/internal/preflight/main.das |
Replaces inline env logic with the shared helper. |
utils/internal/make-pr/main.das |
Calls the shared helper in main(); drops a non-attaching trailing //!. |
utils/internal/make-pr/test_gates.das |
Adds tests for the helper and for make-pr printing its gate lines with no floor set. |
tests-cpp/small/test_seqbox_concurrent_writers.cpp |
Waits (10 s cap) for snapshots to land before stopping workers. |
tests-cpp/REVIEW.das |
Adds builds_nothing_for_its_tests to skip lane wiring for cmake/ctest-only folders. |
tests-cpp/REVIEW.md |
New rule documenting the narrowed lane-wiring gate. |
tests-cpp/big/dashv_patch_libhv/* |
Fixture, cmake test driver, and CMakeLists exercising the patch script. |
modules/dasHV/patch_libhv.cmake |
New idempotent patch applying the libhv logger_set_file fix. |
modules/dasHV/CMakeLists.txt |
Wires PATCH_COMMAND and re-patch-on-edit step dependency. |
modules/dasLLAMA/dasllama/dasllama_fat_start.das |
Adds nolint:STYLE030 for a static_if-only require. |
ci/test_render_manifests.py |
Resolves Git bash on Windows; skips when no bash. |
skills/internal/writing_cpp_tests.md, CLAUDE.md |
Doc updates for build-nothing test folders and log-level filtering. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
|
Why. The 2026-09-28 nightly went red in 16 jobs from five causes. This fixes four; the strudel worker reds on the tsan lane get their own PR.
What changes.
logger_set_file(the fix sent upstream as fix(hlog): logger_set_file switches an already-open log file ithewei/libhv#892): it closes the open log file, sohv_set_log_fileswitches files after libhv has logged.dasllama_fat_start.das:nolint:STYLE030on a require used only inside thellvm_tunestatic_ifarm, which the LLVM-off lint lane never sees.ci/test_render_manifests.pyrunschecksum_assets.shthrough Git's bash; a barebashfrom Python on Windows is WSL.DAS_LOG_LEVELto info through one helper,utils/common/log_floor.das.tests-cpp/REVIEW.dasskips lane wiring for a file whose tests only run cmake or ctest and that builds nothing; a newtests-cpp/REVIEW.mdrule keeps every other unwired file reported.Observable behavior.
tests/dasHV/test_log_file.das: red in every lane running the dasHV folder -> greendasllama_fat_start.das-> cleancheck_manifest_render: exit 127 -> greenseq box survives concurrent writerson a starved runner: fails -> passesDAS_LOG_LEVEL: prints nothing -> prints its gate ledgerWhere to look.
modules/dasHV/patch_libhv.cmake(patches from a saved pristine copy, fails the build on a drifted anchor) and the narrowed check intests-cpp/REVIEW.das.#nightly
Validation, claims, ledger
Validation
tests/dasHVas one folder in one process (the failing shape), Windows Release: 145/145.cmake -S . -B build(DAS_TOOLS_DISABLED OFF), thenctest --test-dir build -C Release -L small -R dashv_patch_libhvpasses; four mutants of the script (warning instead of fatal, reading the live file instead of the pristine copy, no usage guard, unmoved mutex init) each turn it red.ctest --test-dir build -C Release -L small -R "seq box survives concurrent writers". 24 copies pinned to one core: before 20/24 fail with the nightly's checks, after 24/24 pass.test_gates.das8/8; emptying the setter and dropping the call frommain()each fail a test.tests-cpp/REVIEW.das: green on the tree; red onstyle_lint/with its wiring removed, on a bareCOMMAND daslangprobe, and on acmake -Ptest beside anadd_custom_target.model-free/--changedsuites - the only dasLLAMA change is a lint-suppression comment, and the local build has LLVM off.Claims - stated, not tested
filepath, resettingcan_write_cnt, clearingcur_logfile, and the lock around the close.test_log_filedoes not tell them apart; a break would show only for a path of 255+ characters, a switch into an already over-size file,logger_get_cur_file()read between a switch and the next write, or a log write racing the switch.Not done
static_ifarm: ledgered."bash"inci/*.py: ledgered.miniaudio_memory64.cmake: declined.patch_libhv.cmakegoes away when the libhv pin moves past fix(hlog): logger_set_file switches an already-open log file ithewei/libhv#892.