Walter-OS v0.4.5
Quick follow-up release after v0.4.4 — closes the four follow-up issues filed during the v0.4.4 cross-review cycle + a real production-bug fix the hardened tests caught.
What's in this release
| PR | Closes | Summary |
|---|---|---|
| #138 | #133, #134 | _shell_quote (printf %q) + _xml_escape helpers in install.sh — REPO_ROOT shell-escape in env-file + audit_script XML-escape in launchd plist |
| #139 | #136 | CF Access apps for every site that imports admin_auth_gate (added tower + metabase + postiz; renamed hs → headscale-admin) |
| #140 | #132 (spec) | Spec + ADR 0017 for OpenClaw transitive-dep shrinkwrap shipping (runtime impl deferred) |
| #141 | — | Hardened escape-helpers bats — caught a real bash 5.2 production bug that shipped in v0.4.4 |
The bash 5.2 bug worth highlighting
v0.4.4 shipped _xml_escape which uses bash parameter expansion ${var//pattern/replacement} to escape XML-reserved characters. On bash 5.2+ (Ubuntu 24.04+, current GitHub Actions runners, recent Homebrew on macOS), an unescaped & in the replacement string is interpreted as "the matched text" — so ${v//</<} produced <lt; instead of <. Every plist render on a bash-5.2 host was producing broken XML.
The bug stayed invisible in v0.4.4 because the existing bats tests ran on a macOS bash where patsub_replacement defaults off. PR #141's hardened tests + the CI wiring (the tests existed but weren't actually being run) caught it the first CI cycle. Fix: shopt -u patsub_replacement at the top of _xml_escape.
Cross-review discipline
Codex was the FIRST reviewer on every PR in this batch — not catch-up. Real R1 findings landed in each, including the bash 5.2 bug, the npm link direction, registry pinning on shrinkwrap generation, the CI workflow not actually running the new bats files, the canary-not-in-injected-payload test gap, and the headscale-admin/hs naming mismatch in CF Access.
Upgrading from v0.4.4
Drop-in. The bash 5.2 fix is local to _xml_escape and only matters at install time (when the plist is written). Existing installs that already wrote plists on bash 5.1- aren't affected; future installs on bash 5.2+ now produce correct XML.
Follow-ups still open
- #132 — OpenClaw shrinkwrap implementation (spec landed in #140; impl deferred to a separate PR after operator sign-off on Candidate A vs B).
🤖 Released after Codex-R1-first reviews on all 4 follow-up PRs.