Skip to content

chore: release v0.13.1 — clippy gate + 6 RFCs + cwd inheritance#109

Merged
subinium merged 15 commits into
mainfrom
release/v0.13.1
Apr 28, 2026
Merged

chore: release v0.13.1 — clippy gate + 6 RFCs + cwd inheritance#109
subinium merged 15 commits into
mainfrom
release/v0.13.1

Conversation

@subinium

@subinium subinium commented Apr 28, 2026

Copy link
Copy Markdown
Owner

Summary

Patch release. Three workstreams:

  1. CI clippy gate restored to strict -D warnings after v0.12.0 had relaxed it for deferred-wiring modules. v0.13.0 wired everything; this restore was promised for v0.12.1 (which we skipped → landed in v0.13.1 instead). Zero clippy warnings on --all-targets.
  2. Split-pane cwd inheritance (OSC 7 cwd intercept — replace procfs polling #75 final acceptance gap). do_split now reads the focused pane's live_cwd() and passes it to the new pane's spawn via a new bootstrap::spawn_pane_in constructor. OSC 7 reported_cwd → procfs → launch-time cwd resolution chain is fully wired.
  3. 6 RFC design docs for the issues filed during v0.13.0 ([RFC] vt100 strategy commitment — fork / replace / upstream #102-[RFC] OSC handler coverage matrix — multi-client semantics + intercept policy #107):

Issues

Closes #102, closes #103, closes #104, closes #105, closes #106, closes #107.

(Issues #75 #76 #77 already closed via verification comments on v0.13.0 retroactive review.)

Test plan

  • cargo test --bins — 397 + 25 pass
  • cargo clippy --all-targets -- -D warnings — zero warnings
  • cargo fmt --check — clean
  • CI green (after commitlint relaxation)
  • Tag v0.13.1, verify GitHub Release publishes

Open questions (deferred to follow-up)

From RFC docs — not blocking the patch release:

  • RFC 0002: publish vt100 fork as vt100-ezpn on crates.io now or wait for first upstream stall? (RFC says wait.)
  • RFC 0005: W1 ≤ 12 MB daemon-idle ceiling — may need tracing-subscriber feature pruning before enforceable.
  • RFC 0006: Persist resolved RGB palette in ThemeStateBlob or just theme name? (RFC recommends name.)

🤖 Generated with Claude Code

subinium and others added 13 commits April 29, 2026 01:44
`do_split` now reads the focused pane's `live_cwd()` (which prefers OSC
7 reported cwd, then procfs, then launch-time cwd) and passes it to the
new pane's spawn. Closes the v0.13.0 acceptance gap noted in #75.

Adds `bootstrap::spawn_pane_in` that takes an optional cwd and delegates
to `Pane::with_full_config`. The original `spawn_pane` keeps its old
signature and forwards with `cwd = None`, so non-split spawn paths
(initial workspace, restart) are untouched.

New-tab cwd inheritance is intentionally not wired in this commit; that
needs a focused-pane lookup before `panes` is moved into the saved tab,
which is a different refactor. Tracked separately if requested.

Tests: existing 397 unit + 25 socket_security tests still pass. Pty-bound
verification of the new pane's actual cwd is deferred to the PTY-on-CI
harness work (per RFC #105).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.12.0 relaxed the clippy gate to `-D warnings -A clippy::all -A
dead_code -A unused_imports -A unused_variables` because deferred-wiring
modules legitimately surfaced lints whose consumer side hadn't landed.
v0.13.0 (#108) wired everything; v0.13.1 restores the strict gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- src/pane.rs, src/terminal_state.rs: replace
  `let mut x = T::default(); x.field = ...` with struct-update
  syntax (`T { field: ..., ..Default::default() }`) — fixes
  clippy::field_reassign_with_default.
- src/hooks.rs: replace `vec![...]` with `[...]` for an iter-only
  test fixture — fixes clippy::useless_vec.

All hits are in `#[cfg(test)]` modules; behaviour unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The benches use `#[path = "../src/*.rs"] mod foo;` to embed real source
modules without dragging in the rest of the binary (per the comment in
`benches/protocol_codec.rs`). Each bench only exercises a narrow slice
of its mounted module, so the rest legitimately surfaces as dead code
and unused imports under the bench's view. Every flagged identifier is
exercised by the lib/bin targets — confirmed by grep before allowing.

- benches/render_hotpaths.rs: extend the existing `#![allow(dead_code)]`
  to also allow `unused_imports` (test modules' `use super::*` flagged
  unused under `--cfg test` without a test harness).
- benches/protocol_codec.rs: add the same crate-level allow.
- benches/rss_proxy.rs: scope `#[allow(dead_code)]` to the
  `PaneFootprint` struct — its fields exist to drive realistic
  allocations (the whole point of an RSS proxy bench), never read back.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The `--all-targets` clippy gate (restored in v0.13.1) flags
`Pane::with_scrollback` as dead in the lib unit because my earlier
do_split fix routed `spawn_pane` through `Pane::with_full_config`
exclusively. The bench-only callsite isn't visible to lib compilation.

`spawn_pane_in` now branches: `Some(cwd)` → `with_full_config`,
`None` → `with_scrollback`. Both constructors stay alive in lib.

No behavioural change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Locks the path RFC 0001 deferred: soft fork (B) + upstream PRs (A) in
parallel, 4-week SLA per blocker before falling back to a per-blocker
shim. Catalogues the nine vt100 0.15 API gaps blocking #68 / #93 /
RFC 0004 with file:line citations.
Retroactive design doc for the IpcCommand enum that shipped in
v0.13.0 (commit 0d0bd80). Captures why option (a) — single channel
with Legacy/Ext variants — beat option (b) Arc<Mutex<ServerState>>
and option (c) actor restructure. Locks the policy for future Ext
additions: append a tag to EXT_CMD_TAGS, no inline handlers.
Splits the per-pane storage model: vt100 keeps the active viewport,
ezpn owns the history-of-scrolled-off rows in a byte-bounded
ScrollbackBuffer with sparse rows and real eviction. Unblocks #68
(byte-budget eviction) and #93 (cell-grid render diff). Sets
concrete numbers: 100 panes × 10K rows ≤ 60 MB target (vs ~240 MB
today), 10 MB single line bounded by byte_budget.
Publishes seven workload ceilings (idle 12 MB, +1 pane 18 MB,
100 panes 60 MB, per-client 256 KiB, per-pane scrollback 32 MiB
default, snapshot save 1.5×) with /proc/self/status sampling, a
new ezpn-bench-memory binary, and a memory-regression CI gate that
fails any PR > 5% over baseline. Linux is canonical; macOS
advisory at 1.25×.
Single schema bump (v3 → v4) covering all four near-term persistence
needs: NamedBufferBlob (#91), ThemeStateBlob (#85), opaque
plugin_state slot (forward-looking), cwd_history (#75). All
additions are Option/HashMap with skip_serializing_if so v3 readers
ignore unknown fields and v4 readers handle missing fields. Bincode
1.3 pin unchanged (v4 is a JSON-level schema event, not a bincode
bump). Locks additive-only policy through v1.0.
Full intercept vs forward decision table across OSC 0/1/2/4/7/8/9/10/
11/12/52/133. Includes per-OSC multi-client semantics and the
intercept policy for state-tracking sequences.

Closes #107.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patch release. See CHANGELOG.md [0.13.1] for the full diff.

Highlights:
- Strict clippy gate restored.
- Split-pane cwd inheritance closes the v0.13.0 #75 acceptance gap.
- 6 RFC design docs (#102-#107) land under docs/rfcs/.
- Issues closing: #75 #76 #77 (retroactive verification) plus #102-#107
  via RFC docs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added area:layout Pane layout area:test Tests and benchmarks area:repo Repo hygiene, .github, docs metadata labels Apr 28, 2026
subinium and others added 2 commits April 29, 2026 01:52
Mirrors the ci.yml restore that landed earlier in this branch. Without
this, release-tag builds would still run with the v0.12.0 relaxation
even though the deferred-wiring modules are wired in v0.13.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous `[2, "always", "lower-case"]` rule rejected any subject
containing a single uppercase character — a problem for technical
subjects that legitimately include type names (Pane), abbreviations
(RFC), or CLI flags (-D).

The new `[2, "never", ["start-case", "pascal-case", "upper-case"]]`
allows lower-case subjects (the historical norm) and embedded
proper nouns where they aid readability, while still blocking
all-uppercase subjects and Title-Case shouting.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@subinium subinium merged commit e3f678e into main Apr 28, 2026
21 checks passed
@subinium subinium deleted the release/v0.13.1 branch April 28, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment