close_gracefully read with a 500 ms timeout per read but no overall limit, so a local client
sending one byte every few hundred milliseconds kept the drain (and its connection slot) going
until it had sent MAX_LINE. Each read now waits at most the time left of DRAIN_TIME (1 s).
New test a_closing_connection_is_not_held_open_by_a_trickling_peer: without the limit it drains
for 10 s.
tcp_connection_is_closed_after_junk no longer sleeps before its second write: it reads the
reply and the rejection first, so the server has rejected the junk before the next line is
sent. It still pauses before the last read so that a reset can arrive. Without
close_gracefully it fails with os error 10053 on Windows.
From CodeRabbit's review of #2723.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PtjHGt5gnCHXgLt4NbGorf
After rejecting a line the server closed its socket at once. A line the client sent after the
junk then arrived at a closed socket, which answers with a reset, and on Windows the reset
discards the replies the client has not read yet: the client saw os error 10053 / 10054 instead
of the error explaining why. This is the Windows x64 failure of
tcp_connection_is_closed_after_junk in #2377's CI.
serve_stream now shuts down the write side (FIN), reads and drops what is left (at most 4 MiB,
500 ms), then closes. close_gracefully is taken from #1970 by LochLogic, split out so it can
land ahead of the per-run token work; #1991 did not include it.
The test sends its last line 100 ms after the junk and reads after another 100 ms, so it fails
on every run without the fix on Windows (10053) instead of depending on timing.
Co-Authored-By: LochLogic <252105752+LochLogic@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K93HTyCiwYvbRGaAkjPvXn
* CI: run the gate through craft-common-actions' shared gate.yml; FreeBSD nightly and on release
ci.yml is new: it calls the shared workflow (cached apt packages, nextest, main-only cache saves, Cargo.lock check). FreeBSD and Windows ARM64 run nightly and on pushes to release instead of on pull requests. Depends on storytold/craft-common-actions#69.
* CI: the gate installs no nextest (xtask ci runs cargo test)
- ORF_DECODED's Camedia branch drops the redundant \\S+ before .*; with two anchored greedies the scanner can no longer retry the same substring count-for-count at lower and lower split points (same match set, verified on 14 body strings).
- {c: 0 for c in classes} is now dict.fromkeys(classes, 0), which the rule wants and which stones the per-class counters.
* CI: dev profile keeps line tables for workspace crates and no debug info for dependencies
* Control server tests: persistent_requests_and_slow_replies_outlive_the_idle_read_timeout no longer races the idle timeout
Each request (and the closing half-shutdown) reaches the socket before the
worker reads, so on a slow machine only the reply waits outlast the 100 ms
idle timeout, as the test intends. The idle test sends its input the same
way, and the no-frames test allows 5 s instead of 2 s to give up.
* CI: one integration-test binary per crate
Each crate's tests/*.rs become modules of tests/it/main.rs (51 test files
into 13 binaries, plus 6 that stay their own). Inner #![cfg] attributes
move to the mod lines. Files that change state for the whole process keep
a binary of their own: codecs jxl_tail_heap and raw sr2_heap (dhat global
allocator), gpu shutdown, shutdown_first and memory, ui-egui shutdown.
Docs, comments and the GPU probe name the new paths and targets
(--test it <module>::); the CI report names an it binary's skips after
the crate.
* CI: tests under nextest, doctests apart, one wasm check
xtask ci runs the tests with cargo nextest run --lib --bins --tests when
cargo-nextest is installed, else cargo test with the same targets and a
one-line notice; doctests run after them with cargo test --workspace --doc.
The heif and hardware GPU steps use the same runner. Examples stay out of
the test build (clippy --all-targets still checks them). Concurrent tests
under nextest follow the RUST_TEST_THREADS cap (NEXTEST_TEST_THREADS).
The wasm check is one cargo check --keep-going over the same crates, and
clippy runs with --keep-going.
* CI: tests run under cargo test by default, nextest with LIGHTCRAFT_NEXTEST=1 (per-process scene cache)
* Packaging: pin the Windows signing client and check its hash
* Packaging: pin appimagetool and check its hash
* Packaging: no pinned tool or runtime for an architecture exits clearly; pin the AppImage runtime and pass it with --runtime-file
Bash scripts use [[ ]] for tests, functions name their positional
parameters and end with an explicit return, and the app-specific packaging
check writes its ::error:: annotations to stderr. No behaviour change.
Dropping a wgpu buffer after the device's thread-locals are gone can
abort; the device owns the memory either way.
🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
On the FreeBSD runner a click's synthetic input can arrive a frame or two late, so after opening
`/a/b/c/d` the row of `/a/b/c/d/e` was not drawn yet when the next click asked for it. The
fixture now steps until each level's chevron is drawn before clicking it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build.rs requires every *-formats.json to carry the same messages. The sv (7), fi (1),
id (1) and vi (49) format catalogs predate messages main has added; those entries use the
English text until they are translated.
docs/parity-checklist.md: header keeps the newer date; LR-IMP-FORMATS row keeps both sides' changes.
docs/raw-parity.md: header change note names both sides' changes.
docs/raw/coverage.tsv: merged cleanly; same rows as both sides, no duplicates (regenerated on the combined branch).
crates/raw/src/kelvin_presets.rs: covered_models keeps the Z5II asserts (#2006) and the Canon cases (#2009).
docs/parity-checklist.md: LR-EDIT-COLOR-TEMP row keeps both sides' preset clauses.
crates/ui-egui/src/tests_grid.rs: both sides' tests
docs/whats-new.md: both entries under one 2026-10-16 heading
docs/parity-checklist.md: header and revision rows from both sides