v0.3.0 — budgeted I/O, honest observation state, confirmed close
v0.3.0 - budgeted I/O, honest observation state, confirmed close
A trust-and-liveness release for the driving loop. What the runtime observed, what it has not read
yet, and what it can confirm are now separate, testable facts.
Headline
- The daemon services the session on its own. A child keeps running and its device queries keep
being answered when no client polls. Measured (POSIX, real pty):ESC[6nanswered 0.169 s after the
child sent it, 61 440 B produced before first contact, 262 144 B completed unprompted. With the
service turn removed, the same fixture stalls at 12 288 B -- the pre-0.3.0 behaviour. - A timeout is not an answer. Every observation carries an
ioblock (local_cut,pending,
read_offset/fed_offset,representation);STABLEnow requires a drained read. Unknown
values arenull, never0. - Close is confirmed or admitted.
close_unconfirmedwithlast_progressis a real answer; a
returned native call is never treated as an exit.
Also in this release
- Short PTY writes raise
IncompleteWritewith the exact prefix instead of reporting success; the
deadline is re-checked before every write,selectfailures keep the receipt, and a device reply
that could not be written is visible asio.pending.reply_error. - Wide-glyph cell-span correctness (
selected.textfor CJK labels), streaming SGR sub-parameter
handling, and a bounded Windows payload for the ConPTY reader.
Platform notes
Windows delivers a ConPTY-composed stream (representation=conpty_reconstructed_utf8,
source_wire_exact=false), so byte counts are not comparable with what a program printed. The Windows
payload cap bounds what this runtime received; it does not bound ConPTY or the child.
Verification
55/55 in python tests/run_all.py; ruff check --select E9,F63,F7,F82 . clean and
mypy --platform linux clean on the CI runner; PyPI artifacts are built from this tag by
.github/workflows/publish.yml.