Files
peerspeak/docs/release-0.6.7-prep.md
T
mollusk c2d82acf82
CI / check (push) Failing after 2m46s
docs: prepare PeerSpeak 0.6.7 release
2026-08-22 06:10:38 -04:00

296 lines
12 KiB
Markdown

# 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: `main` at `0823f617`, 17 commits ahead of `origin/main`.
- PixelPass: `main` at `ce909afc`, 14 commits ahead of `origin/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.md` modification 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:
```text
PeerSpeak v<package version> (<8-character commit hash>)
```
The same label also appears in Settings. The two pieces come from different
places:
- `Cargo.toml` supplies the version through `CARGO_PKG_VERSION` and must be
bumped from `0.6.6` to `0.6.7`.
- `build.rs` runs `git rev-parse --short=8 HEAD` and embeds the result as
`PEERSPEAK_GIT_SHORT`. **Do not edit or bump the hash by hand.**
Consequences for the release order:
1. Make and commit all source, version, changelog, and field-evidence changes.
2. Build the final AppImage from that clean final commit.
3. On first launch, verify the title screen says exactly
`PeerSpeak v0.6.7 (<final HEAD short hash>)`.
4. Verify the displayed hash equals `git rev-parse --short=8 HEAD`.
5. 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`:
```sh
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.md` and `.codex/` state is preserved;
- no stale call/share processes are running;
- `v0.6.7` does 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:
1. Mollusk hosts; Lindsay views.
2. Lindsay hosts; Mollusk views.
3. In each direction select the sole visible **All system audio** row.
4. Play desktop audio after the share begins, including starting a new audio
stream/application during the share.
5. Talk from both machines while the desktop audio plays.
6. Stop sharing while the voice call remains active.
7. 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].version` in `Cargo.toml` to `0.6.7`.
- Refresh the root PeerSpeak package entry in `Cargo.lock`; inspect the diff and
make sure it changes only as intended.
- Change `MyAppVersion` in `packaging/windows/peerspeak.iss` to `0.6.7`, even
though tomorrow's planned public asset is AppImage-only. This prevents the
next Windows installer from silently retaining `0.6.6`.
- Move the relevant `[Unreleased]` material into a dated `0.6.7` section in
`CHANGELOG.md` and add the `v0.6.7` comparison/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:
```sh
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:
```sh
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:
```sh
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 `sha256sum` and create a matching `.sha256` sidecar;
- run `--appimage-extract` into an isolated scratch directory;
- inspect `ldd` for both bundled `usr/bin/peerspeak` and `usr/bin/pixelpass` and
require no `not found` entries;
- 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 --capabilities` and confirm desktop-audio exclusion
support is advertised;
- run the bundled `pixelpass --doctor` with 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.7` proposed 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:
1. Push `main` without force.
2. Confirm remote `main` resolves to the tested final commit.
3. Create an annotated `v0.6.7` tag on that exact commit and push it.
4. Create the `v0.6.7` GitButter release page from the finalized changelog text.
5. Upload `peerspeak-0.6.7-x86_64.AppImage` and its `.sha256` sidecar.
6. 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 `main` point 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.