This commit is contained in:
@@ -0,0 +1,295 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user