Quirl release checklist
Canonical Quirl project documentation synced from docs/release-checklist.md.
This checklist turns the release requirements into a repeatable Unix release. The checkboxes are a reusable operator template and intentionally reset for a new candidate; they are not the status display for an already published version. Each run applies to one exact candidate commit and artifact. A pass from an older commit is useful history, not release evidence. Linux and macOS are the supported interactive platforms. Windows is explicitly outside this release gate under ADR 0010. The capable-TTY default and retained Reedline fallback are governed by ADR 0012; shared theme behavior is governed by ADR 0013. Rust-native release and downloadable-asset ownership is governed by ADR 0026; the operator procedure is documented separately.
This checklist uses two explicit revisions:
- candidate commit A is the source revision used to build, measure, record, tag, and publish the binary. The version tag and source archives point to A.
- evidence commit B is an optional later documentation-only commit that may record A's measured results or link reviewed release assets. B never replaces, rebuilds, or relabels A. Any code, manifest, generated-contract, dependency, or release-profile change requires a new candidate A and a fresh gate.
v0.3.0 publication record
Quirl 0.3.0 was published on 6 September 2026:
- The nondraft, non-prerelease, immutable v0.3.0 GitHub Release and tag identify candidate commit
dfb43e54320d166ebe195bb5a0255b8aacbb11e5. Publication was verified at2026-09-06T19:34:54Z(release ID383694213). All 15 published asset digests and byte counts, plus the exact release body, matched the reviewed bundle. - Candidate verification, canonical quality gate, all four native packages, downloadable assets, aggregation, publication, and protected Homebrew job succeeded in release run 34054071682, attempt 1. Each exact native executable passed 101 successful automated PTY samples, 404 in total. The 0.3.0 performance record links unchanged reports, executable hashes, runner details, limits, and preserved older failed candidates.
- The release manifest SHA-256 is
583a36d0d4ae5ae85e336d71695480bee2624778a41f7f52ff7bdd3ec2820329; reviewed release notes SHA-256 is3d62a1cb5830c2fb69ef103ae8a984815e42d548fade13585a23ceba0202a379. Exact archive members matched the measured executable bytes on all four targets. Size remained advisory; latency, identity, completeness, retention, and cleanup gates were enforced. - Homebrew tap PR 8 merged as
57a937fe2b674dd29e7475522889f3bc77c88711. The formula on tapmainmatched the audited four published archive URLs and hashes. - The release-dispatched website asset run 34055349465 passed from the released candidate and pushed asset evidence commit
cffebda4b43ad57f18dd3c1e63260ef381c059af. The live version-scoped manifest matched the committed channel. - The fresh terminal recording and capture provenance identify the exact published macOS ARM64 executable, SHA-256
30a6edce509a6220cfb4c505fe0192598d56174336a8720ffd0e2042be1c53d8. VHS captured 71.12 seconds in an isolated real PTY with key input. The provenance records exact package/report/runtime-asset and media identities, automated assertions and sampled visual inspection, and explicitly records no human or physical-terminal QA signoff.
Earlier failed candidates remain documented with their original outcomes. Passing this candidate does not retroactively pass them or establish infrastructure-only causes. These verified artifact and automated-evidence facts do not check the reusable human-review boxes below.
Historical v0.2.0 publication record
Quirl 0.2.0 was published on 5 September 2026:
- The nondraft, immutable
v0.2.0GitHub Release and tag identify candidate commit39589209ff32a0ac61af984aa31e4879edb113dd. All 15 published asset digests and byte counts matched the independently verified release bundle. - Candidate verification, all four native packages, downloadable assets, aggregation, and publication succeeded in release run 33989045593. All four exact native executables passed their enforcing performance gates: 101 successful automated PTY samples per target, 404 in total. The 0.2.0 performance record links the unchanged schema 8 reports, executable hashes, runner details, and measurement limits.
- The composed release run is marked failed because its downstream Homebrew
PR job received an empty private-key input. The standalone
Homebrew run 33990534633
succeeded; tap PR 7
merged as
e6b2880dcac33f825dd36327331a560e62c84511. Its four archive URLs and hashes matched the published manifest. Recovery did not replace any release asset or move the version tag. - The release-dispatched
website asset run 33990164031
admitted the version-scoped channel with the released binary and pushed
asset evidence commit
2981d379f046dbee6ebb56bf6291d27c4aa23616. - The recording prepared for 0.2.0 and its historical capture provenance identify a clean local ARM64 macOS build of the same candidate using the official release profile. Its binary digest differs from the hosted release asset, so the recording is not attributed to the distributed executable. VHS captured 71.2 seconds in a real PTY; the provenance records automated checks and explicitly records no human or physical-terminal QA signoff.
These published artifact and automated-evidence facts do not retroactively check every human-review item in the reusable procedure below.
Historical v0.1.0 publication record
Quirl 0.1.0 was published with the following release record:
- The immutable
v0.1.0GitHub Release was published on 22 August 2026 from candidate commit168f9f2e2f2899f7910ca64831561c8885d9ef24. - Candidate verification,
cargo xtask check, all four native packages, downloadable assets, aggregation, publication, and website-channel bootstrap succeeded in the release run. That composed run is marked failed only because its initial Homebrew job did not complete; the repaired Homebrew run succeeded and the tap pull request merged. - The release operator completed human macOS, Linux, and remote PTY/SSH terminal review. The automated rich-PTY matrix remains supporting evidence rather than a substitute for that review.
- The release shipped the deterministic text demo and recording recipe. At that release, no public real-terminal recording was linked from the project.
- The performance record below measures an older artifact. It remains useful engineering history but is not presented as exact performance evidence for the published 0.1.0 binary.
This publication record states what can be attributed to v0.1.0 without retroactively checking steps for which no durable per-item signoff was stored. The empty checklist below remains the reusable procedure for a new candidate.
Historical exact-candidate performance evidence
Release evidence status — historical. Artifact evidence for measured candidate
23fd5d36907fc816bdafd9aa3c2dcb3afb69feb5and artifact9a893a5f1a0b49d62712f331c88966113d910d94efa9651dc4feffe9fd55b637is historical. Evidence commit14e70939d039d96c195f57452a0e1ec3928194afdocuments that measurement. It is evidence only for that named artifact, not for a later candidate. This historical record does not assert the release-readiness or human-review state of a later candidate.
The exact historical P14 environment, commands, aggregate measurements, and artifact identity remain in the performance record; they must not be copied into a later candidate's evidence. That historical record does not determine the readiness of a later candidate. Complete the automated, named-terminal, remote-PTY, and demo gates below against candidate A; record their exact identity and outcome in the release run or evidence commit B. The automated real-PTY harness is supporting evidence, not a human signoff.
1. Freeze the candidate
-
cargo xtask release planselects the reviewed version from reachable Conventional Commits andcargo xtask release prepareshows the expected idempotent version, changelog, and notes changes without writing them. - The preparation PR was produced from
cargo xtask release prepare --write; curated changelog content remains intact and only real product version sources changed. - The worktree is clean and
mainis synchronized with its release remote. -
Cargo.lock,rust-toolchain.toml, the release profile, version strings, generated SDK, protocol manifest, and user-facing status text describe the candidate being shipped. - Curated external native command KDL has completed provenance, immutable revision, semantic, and license review. No Carapace draft or floating upstream reference is in the release source set; the importer pin identifies one reviewed immutable revision.
- The compiled native catalog is
QCNCschema version 1, names the intended platform facts, and has a recorded byte length and cryptographic checksum for this exact candidate. This artifact is distinct from the mutable local intelligence cache and fromCatalog::builtin()metadata. - The reviewed config descriptor is schema v5, its golden fingerprint matches the candidate, and v0/v1/v2/v3/v4-to-v5 migration tests pass.
- The supported compatibility boundary is unchanged: C0/C1-core is native on Linux/macOS; here-documents, process substitution, loops, functions, conditionals, and dialect control forms are explicit Bash/Zsh islands.
- Deferred and best-effort work is visible in the README and release notes. In particular, do not present native Windows terminal behavior or Wasm execution as supported.
Record the candidate revision before building:
git status --short
QUIRL_CANDIDATE_COMMIT=$(git rev-parse HEAD)
export QUIRL_CANDIDATE_COMMIT
printf 'candidate A: %s\n' "$QUIRL_CANDIDATE_COMMIT"
git log -1 --format='%h %s'2. Run the automated gate
-
cargo xtask checkpasses with the pinned Rust 1.97.1 toolchain. -
cargo xtask release verifyaccepts the clean candidate tuple and rejects a dirty tree, mismatched binary version, or mismatched embedded commit. - The generated Lua SDK has no diff after
cargo xtask sdk. -
cargo xtask catalog fmt --check,cargo xtask catalog check, andcargo xtask catalog buildpass; a second build is byte-identical, and the published image reopens through the hardened reader. - Catalog tests cover schema rejection, all declared byte/count/depth/query bounds, platform filtering, semantic ordering, snapshot/projection tampering, and atomic-publication cleanup. Runtime tests pass without Carapace or network access and preserve builtin/local-discovery fallback when the native artifact is unavailable.
-
cargo xtask rich-pty --check local-completion-discoverypasses with its isolated fake Fish/Zsh providers; warm positive and negative cache tests prove deterministic restart behavior and no host rc, host completion, Carapace, or network dependency. The exact Carapace Bridge and Vincent Breitmoser notices remain present incrates/quirl-process/THIRD_PARTY_NOTICES.md. - Website dependencies were installed with
npm ci --prefix websiteandcargo xtask website-checkpasses. This non-mutating gate checks generated mirror/reference freshness, semantic release-evidence attribution, lint, route type checking, and the production build using the committedwebsite/package-lock.json. - The deterministic product tour passes against the candidate binary.
- The release binary and benchmark harness are built together from the clean candidate.
cargo xtask check
cargo xtask sdk
git diff --exit-code -- docs/quirl.lua
npm ci --prefix website
cargo xtask website-check
scripts/demo.sh target/release/quirl
cargo xtask release-previewThe SDK command intentionally writes a generated file. If it changes, review
and commit the source-of-truth HOST_API change and regenerated output, then
restart this checklist from a clean candidate.
3. Verify the supported terminals
Run this section once on named Linux hardware and once on named macOS hardware. Record the OS version, architecture, terminal name/version, and whether a plain font or a Nerd Font was used. A glyph difference must never change behavior.
- With
ui.surface = "auto", the shell reaches the Ratatui inline frame in a normal capable TTY; context, input, diagnostics, and textual status remain legible across redraw and resize. - The default
tokyo-nighttheme and one Lua-configured custom theme apply the same semantic roles on rich and simple surfaces;NO_COLORsuppresses foreground and background colors for both. -
config webrenders bounded no-JavaScript preview cards for built-in and configured custom themes, and selecting a card updates only the validatedui.themeliteral through the existing backup transaction. - The mode indicator is always visible;
Alt-Qopens the Quirl leader mode and the text labels remain understandable without relying on color. - Tab completion,
Ctrl-R/Uphistory, and theAlt-Qfile, directory, and catalog-action chords are keyboard navigable and return the selected typed value in the rich surface. -
ui.surface = "simple",TERM=dumb, a non-TTY stderr, and terminal height below five rows select the Reedline fallback rather than attempting the Ratatui frame. - A rich foreground native command receives an embedded PTY with working input, resize, redraw, and alternate-screen behavior; Quirl retains the physical terminal and restores its transcript after completion.
- During execution and output drain, transcript and execution status remain visible without an editable next prompt. The input prompt returns only after the command finishes and the editor resumes.
- Shell suspend/resume releases and reconstructs the physical terminal's raw mode, bracketed paste, viewport, and cursor state cleanly.
- On the simple surface,
command &,jobs,fg,Ctrl-Z, andbgshow coherent job state. Rich background jobs and stopped foreground sessions fail with the documented actionable limitation; they are not claimed as supported embedded job control. -
&&,||, redirects, here-strings, bounded command substitution, and pathname expansion execute through the native C1-core graph. - Unsupported process substitution and compound control syntax produce an actionable dialect-island diagnostic.
- An explicit Bash island and Zsh island execute without loading user RC files. If one interpreter is not installed, record it as an optional missing reference runner rather than silently changing dialect.
-
NO_COLOR=1andTERM=dumbproduce legible, control-safe text with ASCII separators and no dependence on patched-font glyphs.NO_COLORretains the rich layout on a capable TTY;TERM=dumbuses the simple fallback. - Live input shows
>in the plain profile and the solid❯in Unicode and Nerd profiles. Path, right-prompt, continuation, and status-bar chrome contain no thin Powerline chevrons; accepted transcript command records use only the solid semantic❯marker. - Mouse dragging can select and copy one range across transcript output, path and Git context, live input, right-side prompt data, panels, and the bottom status bar. The copied text contains no styling controls and respects the 1 MiB selection bound.
- A narrow terminal, a resized terminal, and SSH or a comparable remote PTY remain usable without clipped essential state.
The exact commands and adversarial text-only checks are also recorded in the security and accessibility audit.
The historical P14 candidate's release artifact passed every automated scenario
in cargo xtask rich-pty on actual macOS hardware. That run covered rich
editing, completion, integrated runtime behavior, review regressions, native job
control, noninteractive dialect islands, suspend/resume, fallback selection,
and NO_COLOR. It used a programmatic 120×40 pseudo-terminal, not a named
graphical terminal application. Consequently none of the human, cross-terminal,
resize, remote-PTY, or Linux boxes in this section are checked.
4. Refresh performance evidence
Do not edit measurements by hand or reuse the previous digest. On an idle, named supported machine, compute the candidate binary's SHA-256 independently, then pass that exact digest to the enforcing harness:
if command -v sha256sum >/dev/null 2>&1; then
QUIRL_EXPECTED_SHA256=$(sha256sum target/release/quirl | awk '{print $1}')
else
QUIRL_EXPECTED_SHA256=$(shasum -a 256 target/release/quirl | awk '{print $1}')
fi
export QUIRL_EXPECTED_SHA256
printf 'candidate SHA-256: %s\n' "$QUIRL_EXPECTED_SHA256"
target/release/quirl-bench release \
--quirl target/release/quirl \
--expected-sha256 "$QUIRL_EXPECTED_SHA256" \
--jsoncargo xtask release-gate "$QUIRL_EXPECTED_SHA256" is the concise enforcing form
when the human-readable report is sufficient; it also runs the explicit website
gate and therefore requires the locked website dependencies to be installed.
Use the direct command above to capture canonical JSON evidence.
- The harness accepts the clean revision embedded independently in both
quirlandquirl-bench, their matching source identity, the artifact profile, panic strategy, operating system, architecture, and independent digest. - All enforced PTY latency, first-prompt, explicit caller size, and bounded-history budgets pass, or the release stops with the miss preserved in the record.
- The exact release binary's byte size and independent digest are recorded.
At or below 5 MiB (5,242,880 bytes) is ideal; above 8 MiB (8,388,608 bytes)
records an advisory warning. Investigate growth without a clear user benefit.
There is no default project size ceiling; an explicit
--max-binary-bytesremains enforceable. Missing size or identity evidence still blocks release. See ADR 0036. - Rich-surface draw and edit latency are measured on the selected
candidate;
QUIRL_UI_TIMINGS=1is diagnostic evidence, not a substitute for the enforcing PTY harness. - The release evidence names candidate A's exact revision, artifact digest,
hardware, OS, Rust version, sample counts, results, and limitations. It may be
captured as a release asset first and checked into
docs/benchmarks/release-v1.0.mdlater in evidence commit B. - The performance record and the binary intended for publication describe the same artifact. Any source or release-profile change invalidates the run.
5. Capture the real-terminal demo
The README demo must be a recording of the release binary in a real PTY, never an animation assembled to resemble terminal output. Use a fresh temporary Quirl config/state directory so personal history, paths, repository remotes, usernames, and secrets cannot appear. Set the terminal to 120×32 or another documented fixed size and keep the take short enough to understand without narration.
scripts/demo.tape is the reproducible VHS capture
recipe, while cargo xtask demo is the accessible text-only companion. Record only the
already-built, measured candidate A artifact:
scripts/record-demo.sh target/release/quirl "$QUIRL_EXPECTED_SHA256"The wrapper verifies the digest before launching VHS, requires vhs, ttyd,
ffmpeg, and JetBrainsMono Nerd Font, and uses the same private, disposable
Quirl environment as the text tour. The recipe may automate keystrokes and
timing, but every visible frame must still come from a real invocation of the
candidate binary. A missing recording prerequisite is a preflight failure, not
permission to substitute fabricated terminal output.
The local-search scene installs native command facts using the existing verified
runtime-asset updater, then builds embeddings from the pinned local model. By
default the updater uses the published release manifest. For an unpublished
candidate or offline recording, pass a local manifest containing both required
assets and local file:// URLs as the optional third argument. The text tour
accepts the same manifest through QUIRL_DEMO_ASSET_MANIFEST:
scripts/record-demo.sh target/release/quirl "$QUIRL_EXPECTED_SHA256" /absolute/path/runtime-assets.jsonAI preparation also requires GNU timeout (gtimeout on macOS). Its three setup
phases each have a 120-second limit and two-second termination grace. After real
interactive discovery, the tape runs the private ./prepare-search helper with
one 30-second limit. It first waits for a harmless private PATH executable to
appear in index explain, proving discovery published, then rebuilds the current
index and checks both semantic readiness and actual hybrid retrieval. Failure stops the take; it must not be
replaced with lexical output labeled as semantic search. Suggestions are
candidates for human review, not verified executable plans or evidence that
model rankings are always correct. The recording remains a real PTY capture,
not physical-terminal testing.
Recommended shot list:
- Start the exact release binary and show that
autoselected the inline Ratatui frame with context and textual status. - Type part of a real command, open semantic completion, move once, and close it without hiding the prompt.
- Run a short native byte pipeline and a boolean list.
- Switch to data mode and run a compact structured pipeline whose typed result fits on screen.
- Open the history or file overlay and select an item with the keyboard.
- End on one brief explicit Bash/Zsh island or a helpful unsupported-syntax diagnostic, making the compatibility boundary visible rather than implied.
Before publishing the capture:
- Watch the complete recording at normal speed and inspect individual frames around menus and mode switches.
- Verify that every command and result came from the candidate binary.
- Verify there is no secret, personal path, username, hostname, private repository, or unrelated shell history in the capture.
- Verify the experience remains understandable in the repository's static fallback image or alt text.
- Verify prompt symbols are decorative: a plain-font capture remains readable, and the recording does not tell users a Nerd Font is required.
- Add the reviewed artifact to the README with its capture environment and a nearby link to the text-only product tour.
6. Package and publish
- Return to candidate A and confirm its worktree, revision, artifact digest, and embedded source identity. If A changed, stop and choose a new candidate.
- Native packages were produced by
cargo xtask release packageon the explicitaarch64-apple-darwin,x86_64-apple-darwin,aarch64-unknown-linux-gnu, andx86_64-unknown-linux-gnurunner matrix. - Every native archive contains only
bin/quirl,LICENSE,THIRD_PARTY_NOTICES.md, and the generated target-specificTHIRD_PARTY_LICENSES.txt; packaging accepted the locked dependency inventory and resolved every declared redistribution notice without following links. -
cargo xtask release aggregateaccepted exactly one package for every target and produced the versioned release manifest, SHA-256 file, notes, and provenance from those exact bytes. A second aggregation is byte-identical. - Do not rebuild after measuring. The distributable, terminal recording, checksums, and version tag all identify the already-gated A artifact.
-
cargo xtask assets buildproduced the completion SQLite image and model bundle in separate jobs, andcargo xtask assets manifestrecorded each logical name, per-asset source revision and epoch, format/schema version, exact byte length, SHA-256, content-addressed URL, compatibility requirements, and required license notices. The initial release snapshot sources both assets from A; later website completion generations may have a newer data revision. Neither asset is in a native package. - Asset jobs used only checked-in/public inputs and no source credential.
If a future input requires credentials, its job runs only in the protected
release-assetsenvironment; no pull-request job or log receives them. - Draft release notes with supported platforms, native compatibility scope, reference-shell behavior, known residual risks, and upgrade/migration notes. For 0.2, note that config schema v5 adds bounded project-discovery settings to the existing rich-surface, theme, completion, and prompt contracts. Legacy unversioned v0 and explicit v1/v2/v3/v4 configs migrate deterministically to v5 defaults; unknown future versions fail closed.
- Create the immutable version tag only after every required Linux/macOS
gate above is signed off, using
cargo xtask release tag --expected-tag vVERSION --writeat A. Refuse rather than move a conflicting existing tag. - If desired, create evidence commit B after tagging A. Restrict B to measured records, reviewed demo links, checksums, and release-note evidence; never use B's revision as the artifact source identity.
- Publish the measured artifacts and checksums, then verify a clean install starts and reports A's expected version and source identity. Attach evidence produced after A as release assets or link it from B without rebuilding A.
- Publish the candidate-built completion database, model bundle, notice
sidecar, and
asset-manifest-v2.jsonas immutable GitHub Release assets. The release workflow must then dispatch and wait for the version-scoped website channel transaction. That channel may advance to newer compatible per-asset source revisions, but its complete manifest must be admitted by the exact released binary before publication. Missing assets leave first prompt and core shell use available; corrupt, truncated, incompatible, or unexpected inputs fail without replacing an existing valid generation. - Generate
Formula/quirl.rbdeterministically from the published release manifest, runcargo xtask homebrew check, and open a tap PR with the repository-scoped GitHub App (or documented fine-grained PAT fallback). Never push directly to the tap's default branch. - The Homebrew install and bounded offline test select all four platform
variants by OS/architecture, verify exact hashes, install
quirlplus all three license/notice documents, and do not download the completion database or model. - On each supported platform, verify admitted curated native facts are platform-filtered and that a missing, corrupt, incompatible, unsafe, or wrong-platform native database falls back to Quirl builtins and bounded local discovery without invoking Carapace or delaying terminal startup/shutdown.
- Keep the tag and release immutable. Corrections use a new version rather than replacing a measured artifact in place. Compatible completion-only updates add new content-addressed website bytes and advance only the matching version's bounded manifest; they do not move the tag or alter release assets.
Not release blockers
The following work can improve Quirl later but is not silently attached to this current Unix release gate:
- native Windows terminal handoff, suspension semantics, and Windows hardware validation;
- native implementation of here-documents, process substitution, loops, functions, conditionals, or other Bash/Zsh dialect control forms;
- a Wasm execution engine, remote plugin registry, publisher identity, or signed transparency log;
- exact emulation of Bash/Zsh option state or framework-sized startup files;
- S3 or mirror-backed asset providers beyond the versioned GitHub Release assets and version-scoped website channels; and
- removal of Reedline or replacement of the current simple-terminal fallback.
These are explicit support boundaries. A future project may promote one only with its own implementation, adversarial tests, documentation, and release evidence.