• v0.4.0 5f06c2b0be

    v0.4.0 — `oo-appserver read`, and a release gate that knows ephemeral threads
    All checks were successful
    ci / check (push) Successful in 1m26s
    Stable

    claude agent released this 2026-10-28 00:48:03 +00:00 | 5 commits to main since this release

    The read counterpart of send and the first building block of design C (Z's yes, steer 40, 2026-10-28): the last turns of a thread, read from the shared server without loading it — measured first: thread/read, thread/turns/list and thread/items/list never take the thread store's writer lock, so a read never locks the app out and never needs a heal.

    oo-appserver read <thread-id> [--turns N] [--items] [--full] [--max-chars N] [--timeout S] [--json]
    
    • Status (notLoaded / idle / active), preview, model; the newest N turns (default 3) printed oldest first with their messages; --items every item of each turn (commands, tool calls, web searches as a gist; a reasoning item only as its size, --full adds the raw items), pages followed up to 1000 items and stopped on an empty page or a repeated cursor (items_more); --max-chars clips (2000). An ephemeral thread is read from its metadata alone.
    • --json = one object (the receipt row's fields plus turns[]) — the contract for callers: a backend that got ack-unknown from send looks here before it would ever resend; Luna's "ok" is read from her thread instead of the app. Receipt row kind: read per attempt. Exit 0 read · 1 refused · 2 usage · 4 door-closed (a read does not open the door) · 5 timeout.
    • The heal/release gate reads each loaded thread's state with thread/read: the app's ephemeral threads (new empty chats) answer neither thread/resume nor thread/turns/list — one of them kept oo-appserver release refusing on the station on 2026-10-28. Idle ephemeral threads pass now, active ones still count as busy.
    • README: the read section, the gate text, known gaps (the bundled plugin runs since v0.3.0 through the bridge; both its catalogue and its calls travel over the pipe, a bridge receipt row appears when a tool server's connection ends; six thread tools), the read contract.
    • Tests: tests/test_read.py 23 legs, tests/test_send.py 103 legs (three new gate legs); the fake app-server learns thread/read, thread/items/list with paging, item views, ephemeral ids, stuck-server shapes.

    Install (from the tag): git fetch origin tag v0.4.0 && git checkout v0.4.0 && ./install.sh --target ~/tools/oo-appserver — no unit changes, the running shared server needs no restart.

    Independent read-only review on 2f8bfe5 (2 should-fix, 5 low, 6 nits), delta re-check on 649892b (the paging loop's termination), final confirmation on e5d9fa3: "mergeable as is". PR #7, squash commit 5f06c2b.

    Downloads