- Start from a clean, green
masterbranch. Update the version inCargo.tomland move the relevantCHANGELOG.mdentries from Unreleased into a dated version section. - Run all commands from
CONTRIBUTING.md, including the release build and RustSec audit. Validate human/JSON--doctorand--check-config, config backup restore/conflict refusal, aforge-support-bundlearchive with synthetic secrets/paths (none may appear), normal and forced pane/tab/window close, mixed Block/VTE splits, JSONL and Block history, workflows, Notebook run/cancel, Wayland, and X11. - Confirm that no temporary migration workflows, source-export markers, local paths, hosts, or secrets are present. Review dependency and GitHub Action updates.
- Run
make package, verify the generated SHA-256 file, confirmLICENSE-MITandLICENSE-APACHEare present in the archive, inspect the remaining contents, and smoke-test its user-local installer/uninstaller on a compatible system. Create and push a signedvX.Y.Ztag; the release workflow publishes the relocatable archive and checksum, after which release notes can be completed from the changelog and merged pull requests. - Build
packaging/flatpak/io.github.beamiter.forge.ymlfrom a clean checkout, verify the committed Cargo source manifest, validate desktop/AppStream metadata, and confirm/app/share/forgecontains all shell-integration, workflow, and Notebook assets. Publish the Flatpak bundle together with its SHA-256 file. The raw Cargo binary dynamically links GTK/libadwaita/VTE and must not be described as portable. - Install the produced Flatpak in a clean user account. Run
--version,--doctor --json, VTE and Block launches under Wayland and X11, SSH-agent access, host working-directory/file-tree access, workflow discovery, welcome Notebook, notifications, and the enabled AI provider before publishing. In the AI panel, drag the divider and restart to verify width restoration. Create multiple chats and verify New chat selects a fresh row without clearing the old one; search/select them, confirm automatic titles and Rename, preserve a separate draft and Block context in each, and restart to verify the current selection. Send a request in chat A, switch to or send concurrently in chat B, and verify each background reply reaches only its originating chat. Force a failed send, type a follow-up while a request is pending, invoke Ask selected Block beside an existing draft, and close within the draft debounce; all recoverable text must survive. Archive/unarchive active and inactive chats, confirm Delete requires approval, and delete a busy chat to verify its late reply is discarded. Load a synthetic schema-v1 single-chat snapshot and verify automatic migration to v2 without losing its turns/context. Exercise enough bounded data to confirm the 50-chat/100-turn limits, the collection-wide 8 MiB budget, the 64 KiB metadata reserve, and a visibletruncatedstate after oldest-content compaction. Verify active, non-active, archived, and draft/context secrets are redacted when configured, then confirm--safe-modeand--no-restoreretain their established behavior. Finally verify Enter/Ctrl+Enter send, Shift+Enter adds a line, and fcitx/ibus Enter confirms a candidate without sending. Exercise the Block-bound Shell Agent through edit/approve/reject/result/cancel and turn-limit paths; verify VTE/busy/non-empty prompts are rejected and no generated command executes without per-command approval. - After publishing, verify uninstall/data-retention behavior and mark the changelog comparison links.
The project is licensed under MIT OR Apache-2.0. The crate remains intentionally publish = false; enabling crates.io publication requires a separate release decision.