12 KiB
PeerSpeak 0.6.7 release prep
Prepared: 2026-08-22
Planned work day: 2026-08-23 (confirm the actual date before updating the changelog)
Release target: GitButter release page with a verified Linux x86_64 AppImage
This is a checklist, not release authorization. Pushing main, creating or
pushing a tag, creating the GitButter release, and uploading assets remain
explicit approval gates.
Starting checkpoint
Recheck every value live tomorrow; these are the known-good handoff values from 2026-08-22.
- PeerSpeak:
mainat0823f617, 17 commits ahead oforigin/main. - PixelPass:
mainatce909afc, 14 commits ahead oforigin/main. - Latest published PeerSpeak tag:
v0.6.6. - Current Cargo/Windows version:
0.6.6. - Current field-test build:
packaging/appimage/peerspeak-0.6.6-unofficial-20260822-ps0823f617-ppce909afc-fieldtest-x86_64.AppImage - Current field-test SHA-256:
f094a665dbd719929d6def32c8fd3d4943e4b88b6290e371e57b127c4e91ec45. - The same build was staged for Lindsay at
/home/lindsay/Downloads/peerspeak-0.6.6-unofficial-20260822-ps0823f617-ppce909afc-fieldtest-x86_64.AppImage. - Preserve the existing user-owned
docs/FEATURES.mdmodification and untracked.codex/directory. Do not include either in release-prep commits unless the user explicitly puts them in scope.
The current one-row audio-picker build passed local AppImage artifact checks, but it still needs the final two-machine field pass. Earlier two-machine passes proved that desktop audio was heard, call voices were not echoed, and no warning was visible. They also exposed the now-fixed stale viewer/warning behavior. Do not substitute those earlier passes for testing the current build.
Version decision
The expected release is 0.6.7.
VERSIONING.md defines pre-1.0 MINOR bumps as breaking wire-protocol changes,
not as a measure of feature size. The diff from v0.6.6 through 0823f617 is a
large screen-share implementation and local UI/lifecycle change, but it does
not change src/protocol.rs or bump an audio, friends, files, or gossip protocol
version. Under the repository's policy, that makes this a PATCH release.
Use 0.7.0 only if tomorrow's final source review finds or adds an actual
incompatible wire change. If that happens, identify and bump the affected
Layer-2 protocol constant/domain in the same change and plan a coordinated
upgrade for every peer.
Critical build-label rule
The first/home screen visibly identifies the binary as:
PeerSpeak v<package version> (<8-character commit hash>)
The same label also appears in Settings. The two pieces come from different places:
Cargo.tomlsupplies the version throughCARGO_PKG_VERSIONand must be bumped from0.6.6to0.6.7.build.rsrunsgit rev-parse --short=8 HEADand embeds the result asPEERSPEAK_GIT_SHORT. Do not edit or bump the hash by hand.
Consequences for the release order:
- Make and commit all source, version, changelog, and field-evidence changes.
- Build the final AppImage from that clean final commit.
- On first launch, verify the title screen says exactly
PeerSpeak v0.6.7 (<final HEAD short hash>). - Verify the displayed hash equals
git rev-parse --short=8 HEAD. - Tag that exact commit as
v0.6.7.
If any commit is added after an AppImage is built—even a field-evidence or release-note commit—the embedded hash is now old. Rebuild and revalidate the AppImage. Never publish an artifact whose visible hash differs from the tag target.
Tomorrow's runbook
1. Re-establish live state
From /home/mollusk/git/butter/peerspeak:
git status --short --branch
git log -1 --oneline --decorate
git -C ../pixelpass status --short --branch
git -C ../pixelpass log -1 --oneline --decorate
git fetch --prune --tags origin
git ls-remote --heads --tags origin
df -h / /mnt/superjar
pgrep -af 'peerspeak|pixelpass|mpv|gst-launch' || true
Confirm that:
- the checkpoint commits above are still the intended source;
- neither repository has unexpected changes;
- the existing
docs/FEATURES.mdand.codex/state is preserved; - no stale call/share processes are running;
v0.6.7does not already exist locally, remotely, or on GitButter;- there is enough space for one-job release builds and extracted AppImages.
2. Complete the current-build two-machine field test
Use the stamped 0823f617 AppImage on this machine and Lindsay's staged copy.
Start with PeerSpeak and any old screen-share helper/player processes closed.
Run both directions, with Lindsay keeping software encode enabled where needed:
- Mollusk hosts; Lindsay views.
- Lindsay hosts; Mollusk views.
- In each direction select the sole visible All system audio row.
- Play desktop audio after the share begins, including starting a new audio stream/application during the share.
- Talk from both machines while the desktop audio plays.
- Stop sharing while the voice call remains active.
- Start one more share, then have both peers leave the call.
Record all of these results explicitly:
- the picker has one desktop-audio row, not duplicate legacy/safe choices;
- desktop audio is heard by the viewer;
- neither person's call voice loops back through the shared audio;
- no transient or persistent missing-output-port warning appears;
- stopping a share clears the viewer and warning promptly;
- the viewer PixelPass child is reaped within roughly 500 ms after the remote stream ends;
- leaving the call clears the share and leaves no PeerSpeak-owned PixelPass, player, GStreamer, capture, or echo-cancellation residue.
If any row fails, stop release preparation. Save the exact visible text and relevant logs, fix the defect, run the focused regression gates, commit the fix, rebuild, and repeat the matrix.
3. Prepare the 0.6.7 source
After the current build passes:
- Change
[package].versioninCargo.tomlto0.6.7. - Refresh the root PeerSpeak package entry in
Cargo.lock; inspect the diff and make sure it changes only as intended. - Change
MyAppVersioninpackaging/windows/peerspeak.issto0.6.7, even though tomorrow's planned public asset is AppImage-only. This prevents the next Windows installer from silently retaining0.6.6. - Move the relevant
[Unreleased]material into a dated0.6.7section inCHANGELOG.mdand add thev0.6.7comparison/release link. - State that the release is wire-compatible with
0.6.6; do not claim a protocol bump. - Summarize user-visible behavior, especially:
- All system audio now shares desktop sound without feeding PeerSpeak's own call audio back to listeners;
- the safe path is the single normal desktop-audio choice;
- unsafe or incomplete audio-routing states fail closed and surface a useful warning;
- viewer/share cleanup is prompt when a stream stops or a peer leaves;
- the Linux AppImage bundles the matching PixelPass helper.
- Record the completed two-machine evidence in
docs/screenshare-audio-exclusion-impl-plan.md.
Commit the scoped version/changelog/evidence work. Keep unrelated user changes out of the commit.
4. Run source gates on the final commit
Use the pinned Rust toolchain and one build job if disk or linker pressure is tight:
cargo fmt --all -- --check
CARGO_BUILD_JOBS=1 cargo clippy --locked --all-targets -- -D warnings
CARGO_BUILD_JOBS=1 cargo test --locked --all-targets
CARGO_BUILD_JOBS=1 cargo test --locked --doc
cargo deny --locked check
cargo audit
git diff --check
git status --short --branch
The commands mirror the repository CI, with --locked added to compilation
and test gates after the intentional lockfile refresh. A gate that cannot run
must be recorded as unverified; do not silently treat it as passed.
Also verify the bundled PixelPass source is still exactly the intended clean commit and run its release diagnostics before packaging:
git -C ../pixelpass status --short --branch
git -C ../pixelpass rev-parse --short=8 HEAD
cargo run --manifest-path ../pixelpass/Cargo.toml --locked -- --doctor
5. Build the final AppImage
Build from the clean, committed PeerSpeak release source and clean PixelPass
source in the Ubuntu 24.04 distrobox described in packaging/appimage/README.md.
Keep build caches on /mnt/superjar and use one build job if space remains
tight. A representative invocation is:
distrobox enter peerspeak-appimage -- env \
PATH="$HOME/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/bin:$PATH" \
SYSTEM_DEPS_LIBSPA_INCLUDE=/run/host/usr/include/spa-0.2 \
SYSTEM_DEPS_LIBPIPEWIRE_INCLUDE=/run/host/usr/include/pipewire-0.3:/run/host/usr/include/spa-0.2 \
CARGO_BUILD_JOBS=1 \
PEERSPEAK_APPIMAGE_CACHE=/mnt/superjar/peerspeak-appimage-cache \
./packaging/appimage/build-appimage.sh
The official output should be
packaging/appimage/peerspeak-0.6.7-x86_64.AppImage. Do not overwrite the
stamped 0.6.6 field-test artifact until the release is complete and verified.
6. Validate the exact final artifact
At minimum:
- record
sha256sumand create a matching.sha256sidecar; - run
--appimage-extractinto an isolated scratch directory; - inspect
lddfor both bundledusr/bin/peerspeakandusr/bin/pixelpassand require nonot foundentries; - inspect RUNPATH/RPATH and confirm the bundle has not captured the host's graphics, PulseAudio, or GStreamer stack contrary to the thin-AppImage policy;
- run the bundled
pixelpass --capabilitiesand confirm desktop-audio exclusion support is advertised; - run the bundled
pixelpass --doctorwith a fresh temporary GStreamer registry; - launch the AppImage with an isolated config/data directory for a GUI smoke;
- verify the first/home screen reads
PeerSpeak v0.6.7 (<final PeerSpeak HEAD short hash>); - verify the same version/hash appears in Settings;
- confirm the bundled PixelPass binary corresponds to
ce909afc(or the exact newer commit deliberately selected tomorrow).
Because the final version/evidence commit changes the embedded hash relative to the current field-test artifact, do one short two-machine confirmation using the final AppImage: connect, share All system audio, confirm desktop sound and no voice echo/warning, stop the share, and leave cleanly.
7. Publication gate
Before any external write, present the final facts to the user:
- final PeerSpeak full and short commit;
- bundled PixelPass full and short commit;
v0.6.7proposed tag target;- AppImage filename, size, and SHA-256;
- title-screen version/hash observed;
- source, artifact, and two-machine gate results;
- exact release notes/assets to publish.
Then wait for explicit approval to publish.
After approval only:
- Push
mainwithout force. - Confirm remote
mainresolves to the tested final commit. - Create an annotated
v0.6.7tag on that exact commit and push it. - Create the
v0.6.7GitButter release page from the finalized changelog text. - Upload
peerspeak-0.6.7-x86_64.AppImageand its.sha256sidecar. - Do not paste or store a GitButter token in the repository, documentation, shell history, or release artifacts.
The planned release scope is the Linux x86_64 AppImage only. Do not imply that a Windows installer, Debian package, or separate PixelPass release exists unless those artifacts are deliberately added and independently verified.
8. Verify the public release
Publication is not complete until it is independently read back:
- confirm GitButter shows the correct release title, tag, notes, and both assets;
- confirm the remote tag and remote
mainpoint to the expected commit; - download the public AppImage to a fresh temporary path;
- verify its SHA-256 against the published sidecar and the local final hash;
- extract or run the downloaded copy and repeat the version/hash and bundled PixelPass diagnostic checks;
- save the final release URL and verification result in the implementation plan or handoff.
Failure and recovery rules
- A failed gate means no tag and no release—not a waiver.
- Never force-push or move a published tag as an automatic recovery step.
- If the tag is pushed but release creation/upload fails, stop and report the exact remote state before changing anything.
- Keep failed or candidate artifacts clearly stamped so they cannot be mistaken for the final asset.
- Remove only exact, rebuildable scratch/extraction directories when reclaiming disk space; preserve source, user changes, final artifacts, hashes, and field evidence.