Skip to content

0.0.25 plan: the two tracks' last release, and the release kit

Status: planned (2026-11-03). 0.0.24 is tagged (release-0.0.24) and publishing; the 0.0.25 versions open in the pull request that records its publication.

Planned on 2026-11-03. 0.0.24 took almost all of the two tracks (34 of the apps track's 36 issues, edition 2024, the signer's GitHub App, the threat model and the call for a community plugin), so the maintainer shortened them: 0.0.25 finishes both, and the release after it is 0.1.0, the API review of stage 3. It belongs to the stage before 0.1.0 in the plan to 1.0.0.

Target: about 7 November 2026. The maintainer aims 1.0.0 at the beginning of December (the 1.0.0 plan's decision 16), which puts 0.1.0 about 14 November and 1.0.0-rc.1 about 19 November. So 0.0.25 takes what is ready in about four days; the rest moves on under decision 1 below.

Decisions

The maintainer's calls:

  1. 0.0.25 is the last release before 0.1.0 (2026-11-03). It closes both tracks; 0.0.26 to 0.0.28 are not planned. Whatever of the tracks is not ready by 0.0.25's release is named in its notes and moves into 0.1.0 or later, rather than holding up the review. Recorded in the 1.0.0 plan as decision 15.
  2. The release runs on release-kit (2026-11-03), at v1.2.0, the version that fixed the review's findings (release-kit #3 to #9). scripts/release_cohort.py and pypi-release.yml retire once it has published a release.
  3. Still waiting, unchanged: lumis 0.17 (rs-rich-lumis's minimum Rust would be 1.95), Memo's illustrations (the maintainer's reference pictures), #791 (a residential network) and #790 (does not reproduce).

What is left of the tracks

Read on main at 9a02fdb1.

  • Cornacai (the design, phase 4): resume (session/load, when the agent offers it) and a session store; sign-in (ACP's authenticate and the agent's auth methods); agent terminals on a PTY instead of pipes; the marketplace's agent kind, for finding and installing agents. PORTING's Cornacai rows are 🟡 for these.
  • intuiTUIve's Textual parity (the audit): the rest of #812's stylesheet properties, and the audit's named gaps: DataTable row labels and cells holding renderables, separators in an option list, and highlighting state carried into a TextArea's view from above it.
  • Windows: rich console's log socket and Noctiluca's control socket are Unix only; both need a named pipe.
  • Track 2: PORTING's intuiTUIve rows still say "wave 2" and "wave 3" for work 0.0.24 shipped; the 0.0.24 issues are still open (#785 to #789, #792, #794, #796 to #798, #800, #804, #812, #821).

Workstreams

1. Release with release-kit (rs-rich-cli, release tooling)

  • release-kit.yml: name_from: rs-rich-cli; every crate of RELEASES.toml, in its order, as a crates.io package; rs-rich on PyPI with tag: "python-v{version}" (the crate tag rs-rich-v0.0.12 already exists) and a maturin artifact per target whose test installs the wheel and imports it.
  • python3 release.py install from release-kit v1.2.0 puts the kit under .github/release-kit/; release.yml keeps this repository's own jobs (cargo-semver-checks, the playground; no job outside the kit's may start with publish) and calls ci.yml with checkout_ref.
  • The record tags the old scripts wrote carry no registry; the kit's tag check needs one. release.py check runs against the existing tags before the switch, and a note in docs/BRANCHING.md says which tags predate it.
  • docs/BRANCHING.md and the release skill describe the kit's commands (tag, gate --verify-only, consume).
  • The maintainer: moves PyPI's trusted publisher to release.yml with the pypi environment.
  • Verified by release.py check and plan in CI, a dry run of tag, and the kit's own tests; the first real use is 0.0.25's release.

2. Cornacai, phase 4 (cornacai, rs-rich-acp, rs-rich-marketplace)

Clean room as before: Toad's source is not read.

  • Resume: session/load when the agent advertises loadSession, and a session store in Cornacai's state directory; a session list to reopen.
  • Sign-in: authenticate with the agent's advertised methods, asked for when a prompt fails for want of it.
  • Agent terminals on a LocalPty behind a setting, falling back to pipes.
  • The marketplace's agent kind: a listing kind for an ACP agent's command, checked like other kinds; Cornacai's agent picker reads it.
  • Replay-transcript tests for each, and Cornacai's tapes updated.

3. The rest of Textual parity (rs-rich-intuituive, core)

  • 812's remaining properties, each with a stylesheet test.

  • DataTable row labels and renderable cells; option-list separators; carried highlighting state for TextArea.
  • The audit's rows move to ✓ as each lands.
  • The fuzz finding of 2026-11-03 (fuzzing): 921 bytes of & nesting selectors and , lists took the parser 12 seconds and 1.4 GB. Fixed on 2026-11-03, ahead of the waves: each nested rule was read once per parent selector and each & replaced by the parent's text, so selectors grew exponentially. Nesting is now at most 32 deep and expansion bounded, with the input as a regression test (fuzzing). This comes first: it stops the four-week fuzz clock of the 1.0 exit criteria until it is fixed.

4. Named pipes on Windows (rs-rich-interact, rs-rich-cli, noctiluca)

  • rs-rich-interact's control socket and rich console gain a named-pipe transport on Windows, with the same private-access rule as the Unix socket (the pipe's security descriptor admits only the current user).
  • The Windows CI job runs their tests.

5. Bookkeeping, and a head start on 0.1.0 (docs, all crates)

  • PORTING's 🟡 rows get their true statuses; the shipped 0.0.24 issues are closed with the release that carried them.
  • #![warn(missing_docs)] on the stable set, with the count per crate recorded, and as many filled as the wave allows: 0.1.0 sets it to deny.
  • An inventory of every foreign type in the stable set's public APIs (from the API snapshots), as the list 0.1.0's public-dependency review works through. No API changes here; the review decides.

6. 0.0.24's publication (docs, versions)

After release-0.0.24 publishes: the publication notes; the 0.0.24 docs pinned to 9a02fdb1 in docs-versions.toml (the tags are on c2d65880, the commit before the release notes merged, and their code is the same); and the 0.0.25 versions opened.

Order of work

The stylesheet fuzz fix goes to main on its own, ahead of the waves: the four-week fuzz clock restarts with the first clean nightly run after it merges, and 1.0.0's date rests on that clock.

  • Wave 0: this plan; then 0.0.24's publication with the versions opened (workstream 6).
  • Wave 1, in parallel worktrees, one integration pull request: workstreams 1 to 5.
  • The release pull request, then the maintainer tags with release-kit: python3 .github/release-kit/scripts/release.py tag.

Every agent commits at milestones (WIP-marked), backs up to claude/next-priority-items-3c5p8e-wip-<name>, and keeps the handoff note current.

Verification

  • Every pull request: cargo fmt --all --check, cargo clippy --all-targets --all-features -- -D warnings, the tests, and CI green, including the browser, Windows and macOS jobs, the tapes and the API and SemVer job.
  • Cornacai: replayed transcripts for resume, sign-in and the PTY terminals; one run with a real agent by hand, noted in the pull request.
  • Named pipes: tests on the Windows job, including one that another user's access is refused where CI can show it.
  • The release: scripts/validate_release.py, goldens regenerated byte for byte from rich 15.0.0, the tapes with a release build, both docs sites, the MSRV checks, and release-kit's check and plan on the release commit.