v0.1.0
[0.1.0] - 2026-07-17
Added
- Add agent-state hook contract for tmux panes (7dde61a)
- Act-on-preview — approve/interrupt/message panes from the list (a39c3ba)
- Add tmux-native specialist sp-* awareness (6364b4e)
- Recognize interactive role-[-] session names (b6b0453)
- Xtmux multiplexing + agent-state orchestration primitives (8f4d46b)
- Message-send signal, normalization, dead-target error, rotation (xtmux-1hq) (a0f665f)
- Phase 2 Bun/TS scaffold + SQLite adapter + migrations (xtmux-3xs.2) (b6e0ffd)
- Phase 3 delegation — V2 message/log routing + delivery attempts (xtmux-3xs.3) (bd0436e)
- Phase 5 agent instances/transitions/turns + smart-dispatch log-emit (xtmux-3xs.5) (f6663f6)
- Phase 6 handoff lifecycle + prompt-pointer atomicity (xtmux-3xs.6) (78631de)
- Phase 10 — retention + benchmarks + docs + cutover HOLD (xtmux-3xs.10) (7bd5cd5)
- CI, CodeQL, and Dependabot baseline (#2) (fdba7b8)
- Additive --json command API + xtrm v2 skills migration (#6) (fd568db)
- Expose canonical
xtmuxcommand prefix via alias (#9) (589695c) - Real
xtmux help— grouped commands and --json output fields (#11) (ad304ee) - Publish @jaggerxtrm/xtmux installer (#20) (d5cc800)
- Persist host_id and rotate @agent_instance_id per agent occupation (xtmux-j46.1) (#21) (6c7924f)
- Xtmux context --current --json — the Specialists runtime-origin contract (xtmux-j46.2) (#25) (009901a)
- Xtmux topology --json + single-source host id (xtmux-j46.3) (#27) (7a04260)
- Bounded xtmux pane capture --json (xtmux-j46.4) (#29) (5956ba6)
- Cursor-paged journal reads — log query --after-id (xtmux-j46.5) (#31) (cbae0bd)
- Persist outbound wake ownership (#23) (b74185d)
- Log follow --after-id — the committed-event stream (xtmux-j46.6) (#32) (4de5ff0)
- Readiness-aware, idempotent, durable delegation (xtmux-j46.8) (#34) (4003abe)
- Read-only NDJSON bridge over ssh (j46.9 + protocol tests j46.16) (#38) (fad430f)
- Structured activity spans + stabilize the bridge topology test (xtmux-j46.11) (#40) (a02b66b)
Coordination and hooks
- Auto-monitor-on-send — Claude Code hook + pi extension (2a642ac)
- Pi-auto-monitor.ts uses correct isBashToolResult + event shape (f900c28)
- Wake-path completion — wait-for-transition + Claude Stop drain (c70b725)
- XTMUX_AUTO_MONITOR_SKIP_TARGETS env bypass (xtmux-3xs.29) (ae42383)
- Auto-monitor tmux has-session precheck (xtmux-3xs.30) (5f4eb8f)
- List pane reply obligations (9f2eed2)
- Complete Phase 2 picker and retention parity (#43) (8af5b6a)
Fixed
- Split git cache from agent_state — never cache attention sort/badges (xtmux-rib.17) (96c7787)
- Make WAIT orchestrator-safe via PostToolUse reset (d14572b)
- Alt-x kill wedged the picker via a nested fzf (d138131)
- Do not mark active sp-* panes stale in the hot list (e989297)
- Group worktree sessions under their parent repo (845bbca)
- Render specialist sessions as pane rows (6c542c1)
- Add repo headers for specialist pane grouping (4d0bf84)
- Pre-filter events.jsonl with grep before parse loop (xtmux-bje) (8deb7ad)
- P0 telemetry+identity bystander corruption when $TMUX unset (xtmux-3xs.18) (0d2309a)
- V2 message ack takes V1 message-key; audit --stable sort (xtmux-3xs.24, .17) (7ce1eef)
- Shadow-tee sites were checking stale $REPLY after log_event (xtmux-3xs.12) (fc3195e)
- Derive coordination effects from JSON results (#12) (6f20973)
- Make the smoke gate tell the truth, and fix what it was hiding (#13) (e19886b)
- Migrate on the monitor/telemetry/audit path (#15) (c81da80)
- Detect Claude panes that run behind the xt wrapper (#17) (647bcaa)
- Reach the V2 runtime via the vendored-bun launcher on npm installs (xtmux-j46.19) (#26) (41674a7)
- Bind delegated metadata before the lifecycle emits, and keep the V2 feed out of the legacy journal (xtmux-j46.7) (#30) (24ae942)
- Stop mining a bead id out of a temp-dir path (tmp.9) (#36) (9a5a7c4)
- Per-connection request-rate cap; document host-wide capture scope (j46.21, j46.22) (#41) (d7c29ec)
- Restitch requester ownership onto correlated CLI (#42) (f213b9e)
- Preflight undeliverable targets (#49) (026952b)
Messages and delivery
- Phase 3 messages/receipts/deliveries/events domain (xtmux-3xs.3, WIP) (1753539)
- Add status and unread query primitives (53b0c2b)
- Unread-count --pane %N for pane-scoped counts (xtmux-3xs.28) (ff2c489)
- V2 timestamp column matches V1 date -Is byte-for-byte (xtmux-3xs.27) (b056061)
- Add sender-declared reply expectations (b87fb05)
- SQLite reply-obligation model (migration 0010, cycle guard, opt-in correlated projection) — xtmux-3ua.2 (#24) (a45aa05)
Migration
- Phase 9 legacy JSONL importer + shadow-mode substrate (xtmux-3xs.9) (3f90149)
- Reconstruct monitors rows from legacy .tsv (xtmux-3xs.13) (93576ae)
- Reconcile legacy coordination markers (#47) (8e406d4)
Observability runtime
- DB-backed monitors, telemetry, audit domains (3xs.4/.7/.8) (2eb8e2b)
- Pure decision logic for monitors/telemetry/audit domains (3xs.4/.7/.8) (fd8925e)
- Route monitor/telemetry/audit through the V2 runtime (3xs.4/.7/.8) (92e2f15)
- Bun --compile CLI binary + picker prefers it (xtmux-3xs.11) (47f9d31)
- Shadow-mode picker wiring — writes tee, reads diff (xtmux-3xs.12) (abf82f4)
- Slow-query envelope wrapper in openDb (xtmux-3xs.14) (f2bba70)
- PRAGMA optimize on close (xtmux-3xs.15) (b0a43f3)
- Retention CLI subcommand + scheduling docs (xtmux-3xs.16) (4d8e4b4)
- Log-query shadow-diff; audit content-diff declined (xtmux-3xs.25) (71dd2df)
- Flip V2 to default-on — epic cutover (xtmux-3xs.31) (99dc6c6)
Other changes
- Initial import: fzf tmux session/pane picker (perf-optimized)
Two files:
- bin/tmux-session-picker: list/preview/jump/kill, attention ranking,
agent-state inference, git-rich rows, TTL-cached list, scoped preview. - scripts/git-pane-status.sh: per-path git status line (shared with the
tmux status bar); batched rev-parse, worktree-aware stash guard,
caller-supplied toplevel fast path, op detection now functional.
Performance (see docs/perf-audit.md):
- list cold: ~1.0-1.4s -> ~0.65s
- list warm: ~0.65-1.0s -> ~20ms (TTL cache)
- preview: ~300ms -> ~95ms
Output contracts unchanged (status-line script byte-identical on all paths). (a4a6978)
- Eliminate subshell overhead via REPLY pattern (warm list 500ms→122ms) (588dd86)
- Revert "fix: add repo headers for specialist pane grouping"
This reverts commit 4d0bf84. (4e6d715)
- Revert "fix: render specialist sessions as pane rows"
This reverts commit 6c542c1. (c35590c)
- Debounce agent-state writes; drop message_update handler (xtmux-2iv) (e0493d6)
- Xtmux-3xs.4/.7/.8 close via cherry-pick from xt/ojsx (55b652f)
- Bash prefilter cuts auto-monitor no-match cost 40ms→10ms (268c801)
- Help audit + v0.1.0 CHANGELOG/release automation + xtmux monitors human-view (xtmux-r6g.1) (#50)
- docs(readme): add missing commands to CLI reference (xtmux-r6g.1)
Post-3ua audit: help_text already covers every dispatch command, but README
still listed only the pre-j46 orchestrator surface. Add context --current,
topology --json, pane capture, log follow / --after-id, bridge --stdio,
message-cancel / message-status / unread-count, and obligations list to the
Orchestrator/multiplexing block so grep-first users find them there too.
- feat(monitors): xtmux monitors — human-scannable view of the monitor registry (xtmux-r6g.1)
monitor-list already ships an authoritative JSON projection; operators just
needed a way to glance and see who is waiting on whom, how long, and how close
to timeout each row is without piping through jq by hand.
Adds xtmux monitors [--all] [--json]:
- default hides terminal rows; --all shows the full registry
- --json is a straight pass-through of monitor-list --json
- formats one aligned row per monitor: STATE, AGE, TIMEOUT (elapsed/budget),
TARGET (session-name + pane), REQUESTER (session-name + pane), ID - session-name resolution reads tmux list-sessions once, not once per row
- graceful degradation: no jq -> falls back to raw monitor-list; empty
registry or no active monitors -> friendly one-liner instead of a bare header
Test hook --from-json <path> short-circuits the runtime call so the pure
formatter is unit-tested against a synthetic fixture (task said tests only for
the formatter, not the plumbing).
- chore(release): CHANGELOG cut for v0.1.0 + tag-triggered GH release (xtmux-r6g.1)
First tagged release; every merged PR from #2 to #49 is currently under
[Unreleased] and belongs to v0.1.0. Regenerated CHANGELOG.md via
git-cliff --tag v0.1.0 so the block renders as [0.1.0] - 2026-07-17, covering
the runtime-contracts / host_id / bridge / json-api epic (xtmux-j46) and the
SQLite reply-obligation + wake SSOT epic (xtmux-3ua). Version bump: MINOR
(both epics land features).
Release automation:
make changelog [VERSION=v0.1.0]regenerates CHANGELOG.md (Unreleased if no
VERSION; tagged block if set). Reuses the existing xtmux-changelog wrapper.make release VERSION=v0.1.0regenerates under VERSION, commits, tags, and
pushes tag+HEAD. Refuses to run on a dirty tree..github/workflows/release.yml(wasRelease npm package) now also
extracts the tag's CHANGELOG section and callsgh release createso the
GitHub release body matches what git-cliff produced.fetch-depth: 0added
because git-cliff needs full history to render prior sections.docs/RELEASE-CHECKLIST.mddocuments the flow at the top.
- docs(json-api): classify picker:monitors in the classification matrix
Bun test tests/contracts/json-command-matrix.test.ts asserts every picker
dispatcher command has a picker:<name> row in docs/json-command-api.md. The
new monitors alias needed the same. Same class as monitor-list (agent-json;
JSON is a pass-through of monitor-list --json).
- fix(release,monitors): sync package.json in make release; surface monitor-list failures (Codex P1/P2)
P1 — make release now bumps package.json
The previous target only regenerated CHANGELOG and pushed the tag; package.json
stayed pinned at the old version, so the next tag-triggered npm publish would
try to republish a version that already exists and fail after the tag was
already public. Bump via npm version --no-git-tag-version --allow-same-version ${VERSION#v} before the commit so package.json + package-lock.json and the git
tag stay in lockstep. Commit is now chore(release): cut vX.Y.Z (was
docs(changelog)) — it moves more than the changelog now.
P2 — xtmux monitors propagates monitor-list failures
Previously raw="$($self monitor-list --json 2>/dev/null || true)" swallowed
both stderr and exit status; an unreachable backend rendered as
no monitors registered. and exit 0, telling the operator the registry is
empty precisely when it could not be read. Capture stderr, keep the exit code,
and if the command failed, print monitors: monitor-list failed (exit N):
followed by the captured stderr on our own stderr and propagate the exit code.
The --json path uses exec so stdout/stderr/exit propagate unaltered
end-to-end. --from-json on an unreadable path now exits 2 instead of pretending
the registry is empty.
New contract assertion: monitors: unreadable input surfaces a nonzero exit. (4abb71f)
Pi extensions
- Add inbox and deferred reply reminders (6f224ed)
- Scope inbox counts to current pane (c215728)
- Detect reply obligations while idle (b4f93da)
- Inject pending replies into turn context (22bcf10)
- Wake on outbound peer completion (fc4af11)
- Wake on idle reply obligations (b65f9a6)
- Ignore unrelated JSON tool output (#35) (86521e4)
Project maintenance
- Init beads project (issue board for v0.2 epic xtmux-rib) (08488ae)
- Add contract harness for status-line and picker output (0d6c380)
- Close xtmux-rib.1 (ed70771)
- Close xtmux-rib.2 (3ceb3c7)
- Lowercase prose/comments across docs and scripts (0d5a374)
- Lowercase the visual agent-state badges (cf45150)
- Close xtmux-rib.3 (2508520)
- Close xtmux-rib.4 (0126431)
- Refresh README + add tmux keybindings guide (8ffd490)
- Xtrm + gitnexus managed blocks in AGENTS.md/CLAUDE.md (a4e3804)
- Ignore local pi harness artifacts (25224bd)
- Wire xtrm hooks with $CLAUDE_PROJECT_DIR (ef3763e)
- Mark @agent_parent_session as tmux session_id (xtmux-7ob) (85fccf5)
- Document XTMUX_PI_STATE_DEBOUNCE_MS + message_update drop (xtmux-2iv) (175c87d)
- Chore (2bf21a1)
- Phase 1 design brief + V1 golden fixture baseline (xtmux-3xs.1) (b84e110)
- Port domains 4/7/8 onto the Phase 2 scaffold (8743bac)
- V1 golden fixtures for monitor/telemetry/audit + domain 4/7/8 design draft (2543edc)
- DDL for monitors/command_runs/audit_* + fix resolution keying (3e654b5)
- Record the implementation decisions for domains 4/7/8 (ad21e43)
- Align domains 4/7/8 with the Channels canonical vocabulary (549ff16)
- Pane-addressing fix — reader note that discrimination lives in columns not stdout (58de921)
- Add hostile and differential contract oracles (39a01fa)
- Apply 0.10.2 managed assets (27bb881)
- Gitignore .xtrm/statusline-claim (runtime hook write) (e2e97b8)
- Run the json-api gate (build freshness + live tmux smoke) (#7) (5eaeaeb)
- Typecheck Pi extensions against pinned API (#8) (4d6963a)
- Make a missing
pibinary name its own cause (#16) (4341167) - Apply 0.10.4 managed assets — hooks now fail open (#18) (a78a352)
- Apply 0.10.5 managed assets (#19) (32f1806)
- SQLite reply-obligation and outbound-wake state machines (xtmux-3ua.1) (#22) (e5743d4)
- Close the j46.12 gaps — bystander server, store read-only, host-id race (xtmux-j46.12) (#33) (d290915)
- Close the real gaps in the topology/cursor/handoff contracts (j46.13/.14/.15) (#37) (72da1f4)
- Regenerate CHANGELOG for the runtime-contract epic (xtmux-j46.10) (#39) (548de6c)
- Back Claude monitor hooks with SQLite (#44) (8c06f49)
- Move coordination state to SQLite (#45) (5bfdae4)
- Document SQLite reply and wake lifecycle (#46) (c4777db)
- Make contract fixtures TMPDIR-safe (#48) (255a8ce)