Skip to content

Releases

v0.1.4 — member failures reach the chair

Choose a tag to compare

@polohot polohot released this 10 Sep 16:03

Member failures reach the chair, and the room locks are released

A member that fails no longer goes silent. In an earlier live run a provider content
filter refused one member seven times. The chair saw only "subagent finished" and had no
way to apply the room rule: nudge the member once, then replace it.

The plugin now observes agent/request-error and writes a notice to the chair mailbox
that names the member and the provider message. The third failure inside ten minutes also
wakes the chair, because that is a stuck member rather than one bad request.

Proven live, with a member pointed at a model id that does not exist:

broken: model request failed (400 INVALID_REQUEST The supported API model names are
deepseek-flash, deepseek-v4-pro, but you passed no-such-model-xyz.)

withRoomLock kept one map entry per room and never released it. The entry is now
released once the chain drains, with an identity check so a later task keeps its own.

Everything else that the plugin holds is bounded: registrations and the member index are
released when an agent is disposed or a room closes, the progress timer stops at close,
and the tool-activity map is capped with an age prune. Only the archive grows, and that
is on purpose. It is about 110 KB per closed room.

v0.1.3 — quiet console, silent arming

Choose a tag to compare

@polohot polohot released this 10 Sep 15:56

Quiet console, silent arming

Two fixes found by watching real rooms.

  • The server console is quiet by default. Every mailbox write, task change, and
    progress line printed to the console, about eighty lines for one busy room. Those
    lines now go through trace(), which prints only when the row sets verbose: true.
    The console keeps the boot line, a room opening and closing, a pause or a resume,
    and every failure.
  • Arming prints nothing. The plugin arms the room tools in every root session the
    harness creates. That work is silent, because the count follows the sessions the
    harness restores, not the sessions a user is using, and a number nobody can explain
    reads as a fault.

Arming still happens at session creation. An attempt to arm on the session's first
message was tested and reverted: the request is already assembled by then, so the model
never saw the room tools and fell back to plain subagents. Arming later needs a
pre-assembly hook the platform does not expose today.

v0.1.2 — quiet console, one sender tag, exact totals

Choose a tag to compare

@polohot polohot released this 10 Sep 15:21

Quiet console, one sender tag, exact totals

Three fixes found by running real rooms.

  • The server console is quiet by default. Every mailbox write, task change, and
    progress line printed to the console, about eighty lines for one busy room. Those
    lines now go through trace(), which prints only when the row sets verbose: true.
    The console keeps the boot line, the chair arming, room open and close, pause and
    resume, and every failure.
  • The sender tag appears once. Members write their own [name] tag, and the
    delivery wrapper added a second one, so receivers saw [checker] [checker] ... in 69
    messages of one run. wrap() now returns the body unchanged when it already starts
    with the sender tag.
  • The message totals are exact. runProgress appended progress lines to the chair
    mailbox and never refreshed messageTotals, so a live room recorded 44 against 45
    real entries. The append and the refresh now share one room lock.

Verified live on a four-member room: 149 recorded against 149 real entries, 0 doubled
tags across 52 delivered messages, 0 member turn errors, and 0 new sessions.

v0.1.1 — progress lines without a fork

Choose a tag to compare

@polohot polohot released this 10 Sep 15:21

Progress lines without a fork

The 0.1.0 progress line came from a forked summarizer turn, copied from Claude Code.
Claude Code's summary fork passes skipTranscript: true. The DSH fork provider has no
such option, so every fork became a real session: one catalog row, one log on disk, and
one model call per busy member per tick. A five-minute run created 27 sessions and
1.3 MB of logs, and the lines said nothing useful.

  • The line now names the member's own last completed tool call, read from the platform
    tools/result event. No model call and no session. Example: bear: web_search.
  • A line that reports a long idle time tells the chair that a member may be stuck.
    Example: bull: bash, idle 124s.
  • Room close now marks each active member released, so an archived roster does not
    show a live member inside a closed room.

Proven in a clean-room install from this repository into a fresh profile: 0 new sessions
during a room, and every progress line named a real tool.