Add a size and packaging guardrail
CI / macos-latest (push) Has been cancelled
CI / ubuntu-latest (push) Has been cancelled
CI / windows-latest (push) Has been cancelled

This commit is contained in:
pleb
2026-07-29 11:06:21 -07:00
parent d1c83e8a7d
commit 1648ec5672
2 changed files with 85 additions and 2 deletions
+32 -2
View File
@@ -76,5 +76,35 @@ nix-build release.nix -A windows -o result-windows
```
The packager writes platform-qualified archives and `SHA256SUMS.txt` to
`dist/`. `scripts/publish-release.sh` uploads those exact assets as a Gitea
pre-release after the worktree is committed and clean.
`dist/`. It also writes `SIZE-REPORT.txt`, recording the generated PEQ index,
the two executables, and both final archives in bytes. Before writing the
checksums, the packager verifies that each archive contains exactly its binary,
`README.md`, `LICENSE`, and `config.toml`. This excludes PEQ dumps, SQL/fixture
inputs, MariaDB data, the generator, and all source files from releases.
Keep the size report with the release/change description. When changing the
embedded index encoding, compare its archive sizes against the previous report
and record the Linux `.tar.gz` and Windows `.zip` deltas. Do not add an archive
size threshold until a stable release baseline has been established.
### PEQ index size audit — 2026-07-29
The following release builds compare pre-PEQ commit `561ace9` with the current
core mapping implementation (tasks 14). The after size includes the embedded
index and its resolver code.
| Artifact | Before | After | Delta |
| --- | ---: | ---: | ---: |
| Generated index | 0 B | 719,199 B | +719,199 B |
| Linux executable | 6,772,856 B | 7,535,632 B | +762,776 B |
| Linux `.tar.gz` | 2,871,605 B | 3,010,723 B | +139,118 B |
| Windows executable | 6,577,369 B | 7,332,144 B | +754,775 B |
| Windows `.zip` | 2,805,692 B | 2,944,841 B | +139,149 B |
Both archives were inspected after packaging and contained only the platform
binary, `README.md`, `LICENSE`, and `config.toml`. The compressed distribution
cost is about 139 KB per platform; retain the JSON encoding until a future
measurement establishes a material reason to optimize it.
`scripts/publish-release.sh` uploads the archive assets and checksums as a
Gitea pre-release after the worktree is committed and clean.
+53
View File
@@ -6,6 +6,35 @@ usage() {
exit 2
}
file_size() {
wc -c < "$1" | tr -d '[:space:]'
}
expected_archive_contents() {
local root=$1 executable=$2
printf '%s/\n' "$root"
printf '%s/%s\n' "$root" "$executable"
printf '%s/%s\n' "$root" README.md
printf '%s/%s\n' "$root" LICENSE
printf '%s/%s\n' "$root" config.toml
}
verify_archive_contents() {
local archive=$1 root=$2 executable=$3 contents
case "$archive" in
*.tar.gz) contents=$(tar -tzf "$archive") ;;
*.zip) contents=$(zipinfo -1 "$archive") ;;
*) echo "Unsupported release archive: $archive" >&2; exit 1 ;;
esac
if ! diff -u \
<(expected_archive_contents "$root" "$executable" | sort) \
<(printf '%s\n' "$contents" | sort); then
echo "Release archive contains unexpected or missing files: $archive" >&2
exit 1
fi
}
linux_binary=
windows_binary=
while (($#)); do
@@ -22,6 +51,9 @@ done
version=$(awk -F '"' '$1 ~ /^version = / { print $2; exit }' Cargo.toml)
[[ -n "$version" ]] || { echo "Could not read the package version." >&2; exit 1; }
index=generated/peq-npc-gender-index.json
[[ -f "$index" ]] || { echo "Missing generated PEQ index: $index" >&2; exit 1; }
dist=dist
stage=$(mktemp -d)
repository_root=$PWD
@@ -49,6 +81,25 @@ cp README.md LICENSE config.toml "$stage/$windows_root/"
zip -q -r "$repository_root/$dist/${windows_root}.zip" "$windows_root"
)
linux_archive="$dist/mudmouth-v${version}-x86_64-unknown-linux-gnu.tar.gz"
windows_archive="$dist/${windows_root}.zip"
verify_archive_contents "$linux_archive" "mudmouth-v${version}-x86_64-unknown-linux-gnu" mudmouth
verify_archive_contents "$windows_archive" "$windows_root" mudmouth.exe
size_report="$dist/SIZE-REPORT.txt"
{
echo "Mudmouth release size report"
echo
printf 'Generated PEQ NPC index: %s bytes\n' "$(file_size "$index")"
printf 'Linux executable: %s bytes\n' "$(file_size "$linux_binary")"
printf 'Linux .tar.gz: %s bytes\n' "$(file_size "$linux_archive")"
printf 'Windows executable: %s bytes\n' "$(file_size "$windows_binary")"
printf 'Windows .zip: %s bytes\n' "$(file_size "$windows_archive")"
echo
echo "Archive contents: verified against the release allowlist (binary, README, LICENSE, config.toml)."
echo "PEQ dumps, generator inputs, fixtures, database files, and source code are absent."
} > "$size_report"
(
cd "$dist"
sha256sum -- *.tar.gz *.zip > SHA256SUMS.txt
@@ -56,3 +107,5 @@ cp README.md LICENSE config.toml "$stage/$windows_root/"
printf 'Created release assets in %s:\n' "$dist"
cat "$dist/SHA256SUMS.txt"
printf '\n'
cat "$size_report"