Skip to content

v0.3.0 — budgeted I/O, honest observation state, confirmed close

Choose a tag to compare

@dwgx dwgx released this 16 Sep 02:06
· 37 commits to main since this release

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[6n answered 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 io block (local_cut, pending,
    read_offset/fed_offset, representation); STABLE now requires a drained read. Unknown
    values are null, never 0.
  • Close is confirmed or admitted. close_unconfirmed with last_progress is a real answer; a
    returned native call is never treated as an exit.

Also in this release

  • Short PTY writes raise IncompleteWrite with the exact prefix instead of reporting success; the
    deadline is re-checked before every write, select failures keep the receipt, and a device reply
    that could not be written is visible as io.pending.reply_error.
  • Wide-glyph cell-span correctness (selected.text for 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.