The blobs archive and APPLY.txt are both conditional on there being
changed binary blobs, and dounix.sh removes them up front so a rerun
that finds none leaves neither behind. It did not remove their
.sha256 files, so those survived from the previous run.
A release operator staging by glob then signs and uploads checksums
for artifacts that no longer exist. #2214 added the APPLY.txt
checksum, which widened an existing gap on the blobs checksum.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
dounix.sh already produced APPLY.txt when companion blobs ship, and
every release cut has been checksumming it by hand. Add the missing
sha256sum step (same blob-gate as BLOBS_FILE) and reword the closing
reminder so checksums and signatures cover the same artifact set.
Version bump across the three files that carry it: mux/include/_build.h
(MUX_VERSION, MUX_RELEASE_DATE) and OLD_BUILD/NEW_BUILD in dounix.sh and
dowin32.sh, which move 9->10 and 10->11 respectively.
CHANGES.md: close the 2.14.0.11 section that has been maintained through
the cycle, and add the client TCP_NODELAY work (#2204, #2205, #2206,
#2207) to Clients, which had #2196 for tf but not the other four native
clients. Recorded with the wire measurement rather than by inspection --
two segments before the fix, five after, and no observable difference on
loopback at all.
Build-only changes are left out of the changelog as they have been all
cycle (#2177, #2180, #2185, #2211).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three defects, found while re-cutting 2.14.0.10 on Windows after #1967.
1. win32/TOC.src.patchable and win32/TOC.src.removed BOTH list six files:
src/ganl_adapter.cpp src/netaddr.cpp src/signals.cpp
src/sitemon.cpp src/telnet.cpp src/version.cpp
dowin32.sh copies the patchable list in, then runs clean_files over the
removed list, so the delete wins and they never ship. netmux.vcxproj
ships and requires all six. Verified against the DISTRIBUTED
mux-2.14.0.9.win32.src.zip: its netmux.vcxproj names 15 sources under
src/ and the archive contains 9 of them, so the win32 source
distribution has not been buildable since at least 2.14.0.9. This is
#1967's defect class with a different mechanism -- that was a file named
in no list, this is a file named in two contradictory ones -- and it hid
from that audit because the check was Makefile.am, which is the Unix
build system. On Windows the build system is the vcxproj.
2. ac6c24fef added a blank line to win32/TOC.src.removed and
unix/TOC.removed. dowin32.sh reads its lists with mapfile -t, which
preserves the empty element; "$dir/" exists, so clean_files ran
rm on the distribution root, plain rm refused with "Is a directory",
and set -e aborted the release having produced nothing. dounix.sh
iterates an unquoted $remove_files, where word splitting drops the empty
token, so the identical blank line is harmless there -- which is why it
merged green. Both files also lost their trailing newline; restored.
3. Neither script validated its lists. A contradicting or stale list
produces a wrong distribution SILENTLY: the archive is intact, so every
checksum and every GPG signature over it still verifies. #1967 put it
exactly right -- they prove the tarball is intact, not complete.
Adds a preflight to both scripts, run before anything is copied, asserting
two invariants and refusing to build otherwise:
removed n (patchable u unpatched) = 0
everything listed to ship exists in the tree
and a guard in dowin32.sh's clean_files so an empty entry can never again
be turned into an operation on the distribution root. The rm -rf variant
of that loop would not have refused.
Not automated here: the stronger check that every source the build system
names is present in the packaged output. It needs the built artifact and
is platform-specific, and it is the only one of the three that catches
either #1967's missing seven or this change's missing six. Run it against
the artifact.
Verified on Windows, 2.14.0.10 re-cut from the signed binaries:
netmux.vcxproj and every other project file -- 213 references, 0 missing
(was 6); lib/Makefile.am -- 24 sources, 0 missing; #1967's seven files all
present; orphaned lib/timeparser.cpp correctly removed; 8/8 checksums;
packaged netmux.exe/libmux.dll/engine.dll bit-identical to the
Authenticode-signed copies in game/bin. Negative control: reintroducing
one conflict makes the preflight name the file and exit 1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The 2.14.0.10 draft was last refreshed on 2026-07-25 and had drifted:
it opened by claiming 155 merged changes in under two weeks. Rewritten
against the full range since Build-2.14.0.9.
Version bumped in the three files the release process names:
mux/include/_build.h (2.14.0.10 / 2026-AUG-02), dounix.sh and
dowin32.sh (OLD_BUILD=9, NEW_BUILD=10). ALPHA stays defined.
CLAUDE.md gains the release model that was only ever oral tradition --
2.14 is a long alpha with no planned Beta, 2.13 is what live games run
-- and its _build.h path is corrected (it said mux/src/, the file is in
mux/include/).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.14.0.9 is the first release to ship a binary artifact (rv64/softlib.rv64)
in the source distribution, which exposed a latent flaw: dounix.sh fed the
blob through diff -a into the text upgrade patch. That embeds NUL bytes and
relies on diff/patch round-tripping binary as text -- unportable (notably to
BSD patch) and silently fragile.
Rework the patch build so binaries are delivered reliably:
- Auto-detect binary files (NUL scan) among the patchable set and stash them
out of both trees before diffing, so the .patch is pure text with
conventional headers. A hard guard aborts the build if any NUL leaks in.
- Ship changed blobs whole in a companion mux-OLD-NEW.unix.blobs.tar.gz
(staged under the distribution dir name for in-place "tar xzf" overlay),
with an auditable APPLY.txt documenting the two-step upgrade. Only blobs
that actually changed are packaged.
- Add a build-time self-test: apply the generated patch to a fresh copy of
the previous release, overlay the blobs archive, and diff against the new
tree -- the build fails unless they match byte-for-byte.
Also general robustness: reference-dir/TOC/source preconditions with clear
errors, set -u, quoted paths, gzip -t / tar -t archive verification, and an
artifact summary noting the new companion archive must be GPG-signed too.
The full tarball is unchanged and still contains every file. dowin32.sh
(7z/zip patch format) is left for separate review.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump version to 2.14.0.9 and update the release date to 2026-JUL-14 in
_build.h, dounix.sh, and dowin32.sh. CHANGES.md is current for 2.14.0.9.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump version to 2.14.0.8 and update release date to 2026-JUN-15 in
_build.h, dounix.sh, and dowin32.sh. CHANGES.md and the distribution
TOCs were already current for 2.14.0.8.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump version to 2.14.0.7, update release date to 2026-APR-03,
add new DBT backend files to distribution TOCs, and write CHANGES.md
covering all distributed changes since 2.14.0.6.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update version to 2.14.0.6, release date 2026-MAR-26.
Bump OLD_BUILD/NEW_BUILD in dounix.sh and dowin32.sh.
Add Build 6 changelog: JIT constant folding (35+ functions),
re-entrant shared heap, pool overflow fixes, WAL auto-checkpoint,
ASCII fast path for command matching, 50 parity tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set NEW_BUILD=1 in release scripts, update _build.h version.
Reference directory mux2.14_0 seeded from 2.13.0.12.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- _build.h: version 2.13.0.8, date 2026-MAR-06
- dounix.sh, dowin32.sh: OLD_BUILD=7, NEW_BUILD=8
- CHANGES.md: document SQLite always-on storage, Unicode 16.0 with
NFC normalization, grapheme cluster indexing, UCA/DUCET collation,
CJK width-aware operations, indexed @search, and all modernization
work since 2.13.0.7
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Update version from 2.13.0.5 to 2.13.0.6
- Update release date to 2025-APR-02
- Update build numbers in dounix.sh and dowin32.sh
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>