Changelog¶
Every agentctl release, newest first.
v4.5.195 — 14 October 2026¶
- Schedule a carrier bounce at the job's reply, not N seconds after the decision (#1471)
- Build-tag cron_run_output.go's Linux-only syscalls (#1470)
- Auto-pull a deferred attachment before the turn opens (#1466)
- A venv in a skill broke a claude→pi flip, and the fallback dropped the agent's channel
- Add admin-gated usercron artifact reads (#1467)
- The runtime ladder must not be decided by a stray state dir (Go + python cost producer) (#1464)
- A deferred attachment >~10MB silently hung forever and got dropped (#1465)
- Add per-run usercron output diagnostics
- Wait out a prior job's pending carrier restart before starting
v4.5.194 — 13 October 2026¶
- Dedupe risk-rule generation across a retired/canonical id pair
- Migrate retired IDs before apply planning
- Canonicalize MCP aliases for risk checks
v4.5.193 — 13 October 2026¶
- Rename catalog item to atlassian, add risk gating, flatten tool list
- Migrate to Atlassian's v2 MCP endpoint and scopes
v4.5.192 — 12 October 2026¶
- Defer the host-dial/webview-gateway restart that severs its own job's reply (#1459)
v4.5.191 — 12 October 2026¶
- Single-host fleet never registers its own host_keys: entry (#1457)
v4.5.190 — 12 October 2026¶
- Fleet upgrade help text overclaimed — it does not reconcile (#1456)
v4.5.189 — 12 October 2026¶
- Split stderr from the delivered card in script crons too; pin #1438's fix
v4.5.188 — 12 October 2026¶
- Accept raw and encoded PAT credentials
- Component=shim — record_write, stdin_write, ack_total (claude TXT mode)
- Component=upload — tus_patch, attachment_stage
- Component=shim — record_write, ack_total (pi webview lane)
- Component=gateway — conn_resolve, write_wait, ack_wait
v4.5.187 — 11 October 2026¶
- Make agentAdminTargetHandler/agentAdminTargetAcks race-safe
- Delete the spacer dead code (#1225 wave 2, item 6)
- Seed-empty rows reach the height observer; the history primer re-arms (#1225)
- One (Ts, Ord) boundary for the unread line, at the mark itself
- Emit seed_complete from the local transcript branch too (#1225)
- Stop ckSettleBottom's settle loop defeating itself
- Settle the bottom on a live burst and a chip-row resize (#1225)
- Settle the bottom when the conversation tab comes back (#1225)
v4.5.186 — 10 October 2026¶
- Route the audit read through agentd, read-only (#1442)
- Make test-swappable deadline/client vars race-safe
- Settle the bottom on the two paths that skip ckSeedReveal (#1225)
- Route TIMING instrumentation to stderr, not stdout (#1438)
- Pay a prepended page's real height into scrollTop (#1225)
- A backgrounded transcript tab comes back at the bottom (#1225)
- Place the unread divider by (Ts, Ord), not by arrival order
v4.5.185 — 10 October 2026¶
- Bound the upload-delivery legs and log a failed delivery
- The attachment pull origin is the gateway, not the dial lane
- Allow browser evaluate_script on CLI
- Decided vs undecided — a deny stands, a non-answer doesn't
- Thread the real permission outcome to the gate, not a boolean
- A non-approval no longer tells the model never to retry
- Fix /terminal/ cross-host: locality is converge's env file, not a home dir (#1431)
- Set HOME for host-job workers (#1430)
- A path containing &, < or > no longer double-escapes in a chat link (#1429)
- Link paths written in backticks, and stop ckAbs mangling a tilde path (#1428)
- Retire self-converge: fixtures, illustrative comments and docs
- Resolve required_env secrets through agentd when non-root (#1425)
- Retire self-converge: the CLI path and the ledger fields it fed
- Retire self-converge: packaging + host converge role
v4.5.184 — 09 October 2026¶
- Remove the host-job-cutover planning docs — the work is done and merged
- The host-job catalog count sweep and one dead function from the retirement
- Record a record as sent BEFORE emitting it (#1420)
- Phase 5d — retire the host-operation protocol's target half (#1422)
- Add
host hostjob-ready— the host-job-era readiness probe (#1418 follow-up) (#1423) - The agent-scope managed block, and the docs re-checked against Phase 5c (#1417)
- Phase 5b — retire the agentctl-hostop@ worker template, and install the one that replaced it (#1418)
- The keyed-lock dispatcher scan admits the host-job worker, and five lint/harness defects (#1416)
- Phase 5c — the activity-protocol collector onto host-job, and the transient relay retired (#1415)
- Skill-catalog audit pass 2 — calibrate the floor, unblock what is safe (#1414)
- Phase 6 docs — host jobs, agent administration, and a skill-consistency audit (#1413)
- Phase 5a — retire the host-operation coordinator (2 of 7 brief items blocked, reported not forced) (#1412)
- Phase 4.5.5 — the retirement audit: all three deletion targets are live, nothing is cut (#1411)
- Phase 4.6 —
agentctl fleet apply/fleet upgrade: one host job per host, live per-host status (#1410) - Phase 4.5.6 — cross-host cron listing:
cron list <agent>(#1409) - Phase 4.5.4 — source CLI: agent administration actually crosses a host (#1408)
- Auto-resolve the host for a verb that already names an agent (#1407)
- Phase 4.5.3.5 — chunked body transfer for agent administration (#1406)
- Phase 4.5.3 — agent-admin wire and gateway extension (#1405)
- Phase 4.5.2 — target-side agent-privilege-drop execution (#1401)
- Irreversible-action-gate — retrying a gated call is not evasion (#1404)
- Phase 4.5.1: the agent-administration policy catalog and the AgentGrant credential (#1400)
- AwaitDrain waited for an empty queue, not a finished write (#1396)
- Source CLI, resolver, grant hop and secure input — plus the read-grant seam that made 3 of 4 actions impossible (#1395)
- Widen a too-tight deadline causing a measured 25% flake
- Move HostJobTarget out of internal/daemon, fixing a layering violation I introduced
- Wire the host-job target seam to a real daemon.HostJobTarget
- Phase 3: host-job wire protocol, the /host-job gateway relay, and the fleet-wide notify relay (#1393)
- Phase 2: target-local job authority — store, dispatch, worker, unit (#1394)
- Phase 1: host-job wire contract, 62-verb policy catalog, and the job grant (#1392)
v4.5.183 — 08 October 2026¶
- Slim the irreversible-action-gate down to an actual floor (#1403)
- Move every destructive google-workspace/ms365 tool from ask to block (#1399)
- Install the native package BEFORE rendering the Caddyfile, so a blank gateway host can bootstrap at all (#1398)
- Dearmor the gcloud/azure-cli apt keys, so apt-get update works on a fresh host (#1397)
- Perf+cleanup(cockpit): resume the subagent fold (1.2s → 0.1s), and delete the unreachable --host/SSH transport (#1391)
- Decline to replace a context array the pass did not change (#1390)
- Flag a unit that is active but not enabled (#1389)
- One timing line per hop of the chat path, so latency can be attributed (#1387)
- Report the daemon-reload step AFTER the reload, not before (#1386)
- One cheap read per workspace remote, so a converged apply forks git ZERO times (#1385)
v4.5.182 — 06 October 2026¶
- One batched read per apply, so a converged fleet takes ZERO cron enable forks (#1384)
v4.5.181 — 06 October 2026¶
- Teach the wrapped-tool prune a known atlassian→atlassian-rovo rename (#1383)
- Batch the tier bounce, one try-restart fork for the whole fleet (#1381)
- Oc installer archive path + port-guard host-scope filtering (#1382)
- Batch the host-cron systemctl calls, one fork per phase not one per label (#1380)
v4.5.180 — 06 October 2026¶
- Batch the cron systemctl calls, one fork per agent not one per job (#1379)
- Add websearch, a default skill, for research via the browser MCP (#1378)
v4.5.179 — 06 October 2026¶
- Instrument the per-agent cron loop to split systemctl time from ledger-write time (#1377)
- Prune dangling tool launchers by target shape, on both runtimes (#1376)
- Identity map is case-sensitive, not just whitespace-insensitive (#1375)
v4.5.178 — 06 October 2026¶
- Replace deprecated parser.ParseDir in the shadow-mode AST test (#1374)
- Shadow-mode content-hash payload digest — measure the cutover before taking it (#1373)
- Tell pi agents explicitly to chain codemode scripts, not one-shot them (#1372)
- Render ordered markdown lists and frontmatter (#1371)
- Point every pi agent's codemode guidance at the SDK's own docs (#1370)
- Render apply's progress bar where the terminal actually is (#1369)
- Wire converge's OnStep hook + a live progress bar as the human default (#1368)
- MergeInProgress checks MERGE_HEAD as a file, not a directory (#1367)
- One fleet push per run + parallel converge pre-pass and restart tail (#1366)
- Batch the systemd state reads + add an OnStep progress hook (#1365)
- Add a StepStart event to the progress emitter (#1364)
- Convert the last two single-file chownTree sites to chownLink (#1363)
- Update idempotency test for the native provisioning guards (#1362)
- Native in-process guards for the pi provisioning path's four unconditional forks (#1361)
- The codemode persona section is a managed block, not scaffold-once (#1360)
- Native in-process guards for the claude provisioning, MCP-wiring and hook-merge forks (#1358)
- Gofmt internal/cli/emit.go (#1359)
- Browser-eval also covers the REPL's raw HTTP endpoint and repl.ts directly (#1357)
- Commit the exempt verb's own shard, not the whole dirty tree (#1356)
- Self-healing prune of dangling retired-CLI launcher symlinks (#1355)
- Bundle gcloud, az, and oc CLIs on every host (#1354)
- Browser-eval rule now matches browser-harness-js's real invocation (#1352)
- Retire the stale "CLI tools, not MCPs" section from existing agents' AGENTS.md (#1351)
- Timestamp every progress event + fix silent user-cron reconcile (#1348)
- The dashboard's pi MCP servers panel reads real registrations now (#1349)
- Distinguish routine Git from destructive actions (#1347)
v4.5.177 — 06 October 2026¶
- Drain the host-level defaults.yaml clitools: leg too (#1345)
- Wire the host proxy into native MCP units (#1343)
v4.5.176 — 06 October 2026¶
- Move exa's credential from url query param to x-api-key header (#1340)
v4.5.175 — 05 October 2026¶
- Post-#1279 gate fallout (stale test expectations, subsession hang) (#1338)
--dry-runpreviews the clitools: → tools: ledger migration (#1279) (#1337)- Prune the retired mcptools wrapper tool dirs, gated on the native MCP being live (#1279) (#1335)
- Rebind a rolled-over subsession to its live transcript (#1279) (#1332)
- Allowlist the three channel MCP items in the delivery gate (#1279) (#1331)
- Decommission the vendored telegram plugin (#1279) (Phase 7) (#1330)
- Materialize real sockets for pi agents, one mechanism for both runtimes (#1279) (#1329)
- Count a pi agent's natively-wired MCPs as providers (#1279) (Phase 3b) (#1328)
- Re-key the pi-ai Fast-tier patch to 1.0.3 so PI_SERVICE_TIER applies again (#1319)
- Retire every folded entry on settle, not just the head (#1317)
- Native MCP + codemode in the bridge, with the exposure carve-out (#1279) (Phase 2a) (#1318)
- Surface a codemode script's nested tool calls (#1279) (Phase 2b) (#1316)
- Slack, teams and telegram catalog items (#1279) (#1315)
- TXT-mode Telegram attachments + duplicate-reply dedup (#1314)
- Prune a pi agent's stale clitools against disk, not the ledger (#1279) (#1313)
- Promote the ynab catalog item into the shipped deb (#1312)
- Bump the pi SDK to 1.0.3 and raise the Node pin to its real floor (#1279) (#1311)
- Configure Fast tier and reasoning effort (#1310)
- Let root reach an agent's webview-ws port for
ws write --pull(#1309) - Count a pi agent's subsessions in the history badge (#1308)
- Three defects found wiring native MCP + codemode (#1279) (#1307)
v4.5.174 — 01 October 2026¶
- The generated man page lost its whole command surface (#1305)
- The three pre-existing internal/cli failures in a clean container (#1306)
- A customer's own entity list for --local-js (#1304)
- No cockpit redaction bar for the turn-review pass (#1303)
- Repair cached model permissions (#1302)
- Fail the local-js load when the NER window planner cannot be sized (#1301)
- Make the typing indicator one derived rule, and close its three open edges (#1300)
- Retire the redaction bar on the lane that OPENED it (#1299)
- Strip node_modules with the privilege that created it (#1298)
v4.5.173 — 01 October 2026¶
- Load local-js weights from offline cache (#1297)
v4.5.172 — 01 October 2026¶
- Skip unwritable workspace indexes (#1295)
- One side-log record per string per session, and scope the cockpit's read to the lane (#1296)
- Clickable workspace paths in message text (#1294)
- Pre-wrap every catalog MCP as a pi CLI tool, generated at build time (#1293)
- Reference a workspace file as a chip, not a pasted path (#1292)
v4.5.171 — 30 September 2026¶
- Stop awk's early exit from SIGPIPEing tar in build-pii-weights.sh (#1288)
- Read a pi cron's deliverable at message_end, not off the delta stream (#1287)
v4.5.170 — 30 September 2026¶
- Exit(0) explicitly after the build-time weights fetch (#1286)
v4.5.169 — 30 September 2026¶
- Bundle the local-js ONNX weights in the package instead of fetching them at apply time (#1284)
- Stop passing --omit=optional to the bridge bun install (#1283)
v4.5.168 — 30 September 2026¶
- Resolve the local-js detector by absolute path, not a static relative import (#1281)
v4.5.167 — 30 September 2026¶
- Dashboard_unread_test.sh tracks ckPlaceRow, not a stale pane.appendChild (#1280)
- Pii-filter: add --local-js, an in-process JS/TS detector mode (#1276)
- Resolve 5 pre-existing tsc --noEmit errors in pi/bridge (#1278)
- Binary-safe Frame.DataB64 — stop U+FFFD-corrupting cross-agent binary reads (#1277)
- Resolve a
~/…--file path instead of joining it onto the workspace root (#1274) - Ship ado pre-wrapped as a pi CLI tool in the deb (#1275)
v4.5.166 — 29 September 2026¶
- Restart host-level units still running the pre-upgrade binary (#1273)
- A transcript row lands at its own clock, not at its arrival (#1272)
v4.5.165 — 29 September 2026¶
- Drop raw backticks from a comment inside an unquoted heredoc (#1271)
- A host reports its own health over the root host-dial carrier (#1266)
- The docs changelog page HTML-escapes its bullets (#1265)
- A split-view tile draws its own subagent chips (#1264)
- The tunnel pairing normalizes the hostname it compares (#1262)
- Raise the detector ceiling to 60 s (server deadline 59 s)
- Key a tool result's verdict by (toolCallId, text), not by text
- The admission cap follows the host's roster, an un-vettable string never takes a slot, and the no-retry memory persists with its reason (#1260)
v4.5.164 — 29 September 2026¶
- Report the settled height shellcheck flagged as unused (#1261)
- Log redaction duration alongside the existing timestamp (#1258)
- Secret set re-wraps shards to the full fleet before reporting success (#1257)
- The far end's diagnosis reaches the operator, and the dial back is bounded (#1256)
- An already-wired clitool is a no-op, not a re-wire on every apply (#1255)
- Preserve leading cockpit-context marker position in pi injects (#1253)
v4.5.163 — 29 September 2026¶
- A fleet-message handoff to a pi agent renders ONE bubble, not two (#1252)
- Sync the host proxy before a standalone
agents addprovisions (#1251) - An out-of-band mine can finally stamp the marker it consumed (#1250)
- Let one long string use the pool, without coupling or starving its neighbours (#1246)
- One systemctl show for every sub, not one per sidecar (#1248)
- Seed reveal lands at the true bottom; main-lane seed stops resolving every cron session one at a time (#1247)
v4.5.162 — 28 September 2026¶
- Thread reply_to from the bridge to the cockpit's live frame (#1231)
- 11 transcript scroll/render defects + the regression suite that had none (#1230)
- Resolve every optimistic bubble, not just the newest (#1229)
- Settle every message a steered turn answered; make SocketChannel notices visible (#1228)
- Refuse a positional argument on
statusandclear(#1227)
v4.5.161 — 28 September 2026¶
- 4 cores as the local detector's stated requirement (2x2, CPUQuota=400%) (#1224)
- Steer mid-turn owner messages into the live run, with an ack (#1223)
- A session pool for the detector, and the measurement that keeps it off (#1222)
- Per-session cadence counter in memory-nudge; verify a cron's skill exists before prompting (#1221)
- Batch concurrent detector requests into one forward pass (#1219)
- Key the cadence counter per session, not per agent (#1220)
v4.5.160 — 28 September 2026¶
- Promote the reading trio to default skills — document-intake, doc-to-markdown, pdf-extract (#1218)
- Show a live "redacting…" bar while the PII detector holds a turn (#1217)
- Ship anydoc as a host-global, default-everywhere document reader (#1216)
- Bound the forward pass, not the allocator underneath it (#1215)
- Scope the local detector to hosts that run pi agents (#1214)
v4.5.159 — 27 September 2026¶
- Cap glibc's own arena and trim after every inference (#1213)
- Stamp the PII reveal on the sender's own optimistic bubble (#1212)
v4.5.158 — 27 September 2026¶
- Give tool-call chips the PII reveal, and stop the typing bubble lagging the seed (#1211)
- Bound the local detector's memory arena and its request queue (#1210)
v4.5.157 — 27 September 2026¶
- Push a live fs_event when the PII reveal side-log grows
v4.5.156 — 27 September 2026¶
- Fix the PII guidance pair crashing every turn, and give sessions real identity (#1208)
v4.5.155 — 26 September 2026¶
- Log a side-log record for the model's own reply too (#1207)
v4.5.154 — 26 September 2026¶
- PII reveal toggle ignores the cockpit-context prefix mismatch (#1206)
- Bound the detector fetch with a timeout so a hang can't outlive fail-closed (#1205)
- Force HOME to $STAGE instead of falling back to it (#1204)
- Stop the stale telegram-transport unit on claude→pi flip (#1203)
v4.5.153 — 26 September 2026¶
- Count a flipped agent's migrated history in the dashboard badge (#1202)
v4.5.152 — 26 September 2026¶
- Price gpt-6-luna, surface migrated flip history, resync the pi bridge on apply (#1201)
- Converge agentctl-host-dial.service on every full apply, not only on a re-provision (#1200)
v4.5.151 — 26 September 2026¶
- Scoped
secret setcompares against the literal per-agent value (#1199) - Migrate session transcripts across a runtime flip (#1198)
- Two load-shaped gate flakes found on a clean origin/main run (#1197)
- Close four gaps found flipping a live agent claude→pi (#1196)
v4.5.150 — 26 September 2026¶
- Migrate persona + local skills across a runtime flip (#1195)
v4.5.149 — 26 September 2026¶
- Also stop the claude-only watcher trio on a runtime flip (#1194)
v4.5.148 — 25 September 2026¶
- Seed the local transcript stream from a suffix, not from byte zero (#1193)
v4.5.147 — 25 September 2026¶
- Draw hosts from a live host-dial connection, surface its status (#1192)
- Host-level dial-in: reach a fleet host that has no agents on it (#1190)
- Sync host_proxy: onto the process before shelling out (#1189)
- Symlinked skills invisible to introspection + new fleet defaults never self-heal onto existing agents (#1187)
- Confirm the recipient recorded it before reporting "delivered" (#1188)
- Respect host_proxy: when reconciling apt/dnf repo config (#1186)
v4.5.146 — 21 September 2026¶
- Replace hand-rolled DOM recycling with content-visibility (fixes iOS Safari blank-pane bug) (#1185)
- Pull out unrelated transcript-window/CSS changes accidentally merged via #1183 (#1184)
- Ship verify-claimed-work in the payload, fix dream-cycle's unrunnable aging command (#1183)
- A blank line between list items no longer restarts numbering (#1182)
v4.5.145 — 21 September 2026¶
- Pii-filter: persist the detector verdict cache across session resume (#1180)
v4.5.144 — 19 September 2026¶
- Never install the local detector on an agentless gateway host (#1179)
- Isolate the suite from real agent-host state (#1178)
v4.5.143 — 19 September 2026¶
- Make the OAuth login a first-class provider (#1177)
- Bound --timeout so the inner timeout is always the one that fires (#1176)
- Update fleet-map dot count from five to six
- Show the self-hosted PII filter as a sixth host service (#1174)
- Self-hosted local detector (openai/privacy-filter on ONNX) (#1171)
- Use shared secret for delegated token exchange
- Ship cron-design as a default skill (#1173)
- Repair the two real gate failures the full-gate run found (#1172)
- Skill-existence check + bundled-script hardening (#1170)
- Per-unit OnFailure alert cooldown + user-cron shadow-overlay detection (#1169)
- Per-unit resource ceiling + workspace-script apply-time re-validation (#1168)
- Wrap --script crons for PATH/TMPDIR/timeout/log parity (#1167)
- Sync cron add's registered Usage string with its flags (#1166)
- Validate --script content before installing an unattended timer (#1165)
- Sweep an agent's own ad-hoc crons on
agents remove(#1164) - Diagnose attachment pull upstreams
v4.5.142 — 17 September 2026¶
- Harden the unparseable-2xx sign-out branch; clear wv_refresh_ref on passkey login (#1161)
- Four host timers read "not installed" on every host (#1159)
- Gofmt connections.go/connections_test.go/top_web.go (#1158)
- Size the silent relogin popup so it opens as a popup, not a tab (#1157)
- Validate EnvironmentFile rendering
- Confirm agent-message handoffs
- Support managed provider status checks (#1154)
v4.5.141 — 17 September 2026¶
- Validate EnvironmentFile key names (#1153)
- Reject multiline agent environment secrets (#1152)
- Preserve attachment pull errors (#1151)
v4.5.140 — 17 September 2026¶
- A same-origin 401 is only a sign-out if it reached webview-login (#1148)
- Project declared runtime into agent.env fallback, tighten isPiAgent (#1149)
v4.5.139 — 16 September 2026¶
- Normalize empty MCP client handshake
v4.5.138 — 16 September 2026¶
- Silent inline refresh-token session renewal (#1146)
- Retry the user-apps round-trip once, surface a persistent failure (#1145)
- Support service principals and discovery
- Local skill/subagent supersedes a colliding overlay entry (#1143)
- Flatten the Agents tab + rank Usage/Hours for 500 agents (#1142)
v4.5.137 — 16 September 2026¶
- A session expiring mid-chunk no longer reports a corrupt upload as done (#1141)
- A session expiring mid-upload no longer discards the upload (#1140)
- CkSend's own auth-gone detection now coordinates with silent recovery (#1139)
v4.5.136 — 15 September 2026¶
- Try a silent Entra prompt=none round trip before the visible relogin popup (#1138)
v4.5.135 — 15 September 2026¶
- Avoid Basic challenge for expired cockpit data (#1135)
- Cost_cap_test.sh's TXT-mode injection pattern was stale (#1137)
- Add a Changelog page to docs.agentctl.ch, generated from git (#1136)
v4.5.134 — 14 September 2026¶
- Read-only task-list checkboxes, close-all-tabs, collapse-all-folders (#1134)
- Attach-via-picker silently dropped every file (v4.5.133 regression) (#1133)
v4.5.133 — 14 September 2026¶
- Unify SSE/fetch transport around one 401 reading, add pre-flight auth check (#1132)
- Bundle side-effect JS imports and Python relative/package imports (#1126)
- TestUnitReadsAreProxiedByTarget skips as root, like its four siblings (#1131)
- Stop the bun gate reporting install failures as missing packages (#1130)
- Preload the two node shims and declare the risk it inherits (#1129)
- Pull #1079's copy button and #1120's relogin popup into two dashboard sandboxes (#1128)
- Pull PR #1120's auth-expiry seam into the split/bell sandboxes (#1127)
- Powerbi_mcp_test.sh conforms to the shared check.sh harness (#1125)
- Bundle local script dependencies (#1122)
- "Show tool calls" toggle in a new right-panel settings section (#1123)
- File-type icons in the workspace tree (#1121)
v4.5.132 — 14 September 2026¶
- Oidc session expiry floods the stream console instead of surfacing cleanly (#1120)
- Regenerate a wrapped tool's tool.yaml on catalog env drift (#1119)
v4.5.131 — 14 September 2026¶
- Honor OpenAI-compatible base URLs (#1118)
v4.5.130 — 08 September 2026¶
- Real per-message delivery receipts + a dropped onReady regression (#1116)
- Stop lost-entry debris from piling up across restarts (#1115)
v4.5.129 — 08 September 2026¶
- Close the three gaps PR #1109 left open in pending-turn rehydration (#1114)
- Detect and recover a connection that died without saying so (#1113)
- Cap and back off the ungoverned rate-limit retry loop (#1112)
- Report bridge initialization accurately (#1111)
- Load shared env for cross-agent pi MCP reads
- Confirm an injected turn reached the agent before telling the browser it did (#1109)
- Grant agents access to deployed MCP bridges (#1108)
v4.5.128 — 08 September 2026¶
- One gate for
mcp readandmcp call, self and cross-agent alike (#1107) - Remove the read-only restriction on the mini-app mcpRead plane (#1106)
v4.5.127 — 07 September 2026¶
- 600 s unit bound + the dependency-tree convention (#1105)
- Session-to-session notify, drained on pi's context event (#1104)
- Support confidential OAuth clients
- Tree row for a recursively-removed directory no longer goes stale (#1102)
- Add remote Fabric MCP connector
v4.5.126 — 06 September 2026¶
- Pin the restart button to the far right, drop it from mobile (#1098)
- Agent/path coherence for ws requests + serialize office staging (#1099)
- --resume-own-work, so an agent can recover its own stalled subsession (#1096)
- A discarded frame callback wedged the reveal ticker (#1095)
- Skill_consolidation is blind to already-shared skills (#1097)
- Don't stamp a session as reviewed when the model call fails
v4.5.125 — 04 September 2026¶
- Incremental window scan, turn-review leak, brand-safe color (#1094)
- Surface the provider's terminal error message instead of a generic fallback (#1092)
v4.5.124 — 04 September 2026¶
- One pill vocabulary in the agent panel, and a real delete on skills (#1091)
- Neutral volume bars + close the sticky-tab sliver (#1090)
- Activity-protocol: the cron exclusion never matched a pi transcript (#1089)
v4.5.123 — 03 September 2026¶
- Activity-protocol: two-stage goal/value taxonomy + redesigned dashboard (#1088)
v4.5.122 — 03 September 2026¶
- Hostop_root_read: fix base64-encoded stdout frames being appended raw (#1087)
v4.5.121 — 03 September 2026¶
- Root-only local read relay for connector-less hosts (pure gateway boxes) (#1086)
v4.5.120 — 03 September 2026¶
- Real Source identity for root on host operation run + incremental daily narration (#1085)
v4.5.119 — 03 September 2026¶
- Copy-to-clipboard button beside Reply on every card (#1079)
- Activity-protocol: fixed signing label fallback for zero-agent gateway hosts (#1083)
- Activity-protocol: stagger the gateway's cron 15m after every other host (#1082)
- Activity-protocol: cache already-classified windows, stop re-billing the model hourly (#1081)
v4.5.118 — 03 September 2026¶
- Collect_fleet.py: decouple the credential fallback's base_url and key checks
- Collect.py: fix pi session-file discovery - single-level glob missed nested layouts
v4.5.117 — 03 September 2026¶
- Notification bell's dismiss (×) actually removes the row (#1077)
- Activity-protocol: replace SSH cross-host pull with a new admin-scoped host-op verb
- Collect_fleet.py: run proposals/narrative only on the gateway, not every host
- Activity-protocol: fall back to a local pi agent's own OpenAI-compatible config
- Activity Protocol: richer classifier input, supervisor grant command, green gates
- Activity Protocol: supervisor-gated fleet read connector + cross-host consolidation
- Activity-protocol: per-agent achievements, derived and carried across runs
- Activity-protocol: package the collector as a host cron, config from the ledger
- Embed the fleet-activity dashboard, gated on the supervisor role
- Install the Activity Protocol host cron from the ledger, both ways
- Add Supervisor role field, mirroring Admin
v4.5.116 — 03 September 2026¶
- Make the right agent panel drag-to-resize (#1076)
- Unify passkey rows with the secrets/connections pill+icon pattern (#1075)
v4.5.115 — 02 September 2026¶
- Offer the passkey option under the oidc driver too (#1074)
v4.5.114 — 02 September 2026¶
- Grant each agent read on its own secret shard's key names (#1073)
- Add read-only workspace app seam (#1072)
- Shorten the Claude connection card's display name
v4.5.113 — 02 September 2026¶
- Redesign the secrets panel row layout (#1071)
- Hide the Claude card for agents on a direct credential (#1070)
v4.5.112 — 02 September 2026¶
- Secrets panel — set/delete only, never read (#1068)
- Add a Claude card to the Connections panel (#1066)
- Replace every native alert/confirm/prompt with a styled modal (#1063)
- Pausing a session no longer stops for a confirm() first (#1054)
- Fleet map canvas stops short of the pane, capped at 640px (#1053)
- Refuse symlink swaps in an agent's own home during reconcile (#1050)
- The bell preview cut its second line through the glyphs (#1051)
- The connector's stdin payload reaches agentctl again (#1049)
- Recognize a device that already has a passkey (#1048)
- Upload-file-content could blow ARG_MAX well under Graph's 4MB limit (#1047)
v4.5.111 — 01 September 2026¶
- Notification bell — Clear/See/Hand-to-agent, one footer per card (#1046)
- Make turn-review's model call bill against a durable session (#1045)
v4.5.110 — 01 September 2026¶
- Skip Claude pin hook for Pi usercrons (#1044)
- Scope pi rate-limit detection to errorMessage, not the whole line (#1043)
v4.5.109 — 01 September 2026¶
- Drop the non-Rovo local REST MCP (#1042)
- Resolve two pre-existing red-main issues (test regression + lint) (#1041)
v4.5.108 — 31 August 2026¶
- Don't treat a null window.open() as a confirmed dead login (#1040)
v4.5.107 — 31 August 2026¶
- Add Disconnect to the Connections panel (#1039)
v4.5.106 — 31 August 2026¶
- Wire MS365_MCP_ALLOWED_SCOPES through the server + BOTH login paths (#1038)
v4.5.105 — 31 August 2026¶
- Forward org mode into the broker PKCE helper (#1037)
- Route status read through the op-relay too (#1036)
v4.5.104 — 31 August 2026¶
- Enumerate claude transcripts, not just pi (#1035)
v4.5.103 — 31 August 2026¶
- Wire MS365_MCP_ORG_MODE + gate its Teams/SharePoint tools (#1034)
- Enumerate claude transcripts, not just pi (#1033)
- Convert M365 event times from the mailbox's zone, not the browser's (#1032)
- Connections panel — an agent can hand its owner an OAuth link (#1031)
- Ws write verifies its stdin payload arrived complete (#1030)
v4.5.102 — 31 August 2026¶
- Migrate pre-4.5.101 credential schema, add passkey from panel (#1029)
v4.5.101 — 31 August 2026¶
- Platform-attachment device binding + per-device nudge (#1027)
- Unhide the terminal mini-app and make its marker unconditional (#1026)
v4.5.100 — 31 August 2026¶
- Face ID / Touch ID passkeys, supplementing basic/oidc (#1025)
v4.5.99 — 31 August 2026¶
- Thread --channel webview --user-email through add/reconcile retry (#1024)
v4.5.98 — 31 August 2026¶
- Audio MCP to per_user scope — send_voice_note always fails as shared (#1023)
v4.5.97 — 30 August 2026¶
- Admit read-only Rovo tools to the mcpRead allowlist (#1022)
v4.5.96 — 29 August 2026¶
- IPhone-style mobile app drawer (#1021)
v4.5.95 — 29 August 2026¶
- Identify the Rovo MCP bridge at Cloudflare edge (#1020)
v4.5.94 — 29 August 2026¶
- Retain provider-narrowed OAuth grants
v4.5.93 — 28 August 2026¶
- Detect both patch markers, surface a stuck patch in doctor (#1018)
- Decouple local REST OAuth from Rovo resource (#1017)
v4.5.92 — 28 August 2026¶
- Refresh wrapped MCP guidance
- Guide MCP authentication consistently
- Advertise brokered Atlassian OAuth
v4.5.91 — 28 August 2026¶
- Require explicit loopback OAuth opt-in
v4.5.90 — 27 August 2026¶
- Make browser JavaScript ungated by default
- Prevent autonomous tool-guide overrides
v4.5.89 — 27 August 2026¶
- Repair three independent breaks in the blocking gate (#1011)
- Serialize shared wrapped MCP runtime installs (#1009)
- Grant ordinary agents read access to overlay skills
v4.5.88 — 27 August 2026¶
- Stray backticks broke tool_wrapmcp.go's raw string (#1008)
- Add local Jira and Confluence REST MCP
- Pin the atlassian scope list by parity, not by a fifth hand-written copy (#1006)
- Report MCP authorization status safely
- Preserve wrapped MCP failure diagnostics
v4.5.87 — 27 August 2026¶
- Include callback in PAR authorization URL
v4.5.86 — 27 August 2026¶
- Push authorization requests via PAR, request offline_access (#1000)
- HELD FOR REVIEW — authz: a missing X-User-Email is a refusal, not the "unscoped operator" (#993)
- Validate DCR callback metadata
- Default to runtime=pi, channel=webview (#994)
- Request shared MCP platform scopes
- Gate the FIRST wrap of an MCP to operator scope (#987)
v4.5.85 — 27 August 2026¶
- Omit unavailable Rovo search scope
v4.5.84 — 27 August 2026¶
- Add Rovo cross-product search scope
- Use documented Rovo OAuth scopes
- HELD FOR REVIEW — authz: gate the ungated mutating cockpit routes, and make the login rate limit real (#983)
- Request approved Rovo scope set (#982)
- Known-issues Phase 1+2: nine mechanical fixes (no authz code) (#981)
v4.5.83 — 27 August 2026¶
- PII filter: the cockpit tape-over reveal, and the detector's egress measured (not live-verified) (#980)
- PII redaction at the model-call seam — the provider never sees raw PII (#979)
- Onboarding skill: deepen the goal to "produces an expert user" (#978)
- Request only hosted MCP search scope
- Anchor the picker card to where its trigger WAS, not to a detached node (#976)
v4.5.82 — 26 August 2026¶
- Allow German, English, French and Italian hints
v4.5.81 — 26 August 2026¶
- Gen-manpage's pitch-line anchor survived the README losing its H1 (#974)
v4.5.80 — 26 August 2026¶
- Grant ordinary agents access to overlay tools
- Save a video of ANY size through the OS share sheet (#953)
- Add
catalog add— the write sibling of browse/remove (#952)
v4.5.79 — 26 August 2026¶
- Identify OAuth helper at Cloudflare edge (#951)
v4.5.78 — 26 August 2026¶
- Add broker OAuth MCP (#950)
- A carrier that cannot read a gateway env must not report it uninstalled (#949)
- A gateway-only host's refusal names the real cause (#947)
host operation run's target refusal names the remedy (#948)
v4.5.77 — 26 August 2026¶
- The host-op capability key becomes root-only, and neither signing key is readable through
secret get(#946)
v4.5.76 — 26 August 2026¶
- A host-op capability cannot mint a root shell — the three
host shellverbs leave its vocabulary (#945) - The motion + LOD polish pass — the map opens, moves and answers like a place (#944)
- The cross-host tunnel is gated on the signed grant, and comes off the fleet converge lock (#943)
- The LOCAL case connects through agentd, so a non-root operator gets a shell (#942)
v4.5.75 — 26 August 2026¶
- A finishing background subagent no longer deletes the next queued turn (#941)
- A background subagent no longer splits one reply into N bubbles (#940)
- A cockpit send renders once on every transport, not only the one that carries its id back (#939)
- A gateway-only host serves its own maintenance shell (#938)
- A host with two agents stops flipping in and out of its family (#937)
- A reconnect self-heals a dead backend, without a page reload (#936)
- Admit verified LeanIX inventory reads
- Phase 7 batch 2 — 32 ledger + host-service verbs go durable (17 → 49) (#933)
v4.5.74 — 26 August 2026¶
- The cross-host grant is minted by root, so a non-root operator can open a shell (#934)
- The audit row is written by root, so a non-root caller can open a shell (#932)
- The fleet map draws one fleet as one picture, and stops flapping (#931)
- A shape-mismatched coordinator database is set aside, not refused (#930)
- Dial the socket instead of stat when checking readiness (#929)
- Cron_lock_test.sh goes red whenever the gate crosses midnight (#928)
agents triggerlaunches the cron unit, it does not await it (#927)
v4.5.73 — 25 August 2026¶
- Two gate failures found by the first full run after today's merges
- Status relayed read, cancel-vs-interrupted reconciliation, tombstone sweep (#926)
- The notifications bell is a drawer, and it is the ONLY place system cards render (#925)
- Fleet map: a three-host fleet is three hosts, and a tap reaches the moon (#924)
- Two live failures on the operator maintenance shell (#923)
- Operator-initiated cancellation end to end (#922)
- The script-not-truncated invariant anchors on the LAST <script>, not the first (#921)
v4.5.72 — 25 August 2026¶
- The scoped login boots again — openCockpit no longer reads
ckBellfrom its dead zone (#919) - Exclude the cockpit's SSE routes from the new site-wide encode directive
- Cover the first paint of a scoped login, and make
hiddenmean hidden on the header buttons (#918) - The session card's stop/rename/remove trio collapses to a kebab on touch (#917)
v4.5.71 — 25 August 2026¶
- Host shell client's raw-mode/winsize use golang.org/x/term, not Linux-only ioctls
- Operator maintenance shell: agentctl host shell <host> (root shell, admin-gated, off by default) (#916)
- The keyed per-agent lock, and §4.5's fifteen verbs onto the durable path (#915)
- Fleet app: the map opens the app as "Overview"; the table stays as a tab (#914)
host opbecomeshost operation run, and the old grammar refuses (#913)- Three-fact coordinator health, and a per-check target readiness report (#912)
- Fleet app: a solar-system map of the fleet, and a real restart from it (#910)
- The durable executor runs the child as the target, not as nobody (#907)
- Surface the per-agent always-on channel tier in Agent (#906)
- Surface the hostop coordinator in HostHealth (#905)
- Refuse an empty stdin read instead of blanking the key (#904)
- Surface the web-view gateway in HostHealth (#903)
- The gateway host becomes an ordinary durable target — its connector lives in the coordinator (Phase 4, item 7) (#902)
- The CLI becomes a thin follower — submit, print the id, follow (Phase 4, items 1-3) (#900)
- Re-read the schema version under the write lock, on a DSN that takes it at BEGIN, so two openers of a fresh coordinator database cannot both bootstrap it (#899)
- Retry the WAL conversion, and set busy_timeout before it, so two openers of a fresh coordinator database both survive (#898)
- The cutover — the gateway's real frame relay, and apply leaves the transient path (Phase 4, item 5) (#897)
- Retry the WAL conversion two openers of a fresh database race for (#896)
- The dispatch-grant key provisions itself, root-only, on every host (#894)
- A real executor — apply and host upgrade run for real, into the journal (Phase 4, item 4) (#895)
- Expose native workspace workflows
- The durable read surface — status, logs, and a follower that survives its own death (Phase 3, item 3) (#891)
- Option B's retention window — compress, expire, prune, evict (Phase 3, item 4) (#890)
- The follow protocol — replay from a cursor, and a hole that refuses to be stepped over (Phase 3, item 2) (#889)
- The output journal — the file takes the bytes, SQLite takes the cursor (Phase 3, item 1) (#888)
- The target's reconnect advertisement, and the acknowledgement that makes it stop (Phase 2, dark) (#886)
- Agentd startup reconciliation — what a stranded receipt means, and what it must not be allowed to mean (Phase 2 item 5) (#885)
- The daemon-import counterexample check was scoped to the whole package
- The round-trip worker needs the same lock-path redirect every other test uses
- The GO_SCOPE canary greps the alternation form, not the pre-#876 literal
- The reconcile lock becomes an flock(2), not an in-process mutex (#884)
- The coordinator-signed dispatch grant, its verifier, and the first full round trip (Phase 2, dark) (#878)
- A durable pending-turn queue, so a message to a busy agent survives a refresh (#883)
- Move LeanIX app to IX overlay and remove duplicate base guidance (#882)
- Replace custom LeanIX wrapper with native remote MCP bridge (#881)
- Injectable clock for ckstream/videojobs, plus two flakes found along the way (#880)
- Feat/leanix mcp (#879)
- Scope the coverage step to the Go tier under --changed (#877)
- Name audio/server.py in GO_SCOPE, declare disk-stage tests' free space (#876)
- A notifications bell, independent of the session on screen (#875)
- Update ci.yml
- The cockpit transcript harness runs under bun, not
node --test(#874) - Durable target worker unit, runner and spawn seam (Phase 2, dark) (#871)
- One python interpreter per video suite, not one per assertion (#873)
- Durable target-local receipt store, exactly-once acceptance (Phase 2, dark) (#870)
- Repoint at docs/cli-reference.md + docs/architecture.md
- A ghost #cktiles told 14 JS suites the cockpit was in split view (#865)
- Durable target connection epochs + delivery bookkeeping (Phase 1, dark) (#866)
- The shell tier sizes itself off nproc inside a subsession (#862)
- A real modal for naming and renaming a subsession (#860)
- Four keyboard chords — sidebar, agent panel, new session, composer (#859)
- Durable submission protocol + idempotency (Phase 1, dark) (#857)
- The node cap must not keep a row just because nobody stamped it (#854)
- A sign-out control, and the logout route OIDC never had (#858)
- A streaming reply is not a row to recycle (#856)
- The file tree reconnects on a measurement, not on principle (#855)
- An answered permission card settles instead of vanishing (#853)
- Cap the live SSE streams a cockpit can open (#852)
- Serve the webfonts as files instead of 135 KB of base64 in <head> (#851)
- Three hot paths that did their work once per event (#850)
- The node cap must bind on a tool-heavy session (#849)
- Durable host-operation coordinator service + SQLite store (#845)
- Closing the cockpit closes every stream it opened (#848)
- A sent photo's object URL is freed when its bubble dies (#847)
- The primary pane's stream closes for the life of the split (#844)
- Compress every response the fleet's Caddy serves (#846)
- Identify Pi runtime from its rendered config
- The main-lane tile streams the main lane, not the lane being read (#843)
v4.5.70 — 23 August 2026¶
- Sixteen admin-nameable reads reach the peer they may name (#841)
- Nine ledger/converge writers reach the reconcile lock, and a lint stops waiting behind it (#840)
agentctl logs <agent>reaches root instead of answering from the wrong journal (#839)- The admin agent's own identity reaches nine more management ops (#838)
- Rename a subsession from the CLI and the cockpit (#837)
- A main-lane reply carries a real session id, not "" (#835)
- Finish a foreground subagent on its own tool_result (#834)
- Dream-cycle Pass 5 — entity index with temporal resolution
- One reading of --agent across the daemon gate and the CLI parsers (#832)
v4.5.69 — 22 August 2026¶
- Preserve dream and review evidence in cron runs (#831)
- A brand-new agent's empty rollup is not a failure (#830)
v4.5.68 — 21 August 2026¶
- Serve a real favicon — was missing entirely
v4.5.67 — 21 August 2026¶
- Don't nest the theme <style> inside the base one (#829)
- Host caddy apply/recreate now check for native Caddy first (#828)
- One commit per agent, not one per changed item (#827)
v4.5.66 — 21 August 2026¶
- Support Azure deployment transcription endpoints (#826)
v4.5.65 — 21 August 2026¶
- Support configurable OpenAI-compatible base URL (#825)
- Distinguish loading Pi capability snapshots (#824)
v4.5.64 — 21 August 2026¶
- Import office-pack — 35 skills, properly wired for this fleet (#822)
- Discriminate runtime on $PI_CODING_AGENT_DIR, not a stray dir (#823)
- Gate raw API calls that bypass the wrapped MCP tools (#821)
- Lower the memory-nudge interval to 6 turns — more frequent, not less
- Skillify — the meta-skill, default-on, and the dream-cycle points at it (#818)
- Live in-session nudge to write memory/knowledge-base proactively
- Verify the architecture-review HTML report in-browser before sending
- Adapt the vendored architecture-review skills to this platform
- Vendor mattpocock/skills' architecture-review skill set
- A streamed reply's grace-window sweep no longer blanks it (#817)
- A deferred attachment survives a gateway restart (#815)
- Edge-swipe/back gesture opens the drawer when nothing is open
- Don't bounce webview-dial out from under a live terminal/browser tunnel
- Office file preview iframe now fills its pane (#813)
- Make cache patch idempotent
- Unify broker and MCP token cache format
- Extend reply/quote to every card, not just chat turns (#811)
- Patch pi shared runtime during staging
v4.5.63 — 20 August 2026¶
- Widen HostOpAllowed to every PrivilegedRead; add agents status
- Auto-reconnect + durable log for apply/host upgrade
- Make
apply logsreachable through host op, correctly authorized - Merge package and overlay extensions
- Patch existing staged clients during resync
- Host_op relay timeout resets per frame instead of firing once (#804)
v4.5.62 — 20 August 2026¶
- Cron-note cache actually caches for pi agents (#803)
- Stop reporting a pi agent's claude login as "absent" (#802)
- Subagent-timeline lookup resolves a pi session's own transcript (#801)
- Grep works for pi agents (pi-runtime parity) (#796)
- Reply/quote a past message with session-aware context (#800)
- Staging index lives under the agent's own runtime state dir (#799)
- User-authored cockpit mini-apps work for pi agents (#798)
- Agentctl mem is pi-runtime aware, like its skills sibling (#797)
- Close two authz gaps found auditing authz.go for #794 (#795)
- Detect the real "session limit" wording, and stop failing the unit on it (#793)
- Wire live skill reload instead of requiring a full restart (#790)
- Unify pi agents' attachment inbox to ~/.pi/agent/inbox (#788)
- Runtime-aware ws mkdir and ws inbox path resolution (#786)
- Recognize self-authored (non-symlinked) pi skills in the dashboard (#785)
- Upgrade runtime and isolate model sessions
- Runtime-aware skills verb, prune, and persona/zk-config rendering (#787)
- Converge staged extensions before fingerprint skip
- Treat the main lane's own compaction rollover as live, not as a subagent (#784)
- Revert "feat(ms365): package email composition guidance" (#782)
- Stop must not blank a live preview before its durable copy lands (#783)
- Package email composition guidance
- Safely load multiline environment files
v4.5.61 — 19 August 2026¶
- Declare a gateway host's public domain; route /api/messages to the teams gateway (#779)
- Green the three red gates on main (gofmt, round-trip test, errcheck) (#778)
- The client secret is optional, not required (#777)
v4.5.60 — 19 August 2026¶
- Patch confidential client after install
- Render client secret for MCP runtime
v4.5.59 — 19 August 2026¶
- Preserve JSON params in generated wrappers
v4.5.58 — 19 August 2026¶
- Repair missing Pi clitool launchers
v4.5.57 — 19 August 2026¶
- Correct sessinspect.go's internal/paths import path (#776)
v4.5.56 — 19 August 2026¶
- Dark-mode palette + toggle for the scoped cockpit (#775)
- Enumerate Pi subsessions and cron runs
v4.5.55 — 19 August 2026¶
- Persist per-agent cache paths and wrapper defaults
v4.5.54 — 19 August 2026¶
- Support confidential client secret in PKCE flow
v4.5.53 — 19 August 2026¶
- Avoid duplicate code JSON field
v4.5.52 — 19 August 2026¶
- Auto-configure the Cloudsmith apt/dnf repo before install (#774)
- Trace decoded dial frames
- Auto-migrate gateway hosts from Docker Caddy to native, via apply (#773)
v4.5.51 — 19 August 2026¶
- Trace websocket callback delivery
v4.5.50 — 19 August 2026¶
- Trace PKCE code lengths across relay
- Hide auto-approved permission audit cards
v4.5.49 — 19 August 2026¶
- Add redacted PKCE exchange diagnostics
- Hide settled permissions during transcript replay
v4.5.48 — 19 August 2026¶
- Honor host proxy settings during PKCE exchange
v4.5.47 — 19 August 2026¶
- Relay OAuth callbacks across webview gateway
v4.5.46 — 19 August 2026¶
- Deny an unprovisioned principal with a real 403, not an empty shell (#770)
- HostChangeset.Empty() excludes the always-on tmpfiles repair (#768)
- Render Pi session waterfalls
- Ms365: auth-code+PKCE broker login for Conditional Access hosts (inventx) (#767)
v4.5.45 — 19 August 2026¶
- Stop pi permission-journal test from writing the real journal (#766)
- Configure persistent Chrome proxy from host_proxy
v4.5.44 — 19 August 2026¶
- Route primary webview through local dial
v4.5.43 — 19 August 2026¶
- Remove duplicate terminal tunnel error argument
- Trace webview tunnel delivery and dial-back
- Avoid logging tunnel token prefixes
- Add tunnel lifecycle diagnostics
- Allow time for remote shell startup
- Honor custom provider endpoints
- Add explicit Caddy recreation for log persistence
- Recreate volatile agentctl runtime locks
v4.5.42 — 19 August 2026¶
- Recreate volatile agentctl runtime locks
v4.5.41 — 19 August 2026¶
- The claude credential broker must not run for pi agents (#760)
v4.5.40 — 19 August 2026¶
- Declare + enable agentctl-webview-dial@ for pi agents (#759)
v4.5.39 — 18 August 2026¶
- Terminal status / browser status — read-only /terminal/enter, /browser/enter diagnostics (#758)
- Live SSE/WS connection-lifecycle counters +
host stream-stats(#757) - Propagate X-Request-Id across the proxy hop (#756)
- Host caddy apply bootstraps a fresh Caddy on a gateway host with none running (#755)
v4.5.38 — 18 August 2026¶
- Host caddy apply — structured JSON access logs + request-ID propagation (#754)
- Gateway diagnostics — http-probe, sockets, gateway-snapshot (#753)
v4.5.37 — 18 August 2026¶
- Authorize
host op gatewayby uid, not by a name that can't exist (#752)
v4.5.36 — 18 August 2026¶
- Defer the agentd postinst restart off the process tree it runs inside
v4.5.35 — 18 August 2026¶
- Retry bun install from clean node_modules on EEXIST (#751)
v4.5.34 — 18 August 2026¶
- Check the package repository before invoking the package manager on the opportunistic self-upgrade path
- Gofmt internal/ledger/ledger.go
v4.5.33 — 18 August 2026¶
- Recover uncommitted desired-version writeback
- Retry fleet writeback on self-converge
- Keep desired-version rollout independent of self-upgrade switch
- Add ledger switch for unattended package upgrades
v4.5.32 — 18 August 2026¶
- Restart gateway caddy after package upgrades
- Restart agent transport bridges after upgrades
v4.5.31 — 18 August 2026¶
- Restart webview services after package upgrades
- Stop reporting subagents whose own transcript went quiet (#746)
- Exempt more self-scoped verbs from the fleet FIFO lock (#745)
- Restart agentd after package upgrades
- Exempt attachment fetch from the fleet FIFO lock (#743)
v4.5.30 — 18 August 2026¶
- Isolate pi subsession ingress sockets (#742)
- Stop cross-host reads and docker from riding the FIFO converge lock (#741)
v4.5.29 — 18 August 2026¶
- Allow admin agents to set a target host's outbound proxy (#740)
- A 1-pixel outline is a hairline, not the whole frame height (#739)
v4.5.28 — 18 August 2026¶
- Surface provider errors during login
- Agent-message ENGAGE reads the card cross-host, over the op-relay (#736)
- Add cross-host fleet admin host operations (#737)
- Pause icon/label on subsession stop action (#735)
- A work/ subdirectory is created group-unwritable (#734)
- Pin PI_EVENTS_SOCK so a pi sub owns its ingress (#inventx) (#733)
- A retired stream preview must not come back from the dead (#732)
- Cap agents.slice memory — it was the one slice with none (#731)
v4.5.27 — 18 August 2026¶
- Resolve shared placeholders in wrapped MCP commands (#730)
- Skip the overlay ACL grant for an admin with no account on this host (#729)
v4.5.26 — 18 August 2026¶
- Apply the host proxy before the hourly desired-version step shells out (#728)
- Check the discarded Write return in the PWA-bypass test upstream (#727)
- Apply the host proxy before
host upgradeshells out; self-heal secret env ownership (#726)
v4.5.25 — 18 August 2026¶
- Serve PWA manifest/icons unauthenticated (#725)
- Agent-to-agent messaging, cross-host — and close the attachment owner-scoping hole (#724)
v4.5.24 — 17 August 2026¶
- Three stale-assertion/lint failures that redden ci-local on main (#722)
- OIDC state cookie carries SameSite=Lax like every sibling cookie (#723)
- Read the video job doc when agentctl-video-ingest@ fails (#721)
- Self-heal bun installs, force dnf metadata refresh, drop the self-update stub (#720)
v4.5.23 — 17 August 2026¶
- Force-refresh the default PWA icon via a path change, not just ?v= (#719)
- Give a precise reason for 0 MCP sockets on a pi-only host (#718)
- Stop false-flagging pi agents as unhealthy (#717)
- Imap_catalog_test asserts the pre-#708 exec line (#716)
v4.5.22 — 17 August 2026¶
- Admin-agent incident response, package rollout, docker access (#715)
- The mini-app action plane reads the risk catalog, not a third list (#714)
- Per-tool risk declared in mcp.yaml, generating pi + claude policy (#713)
v4.5.21 — 17 August 2026¶
- Login helper respects the proxy and finds a pi agent's shared install (#712)
v4.5.20 — 17 August 2026¶
- Wrapped MCP {dir} resolves to the shared staged install, not the raw catalog dir (#711)
- A stream frame with no text must not render an empty bubble (#710)
v4.5.19 — 17 August 2026¶
- Wrapped MCP cli.sh re-derives MCP_CMD from the current catalog (#709)
v4.5.18 — 17 August 2026¶
- Make every node/bun MCP's outbound fetch honor HTTP_PROXY/NO_PROXY (#708)
v4.5.17 — 17 August 2026¶
- Render this host's proxy config into every agent's own env (#707)
v4.5.16 — 17 August 2026¶
- Apply fresh proxy env before bootstrapping the bridge, not after (#706)
v4.5.15 — 17 August 2026¶
- Force a C locale for every setfacl the overlay grant spawns (#705)
v4.5.14 — 17 August 2026¶
- Sync process proxy env before any provisioning subprocess runs (#704)
- Correct REPO_ROOT depth for installed payload layout (#703)
v4.5.13 — 17 August 2026¶
- Make cron runs respect PI_BASE_URL (#702)
v4.5.12 — 17 August 2026¶
- Auto-provision a SOCKS5->HTTP bridge when host_proxy needs one (#701)
v4.5.11 — 17 August 2026¶
- Declarative NO_PROXY exclusions on top of host_proxy (host_no_proxy:) (#700)
- Don't reap agents.slice-supervised processes as orphans (#699)
v4.5.10 — 14 August 2026¶
- Outbound-proxy support for locked-down hosts (forwarding + declarative host_proxy:) (#698)
v4.5.9 — 14 August 2026¶
- --git must adopt origin, not silently no-op a missing remote (#697)
v4.5.8 — 14 August 2026¶
- Zero declared agents is not a failure, it's an idempotent no-op (#696)
v4.5.7 — 14 August 2026¶
- --git must register the joining host, not defer it to apply (#695)
- Self-register the host BEFORE the no-agents guard (#694)
- A large file's save could still write 0 bytes, and the save that did it hung forever (#693)
- A folder drop leaves a stuck outline and collapses the tree (#692)
v4.5.6 — 13 August 2026¶
- Release.yml never builds the kasmvnc/openbox rpms before the yum repo step
- Agents set channel/runtime now reconciles immediately (#688)
- Agentctl-webview-dial@ never worked for pi-runtime agents (#687)
- Fully automatic provisioning — EPEL, Chrome, kasmvnc + openbox
- Full GitHub/GitLab/ADO breadth + a tracked-repos list (#689)
- CostCapUSD blank in the cockpit for an agent that declares one (#686)
- Give dnf clients a way to authenticate to the rpm repo (#685)
v4.5.5 — 13 August 2026¶
- Ship a signed .rpm + yum/dnf repo for RHEL 10
- Git-explorer Local tab showed 0 branches/commits/worktrees (#683)
- Stop ws publish workspace walk from burning CPU on teams/webview agents (#682)
v4.5.4 — 13 August 2026¶
- Terminal — the cross-host path #678 deferred
- Host set + self-hosted brand font (webview_font_data)
- Terminal — an on-demand admin shell, framed in the cockpit
- Unread dot on the session list + a "new" divider in the transcript (#677)
- Git-explorer — one cockpit surface over the four forge MCPs (#676)
- Route
attachment fetchthrough agentd like inject/notify (#675) - Ship git/github/gitlab/ado catalog + action-plane allowlist (#674)
v4.5.3 — 13 August 2026¶
- Catch synchronous throw on a dead websocket send (#672)
- Stop the informative soft-cap close from double-posting the real final (#673)
v4.5.2 — 13 August 2026¶
- Ship real HAR-capture scripts, adapted to one always-on Chrome (#671)
- Notify the owner directly when subsession start/resume is refused (#670)
- Reset the spend cap at local midnight, not the full rollup window (#669)
v4.5.1 — 13 August 2026¶
- Surface cost_cap_usd in the Agents + Usage tabs (#668)
- Resolve the parent's channel env from EnvironmentFile= too, not only Environment=
- A re-add wired the collapsed clitools DELTA, dropping every channel default (browser, zk) (#666)
- Pi native clitools excluded from cockpit app activation (#665)
- Root steering file is AGENTS.md on pi, not always CLAUDE.md
- Scaffold the workspace and make housekeeper/dream-cycle runtime-aware
v4.5.0 — 13 August 2026¶
- Footnote GPT-5.6 Sol's long-context surcharge (#663)
- Bill GPT-5.6's long-context tier past 272K prompt tokens (#662)
- Recover from renames and atomic saves via op:"relist" (#661)
- Sweep the fleet for a bare admin
usage, and read the target behind a leading flag (#660) - Resolve a finished subagent's chip without a reload (#659)
- Count and classify pi cron spend (#658)
- Skip stray subdirectories when resolving host cron descriptors (#655)
- Split connectors into self-serve login vs needs-an-administrator
- Count pi subsession spend in both cost scanners (#652)
- Surface a permission-denied transcript read, and route usage through agentd for admin scope (#651)
- Drop pi's synthetic tool-status lines from the stream preview (#650)
- Handle a missing connector live, mid-task, not just as a taught stage
- Full rework — an evolution arc, real vocabulary earned not given (#649)
- Price the fleet's non-Anthropic models instead of guessing opus (#648)
- Optional per-agent cost_cap_usd at all three choke points (#647)
- Per-agent custom endpoint for the pi runtime (#646)
- Resolve a pi agent's wired MCPs at the agent's own uid
- Per-agent custom Anthropic endpoint (generic gateway + Azure Foundry) (#644)
- Count subagent sidecars + pi agents in the cost rollup (#643)
- Recognize the runtime's reworded SendMessage revival text
- The view switcher listed ended/stopped subsessions too (#641)
- Drop vestigial pending.call field in transcriptCalls
- The view switcher's main-session dot was always grey (#639)
- Wire Artifactory package mirrors (apt/npm/pip/Go) as Reconcile step 0
- Add a + New subsession button to the sidebar sessions header (#637)
v4.4.0 — 12 August 2026¶
- Make grammy optional for a non-telegram pi agent (#633)
- Ship the session inspector as an embedded app (#636)
- The file editor could save an open file to 0 bytes (#635)
- Session inspector — session list + per-session tool-call waterfall (#634)
- Auth-broker: generalize the callback to any OAuth provider (#632)
- Make ci-local.sh green on main again — four independent gate defects (#631)
- Make catalog list table scan the repo overlay (#630)
- Provision a webview-only pi agent (agents add --channel webview) (#629)
v4.3.16 — 12 August 2026¶
- Close four claude/pi runtime-parity gaps (deferred attachments, attachment_fetch, telegram media, app activation) (#625)
- Restart your own agent from the web-view (#627)
- Hold a screen wake lock while a voice note is recording (#626)
- Stop the send button blocking every session during an upload (#624)
v4.3.15 — 11 August 2026¶
- Self-host Geist/Geist Mono/Inter instead of live Google Fonts (#623)
- Record voice notes with tap-to-start/tap-to-stop, not a hold gesture (#620)
- Mcp wired / agents status lie about cross-agent MCP state
- Find a transcript in whatever project bucket it relocated to (#618)
- Emit attachment_file_id on the TXT-mode channel header (#619)
- Download files directly on desktop instead of opening a share sheet (#615)
- Fleet app: add Artificial Analysis Intelligence Index to model comparison (#614)
- Admin-scope cross-agent
ws ls/ws catvia the read proxy (#613) - Stop workspace uploads landing under a doubled root (#612)
- View switcher, split-active-only, resume-drop-in, refresh button (#611)
v4.3.14 — 11 August 2026¶
- Cap how long any one browser-tool call can hang the shared mutex (#610)
- Pin the session pill's chevron to its own trailing edge (#609)
- Actually stub agentctl in cron_lock_test.sh — the #606 fix never ran (#608)
- Widen the long-pass timeout to absorb residual host contention (#607)
- Stop cron_lock_test.sh's notify leak, and widen video_audio_bed_test.sh's dB tolerance (#606)
v4.3.13 — 10 August 2026¶
- Chown mkdir's ancestor dirs, add recursive folder delete (#604)
v4.3.12 — 10 August 2026¶
- A TXT-mode agent can now complete a deferred attachment pull (#603)
- Sessions in the picker and sidebar now order by last used (#602)
- A recut moves the stated camera spans that were pinned to the boundary it moved (#601)
- The full cut covers every take when the cameras never rolled together (#598)
- The app-context chip gets its own row on the thumb band (#599)
- An overlay sequence that flips pixel format encodes on the GPU, and a render keeps its own hwaccel (#597)
- Video-editing skill: two-tier sampling for placing cut boundaries on fast motion (#596)
- A cut range may play at a multiple of real time (#595)
- HTML document previews grew a second (outer) scrollbar (#593)
- Resuming a session now has a loading state (#594)
v4.3.11 — 10 August 2026¶
- The browser window follows the framebuffer again after a resize_page (#592)
- Drop the superseded "back to chat" tab from the strip (#589)
- The Usage pane shows the rate that decides the cost, and drops the table that did not (#588)
- A score is laid into the cut, not seeked at every shot boundary (#590)
- A short cut's members that share a range start no longer swap cameras (#587)
- A resumed stream preview that is only a TAIL now retires with its durable copy (#591)
- App-context chip sits left of the sheet toggles on the thumb band (#585)
- A runtime switch stops the OTHER runtime's unit and removes its drop-in (#586)
- The sidebar session row's ⋯ opens a small menu, not the composer picker (#584)
v4.3.10 — 10 August 2026¶
- A file over the share cap saves through a new tab, not a dead anchor (#583)
v4.3.9 — 10 August 2026¶
- GPU hw_frames_ctx crash + short-cut camera-plan inheritance (#582)
- Tolerate text-keyed caption words, don't crash on ingest/capture/merge (#581)
- Cost transparency — real rates, model comparison, fix stale pricing (#580)
- The workspace tree re-syncs on foreground return (#579)
- Exempt systemd --user managers from the orphan rule (#578)
- Add first-party IMAP/SMTP MCP + wire mail mini-app (#577)
v4.3.8 — 08 August 2026¶
- The thumb band's right-align had two bugs, and neither showed up in the CSS (#575)
v4.3.7 — 08 August 2026¶
- A comment without its
//took every agent on agentvm down (#574)
v4.3.6 — 08 August 2026¶
- A fresh session could not reach its own history (#573)
- The Sonnet default never reached the runtime, and the test I wrote proved nothing (#572)
v4.3.5 — 08 August 2026¶
- Sonnet is the default, and two Opus lanes are what make that safe (#571)
v4.3.4 — 08 August 2026¶
- The conversation is the floor — a way back to it, and a destination on the composer (#570)
v4.3.3 — 08 August 2026¶
- An agent-less host is not a fleet-usage failure (#566)
- The window measured recurrence against the sessions that recur by definition (#569)
- The main lane's dot in the session picker was grey whatever the agent did (#568)
- The SessionStart continuity block named a six-day-old session, then vouched for it (#567)
v4.3.2 — 08 August 2026¶
- One session control in the header, file-only tab strip (#564)
- Serialise the long nightly passes, cap their memory, protect the alerter (#565)
v4.3.1 — 07 August 2026¶
- Fade the leading edge of a streaming reply in (#563)
- Give the phone back two bands of chrome above and below a mini-app (#562)
v4.3.0 — 07 August 2026¶
- Clear the two audit violations every mini-app carried in its error state (#561)
- The pinned strip is not a phone control — the drawer is (#560)
- Filter either data tab to one agent, and stop the cache lying on reload (#559)
v4.2.0 — 07 August 2026¶
- The usage rollup ships as a default host cron, on every host (#558)
- Active hours are the hours a HUMAN drove, against an 8.4h day (#555)
- A guided walk-through skill, and composer prompts with breadth (#557)
- One control per file-tree row, and a folder can be deleted (#550)
- The cockpit's absolute path spelling resolved a symlink as a broken link (#552)
- The phone app strip gets its daylight, its touch targets and its scroll (#551)
- Bound the payload long-pass units above their inner cap (#549)
v4.1.0 — 07 August 2026¶
- A redirect is not message text, and an unexpanded path is not an attachment (#548)
- Make the slice memory cap proportional, not a constant (#547)
- Pinned mini-apps, a strip that exists on a phone, and cmd+k (#546)
- Guard the stdin shim against a re-executing launcher (#545)
- The fleet app grows tabs, inspect, and a table you can read down a column (#544)
- Warn when a stored margin_top means something different than it did (#543)
- Give the long passes a 1800s cap; keep the unit bound above it (#542)
render cancelmarks the project's job record, not only the spool (#541)
v4.0.1 — 07 August 2026¶
- The fleet app mounts — it was calling a renderView contract that does not exist (#540)
v4.0.0 — 06 August 2026¶
- The fleet app replaces the root grid, and carries the controls (#539)
- The fleet is a mini-app, auto-activated for admins (#537)
- The fleet snapshot refresher runs only while somebody is watching (#536)
- A symlinked directory lists as a directory, not an 18-byte file (#535)
- An admin's cockpit is scoped to the host, not to one agent (#534)
- Add-to-chat REFERENCES a workspace file instead of re-uploading it (#533)
- TXT mode is the default transport; the plugin path is the opt-out (#532)
- Every agent has its own display; retire private_display and xvfb (#531)
- Admin is a role, and any number of agents may hold it (#529)
- A mix row, and a picture row that includes what is not a camera (#530)
- A verb an MCP calls no longer blocks on the activation socket (#528)
v3.2.4 — 06 August 2026¶
- A non-zero gain is on the lane, not behind a hover (#527)
- A source the cut pulls in gets its own lane (#525)
- An unbounded component does not grow with the cut (#524)
- The degraded-path badge names the stream and claims no codec (#523)
- The VAAPI decode probe asserts a hardware surface (#522)
- The read seam serves a shared project the workspace declares (#521)
- A sub of a TXT-mode agent came up on the transport its org blocks (#520)
v3.2.3 — 06 August 2026¶
- Resolve the shared-library import from the file's real path (#519)
v3.2.2 — 06 August 2026¶
- A still image is a first-class source, and the preview can draw one (#518)
- An outro can reach a short cut, and an edit can no longer delete one (#517)
v3.2.1 — 06 August 2026¶
- Classify the full-cut verb, and retire two assertions the product outgrew (#516)
- A cut range may name its own source, so footage that was never rolling can be placed (#515)
- Teach scaffold_full_composition, and stop the outro-on-a-video-lane trap (#514)
- The full episode cut is repairable on a project that already exists (#512)
- A word on a segment boundary was claimed by BOTH segments (#513)
- Watch every component rung an agent can write, not just the one it must not (#511)
v3.2.0 — 06 August 2026¶
- Video app: record what the desktop measurement said about the burn preview
- Stall-handler: a parent waiting on working subagents is not wedged
- Video app: six defects found cutting episode 15
- Video harness: the episode-15 shape, and the write-side probes for it
- Six pieces of documented hand-work become product verbs
- Podcast-clips skill: a project can be several agents' project, and this skill never said so (#507)
- A component library the SHARED PROJECTS own, so one project renders one way
- Video-clip-assembly skill: this skill is full of hand edits, and a hand edit takes no lock
- Video-clip-assembly ships, instead of existing on exactly one host (#505)
- Video-editing skill: document the two-writer loss on clips.json and what the lock does not give you (#504)
- Edit_layers derived the whole transcript onto every payload, and threw it away
- The pinned speaker pass never reached work/captions.json
- The reveal is paced to the producer, and no tail snaps (#502)
- Clip_pad_s reached into the neighbouring sentence (#503)
- Every delivered file carried SAR 404:405 instead of square pixels (#501)
- Render_project is the batch render — named set, async, in-flight guarded (#496)
- Edit_timeline(op='frames') writes a whole shot map in one call (#495)
- The full episode cut is an outcome of ingest, not a claim (#494)
- A
sharedpointer makes one project several agents' project (#500) - Two writers on one clips.json lost one writer's rows entirely (#499)
- The atomic write left every project document at 0600 (#498)
- An unreadable clips.json read as a project with no clips (#497)
v3.1.2 — 05 August 2026¶
- The a/v sync tolerance was narrower than its own two quantisers (#493)
- The node harness had no ctx.filePick, so the video ingest row threw (#492)
- Resolve a relative --file instead of refusing it (#491)
- An unreadable attachment is a 404, not a 0 KB download (#490)
- Stage outbound attachments by direction, not by inject's cap (#489)
- Four derived-data defects found cutting a real episode (#488)
- Share sheet on mobile downloads, and one canonical control per file direction (#487)
- The transcript is one ascending timeline, and a reply is one bubble (#486)
v3.1.1 — 05 August 2026¶
- A read must not be able to starve the fleet (#485)
- Ship TitleCard, with its lengths on the right axis (#484)
- The preview draws the shape the cut is at, and the media url survives being appended to (#482)
- A failed write is visible, and the phone gets its screen back (#481)
- The read seam serves the system font directory (#480)
- A stale lane resumes, an unreadable registry fails, a concluded session says so (#479)
- The preview draws the render's font, and the shot map replaces an empty lane (#478)
- The preview reads the halves the MCP names, and
fullsurvives a re-proposal (#477) - The shots tile the cut, so the picture meets the bed (#476)
- Punctuation rides the word it follows (#475)
- A silent encode death reports its exit status (#474)
- The backlog is one total order, and it says what it left out (#472)
- Classify detect_shots on the reachability plane (#473)
- One bubble per reply, revealed at a rate the reader sets (#471)
- A file send must not hold the fleet-wide converge lock (#470)
- Detect_shots can run detached, so it reaches a real episode (#469)
v3.1.0 — 04 August 2026¶
- Stable caption chunks, so the subtitles read on mute (#465)
- Per-SHOT framing for an already-edited source, derived then corrected (#468)
- The speaker pass chunks, and the identities are pinned (#467)
- A clip's boundaries can move without losing its tuning (#466)
- A chat video plays where it sits, and its download writes a file (#464)
- Back up an agent's own mini-apps, like its local skills (#463)
- Skip the telegram plugin pin under AGENTCTL_TXT_MODE (#462)
v3.0.0 — 03 August 2026¶
- A mini-app may declare no providers and read no MCP (#460)
- TXT mode — the shim drives claude, no plugin, no MCP tools (#459)
v2.9.0 — 03 August 2026¶
- Ms365 login runs the installed server, not a fresh npx download (#457)
- Let an agent drive its own subsessions (#456)
- Video app: name every block, one secondary action, no scrollbars on the lanes (#453)
- A render a test asked for must not notify the owner (#454)
v2.8.9 — 02 August 2026¶
- Start the fs watchers after the handshake, not after connect() (#451)
v2.8.8 — 02 August 2026¶
- Unbreak main — errcheck on the one-uploader test, and give the harness the real ctx.pick (#450)
- Warn when two clips are near-duplicates, and reconcile ep-1's labels (#449)
- Frame a clip or a cut-away from the timeline, and file the rect on the leaf (#448)
- Framing gets its own surface, the row loses its reframe button, and the proxy is picture-only (#447)
- One picker primitive (ctx.pick), and a mobile gate that can see a scrolling header (#445)
- Lift sourceRange with sourceToCut, main is red without it (#446)
- One uploader for the workspace, the video app and the composer (#444)
- Make a download actually download (#443)
- The merge control says "merge clips", and a span that leaves the cut stops at its range (#442)
- Frame-exact cuts, and a join that measures itself (#441)
- The MCP handshake no longer waits on a filesystem walk (#429) (#438)
- Add
apps active, the launcher set, beside the narrowapps list(#440) - Restore the deploy key with its trailing newline (#439)
v2.8.7 — 01 August 2026¶
- Caption canvas, chip liveness, and a launch that lied about failing (#437)
v2.8.6 — 31 July 2026¶
- The render that could never start, and four lane/key defects found on real footage (#436)
v2.8.5 — 31 July 2026¶
- The retained halves, the preview audio bed, and the cockpit lanes + job queue (#435)
- Video MCP: list_jobs — every job on a project, of every kind, reattachable
- C4: space toggles play/pause again — reproduced and fixed in real Chrome
- Video MCP: an automatic centre rect never outranks a declared one
- The pool is a LIST, and every cut carries the same lanes
- Video mini-app: the pool is the pool, and a cut-away says where the sound is
- Video MCP: a project is usable at ingest, and no caption edit writes a blank
- Video mini-app: a short cut is its own lane, and every clip is visible
- Video MCP: resolve inherited clips, regenerate payloads, validate switches by shape
v2.8.4 — 31 July 2026¶
- The cockpit as the owner accepted it
- The crop precedence is five rungs, not four
- Key the LANE's crop by aspect too, mirroring the stream rung
- The clip's variant IS the shape — the composition and the render read it
- Merge_clips — a SHORT CUT is an ordered list of clip references
- The session bar earns its place, and the selected lane wears the theme's accent
v2.8.3 — 30 July 2026¶
- Build_camera_plan says whether the tuning survived the call
- Validate_project — the data model, checked, without a second rulebook
- The data model, so an agent can work the files directly
- The B-roll gestures state their outcome after the re-read, and report the snapshot
- A sliver joins a neighbour instead of being dropped
- The export cuts a B-roll reference, and one number bounds a shot
- _harness/README: the rotation gate, and the rule it puts on new streams
- Assert BOTH sides of the gate in one run
- Harness fixture: model probe_for_geometry's rotation gate, and derive it
- State the span's outcome after the re-read, with the replaced count and the snapshot's fate
- The B-roll tool schema said the opposite of what the code does
- Harness fixture: every manifest probe carries
rotation - A B-roll leaf plays from its start, and the old shift was incoherent
- B-roll is a clip reference resolved live (WIP — recovery commit)
- Two cameras share one frame, stated as a span from the timeline (#419)
- One camera plan, read by the preview and by the export (#418)
- A layer edit writes clips.json, and the fixture refuses what production refuses (#417)
- The agent drawer starts closed, opens on subagents, and speaks English (#415)
- Make domshim's textContent obey the DOM spec, and test the shim itself (#414)
- Video cockpit: the two-level crop window, overlapping clips in rows, and the keys made visible (#413)
- Reconcile a file tab against disk on activation, and give the pane a Refresh button (#411)
- One clip one composition, inheritance from full, the stack as data, and a return that matches what it wrote (#412)
- The variant is a rect too — nothing is baked but the source and the proxy (#410)
- The process that watched the file now says what changed (#407)
- Fix "Add to chat" on every workspace-tree file (#406)
- The live follow resumes at a byte offset, so an unchanged lane parses nothing (#405)
- Remotion applies the crop rect, and the two renderers are held to one rectangle (#402)
- The crop is a rectangle you drag, not a fifty-minute encode (#403)
- The crop is data — one resolver, five readers, and the stack applies it (#404)
- Per-agent uid isolation for local agent ports (#279)
- The title's style resolves in the MCP and is set in the blade (#399)
- The tab strip and the subsessions panel are operable with a finger (#398)
- The send-scroll on mobile, at the root (#395)
- Per-span clip drag, a spoken promotion failure, the single-speaker panel, and three names that meant two things (#392)
- Fix duplicate/misattributed agent-message cards + the vanishing compaction chip (#393)
- Show that a new subsession is starting (#391)
- Scope the compaction card to the lane that compacted (#390)
- A Title component, and a drift check on the caption style's two declarations (#389)
- Add cut, delete a part, merge clips — and one word for one thing (#387)
- A burnt caption is the same fraction of the frame at every shape (#388)
- Size the worker pool from the cgroup quota, not from nproc (#386)
- The render joins the job registry, and its encoder readout stops being blank (#385)
- The settings pane becomes a blade that follows the selection (#383)
- One list_projects, and an argument the verb does not declare is an error (#382)
- A fixed sleep is a bet on machine speed, not a wait for the app (#384)
- Make boot_stagger load-independent, and enforce ci-local before a push (#381)
- A backtick in a check description is a command, not markup (#380)
- Capture a clip while watching, ship one cut at both shapes (#379)
- Scope the run to the change set, fan out the shell tier, and fix the speaker→camera mirror (#378)
- A clips lane you capture into, and one cut that ships both formats (#377)
- The SessionStart suite owns its environment, so the gate says the same thing to everyone (#376)
- One job pattern, and every long encode is a job you can watch (#374)
- The material column — actions live on the thing they act on (#373)
- The selected session is a thing you can see, on every tab (#372)
- Lanes first, a playhead you can read, and weight that follows the state (#367)
- The composer follows the session you selected, on every tab (#371)
- Registered is not reachable — a shim watchdog, an honest boot check, and a cheaper cold start (#368)
- The panel that never left, a player pointed at a render that never existed, and speaker merges (#366)
v2.8.2 — 28 July 2026¶
- The transcript crash, the invisible diarizer pass, and the duplicate master (#353 follow-up) (#365)
- The three the audit left on the table — a queued turn shows dots, a lane is a lane over SSH too, and the main lane has one stream (#364)
- Derive status from systemd, stop storing it (#362)
- The split view is a real chat — it says who is working, and each pane is its own lane (#363)
- Let a crashed subsession actually restart (#360)
- Channel-correct persona + installs that actually restart (#361)
v2.8.1 — 28 July 2026¶
- Spool guard on capacity, drop highlight that clears, gate timings (#359)
- Converge the private display for pi-runtime agents (#358)
- One jsdom search, and a durable place to install it (#357)
v2.8.0 — 28 July 2026¶
- A word carries a speaker control, so the review queue can be worked (#356)
- One subsession status, one dot colour, on both surfaces (#355)
- Diarization is a producer, not a rung — and the UI stops contradicting it (#353)
- Agent scratch belongs on the data volume, not on / (#354)
- The diarizer rung is not attribution, and must stop claiming to be (#352)
- The cockpit says which rig this is, and which rung is acting (#351)
- Who is speaking — naming, derived where possible, never asked blind (#346)
- Mini-app-designer becomes a default skill; agentctl skill and README rewritten cockpit-first
- Prepare speaker cuts — the automatic camera plan, in the lane it writes (#342)
- Sync says which offsets it trusts, and refuses the ones it does not (#350)
- An ISO channel never overwrites a camera, and a container is never the mix (#348)
- A failed detached job exits non-zero, and an empty probe is not remembered (#349)
- Which rig is this — a shape test over the sources, and it says so (#345)
- A subsession's interruption is not the owner's turn (#344)
- The app.js harness extracts by NAME, and main goes green again (#347)
- One unnamed ISO channel is not a programme mix (#343)
- A multitrack recording is a container, its channels are sources (#341)
- Some sound is content, the rest is only evidence (#340)
- Inject a resume turn after a restart, on an INTERRUPTED verdict only (#339)
- A kind glyph at the head of every timeline lane (#338)
- A detached transcribe has the key, and a cached probe cannot lie about it (#337)
v2.7.4 — 27 July 2026¶
- First-run screen painted into a detached node — plus + project, so creating isn't first-run only (#336)
v2.7.3 — 27 July 2026¶
- A subagent transcript names the parent and the sub, not "You" and the parent (#335)
- The timeline editor is the app — the happy-path shell (#329)
- Relative markdown links open the file; office docs default to the live view (#334)
- Auto-inject context for file, skill, cron, hook, session and subagent tabs (#331)
- Reconcile the typing indicator from the transcript's own turn-end record (#330)
- Stop the agent-card .nm style leaking into the sidebar tree and definitions list (#328)
- A skipped suite is a gate failure, not a pass (#327)
- The SessionStart continuity verdict fails closed when it has no verdict (#326)
- A video is not silent, and an empty transcription is not a success (#325)
v2.7.2 — 27 July 2026¶
- The read-only half of the browser MCP stops asking (#324)
v2.7.1 — 27 July 2026¶
- The file chip opens a tab, and the tree stops shouting (#323)
- Google-workspace actually starts — bun takes its flags after
run(#322)
v2.7.0 — 27 July 2026¶
- A private-display agent is actually off the shared xvfb tier (#321)
- A dropped clip is named something the MCP accepts, and a failed ingest says so (#320)
- Leaving a mini app withdraws its context, and the block stops shouting (#319)
v2.6.0 — 26 July 2026¶
- A portrait source is planned as the shape it actually is (#318)
- An app drawer, because a row of anonymous glyphs does not scale (#316)
- The turnless read plane can reach a query-/retrieve-shaped MCP (#317)
- Component layers reach the pixels, and a release can reach the library (#306)
- An agent killed mid-turn picks its work back up (#314)
- Every claude that starts reasserts the telegram plugin pin (#312)
- The browser status line is a tab picker, so the agent reads the tab you mean (#311)
- The browser toolbar clears the touch floor in both dimensions (#310)
- An agent-to-agent message renders on the receiving side too (#309)
- Drop the page into chat — its text and its screenshot (#308)
- A subagent chip belongs to the agent, and a finished one leaves on its own (#307)
- The mini-app context reaches the agent on the dial-in transport (#304)
- An MCP manifest change reaches the units it renders (#303)
- Footage lands where a verb can see it — inbox in, adopt in place (#305)
v2.5.6 — 26 July 2026¶
- The browser mini-app renders correctly at any devicePixelRatio (#302)
- Zero-argument tools are callable again, and a tool error stops looking like data (#300)
- The browser mini-app renders at device resolution (#301)
- The context chip sits in the composer, and says the app once (#299)
- Restart browser@ when the font rendering config moves (#298)
- Copy/paste in the browser mini-app (#296)
- A background mini-app can no longer write context onto the chat tab (#297)
v2.5.5 — 26 July 2026¶
- The private display comes up ready, and the tab list is not empty (#295)
v2.5.4 — 26 July 2026¶
- The transcript stops scrolling itself (#294)
- /browser/ reaches an agent on another host, without ever naming one (#293)
- Give the typing indicator breathing room and a bit more height (#291)
v2.5.3 — 26 July 2026¶
- The mini-app reads the file KASM_PORT is actually in, and apply bounces Chrome (#290)
- The browser window follows the framebuffer, and the race gate actually runs (#289)
- Browser mini-app — the agent's real Chrome, framed and authenticated (#288)
- Videos play in the bubble — an inline tile, not a file card (#283)
- Per-agent private X display (KasmVNC + openbox), opt-in and inert (#286)
- Adopt chrome-devtools-mcp as the
browserMCP, defaulted fleet-wide (#282) - GPU decode by chain shape, one generation for multi-shot masters, live job ids (#287)
- The inbox path can seek too — Range on /api/inbox (#284)
- Window in O(viewport), teardown contract, coalesced fs-event re-derive (#285)
- Every mini-app contributes view context to the composer (#278)
- Explicit membership only, source-shaped layers, dot-free frames path (#280)
- Custom video preview — player, per-track timeline, membership, ingest + picker (#276)
- Explicit composition membership, declared stream roles, inbox listing + append-safe ingest (#277)
- Split both halves by default, quality-targeted rate control on both backends (#275)
- A resumed subagent is running again — re-START on SendMessage revival (#274)
- Three chip colour families — activity coloured, state semantic, context neutral (#273)
- Pay back late media growth above the viewport + render-progress chips (#270)
- Reframe to a derived source, frame sampling for crop choice, lossless track split (#271)
- Collapse show/episode into ONE level of projects, with one cut-mapping primitive (#269)
- Typing indicator out of flow + scroll-back stops fighting the finger (#268)
v2.5.2 — 25 July 2026¶
- Land at the true bottom when returning to the chat (#267)
v2.5.1 — 25 July 2026¶
- Stop the typing indicator from shoving the transcript (#266)
- Clear a unit's latched failure when apply rewrites its file (#265)
v2.5.0 — 25 July 2026¶
- Generate the changelog block + release-note bullets in the scripts (#263)
- Self-converge after an unattended upgrade, and stop lying about it (#264)
- Converge enable-state, and four ways studio broke silently (#262)
v2.4.0 — 25 July 2026¶
- A first-run flow, and the two blockers behind it (#261)
- Tolerate an absent spool instead of failing 226/NAMESPACE (#260)
v2.3.0 — 25 July 2026¶
- Cross-compile the reaper for darwin (Homebrew build)
- Agent-driven video editing: MCP, cockpit editor, Studio, detached renders, resumable uploads (#257)
apps validate— surface why a mini-app silently doesn't appear- Keep the local gate's Go cache off the root filesystem (#259)
- User-authored local mini-apps (deb/overlay/local layering)
- Render HTML email bodies via on-demand MIME (no fleet env flip)
- Block remote sub-resources in the email HTML viewer CSP
- Hold a loader through the seed, reveal the composed state at once
- Refresh the sub-agent chip when a finished sub is re-ignited
- O(1) live-transcript selection — early-return + persistent classify
- WS heartbeat + non-blocking SSE fan-out
- Atomic shard writes + serialize the read-modify-write
- Reserved-name + existing-user guards on agents add
- Collect-and-continue on a per-agent failure, don't abandon the fleet
- Kill the O(N^2) sops-decrypt storm in fingerprinting
- Bound the windowed-row set — free detached rows, gap-free
- Send scrolls fresh bubble into view; re-sync sub chips on focus
- Clamp seed/delta cards to the visible window (timeline interleave)
- Coalesce live windowing; drop dead ckfade; guard Back re-arm
- Trap browser Back inside the PWA; scroll the app launcher
- Calendar week grid — framed grid, today badge, accent chips
- Http mini-app reads, pane isolation, media share/close, seed scroll
v2.2.12 — 24 July 2026¶
- File-tab images open in the lightbox (zoomable) (#256)
- Persistent composer — type to the agent from inside a mini-app (#255)
- Workspace upload modal — real progress and the server's own error (#253)
- MS365 calendar search via OData contains() + confirm the mail search seam (#252)
- Require actual silence, not just a stale backlog (#251)
- Converge regenerates stale wrapped-MCP cli.sh + prewarm remote MCP cold start + smoke test (#249)
- Office viewer tab (docx/xlsx/pptx) via Microsoft's engine (#248)
- Full per-release provenance changelog + generator (#250)
- Inline image on reload (J2) + fresh/loading session state (K1) (#247)
- Inject newline parity (J1) + agent-sent SVG served safely (J3) (#246)
- Transcript virtualization — JS test harness + windowing (#244)
- Cross-app search — generic search slot + Mail/Calendar search adapters (#245)
- Threaded (conversation) view for Mail — Gmail + MS365 (#243)
- Gmail read-view reads headers from the nested
headersobject (#242) - Mail read-view + real calendar week grid with event details (#241)
- Unified attach-to-chat — entities become attached files, multi-select, one affordance (#240)
- Resumed subsession connects to its lane instead of erroring not-connected (#239)
- Cron output renders as a CRON card, not a SENT self chat card (#238)
- Running-subagents chip actually surfaces at runtime (#237)
- Robust table rendering + agent-sent attachments open in-tab (#236)
- Autoscroll on send/typing + stable image-attachment dedup (#235)
v2.2.11 — 23 July 2026¶
- Pin script forced the fused telegram plugin onto webview agents (+ lane-dial regression coverage) (#234)
v2.2.10 — 23 July 2026¶
- Expose
agents set <name> channel <value>to reroute an existing agent - Bounce stale always-on tier on a version upgrade (#233)
v2.2.9 — 23 July 2026¶
- Render the self-login roundtrip in the cockpit (#232)
v2.2.8 — 23 July 2026¶
- Mobile PWA reconnect churn — tail re-add, notif storm, scroll-back, status dot (#231)
v2.2.7 — 23 July 2026¶
- Server-side stale-click guard for permission replies (#230)
- Pi token streaming into the live chat (10) (#229)
- Workspace uploads stream via spool+pull (agent writes the pulled bytes) (#228)
- Virtualize the transcript + batch seed appends + scope/motion render fixes (#227)
- Close authenticated-stranger arbitrary file read to the HMAC key (F1) (#226)
- Stream large uploads to disk + pull-then-cleanup (cap → 2 GB) (#225)
- A permission card reflects its status (04) (#224)
- Keep a failed cron's transcript for forensics, discard a successful one (13) (#223)
- A pi agent gets a scroll-back — runtime-agnostic session discovery (01) (#219)
- One cursor shape over the live stream — (session, seq) (19) (#221)
- Robust typing reconcile (post-Stop write + hookless agent) (#222)
- Reject oversize saveUpload + widen spawned-scan window (review follow-ups) (#220)
- An audio attachment plays in the web-view (23), and scroll-back dedupes (05f) (#218)
- Agent web-view design pass — line-icon set, unified buttons, consistent cards (behavior-frozen) (#215)
- Memoize spawned-session classification (hot main-lane path) (#217)
- Reconcile owner_id from the live pairing, and report the divergence (#216)
- Dedupe messages by identity, not by their text (05f) (#214)
- Read session kind from the events lane — item 18's missing consumer (36) (#213)
- A deferred attachment is pulled, not pushed on the control socket (31) (#211)
- Voice notes on every channel, as an attachment kind (23) (#212)
- The always-on tier must not be PartOf=agent@ (login broker died with the agent) (#210)
- Record permission asks and their resolutions (04) (#209)
- Every recorded send has been dropped by the renderer since #183 (#206)
- Gofmt top_web_upload_test.go — main was red (#208)
- Incremental workspace-tree fs_event update (no whole-tree re-render) (#207)
- Render the agent's own lifecycle as a card kind (22) (#205)
- On touch devices, Enter inserts a newline (send via the button) (#204)
- Reject oversize workspace uploads instead of silently truncating them (#203)
- CHANNEL_SOURCE=webview as a first-class value (11) (#201)
- A fan-out policy — stop reading every reply twice (11) (#200)
- Make the login principal a real owner identity — nonces are not sessions (11) (#197)
- Event-driven typing bubble (start on prompt-submit, stop only on Stop, on-load reconcile) (#196)
- Record the outcome of the deliberately-silent cron paths (27) (#199)
- Raise the upload cap above the lazy-fetch threshold, split from the memory budget (#198)
- Give the web-view the lazy attachment path it never had (17) (#193)
- Record the agent's own lifecycle instead of reading systemctl (22) (#192)
- Running-subagents chip row + live read-only subagent session viewer (#194)
- Run the inbound seam on EVERY inbound, not only when the shim is down (#190)
- The owner allowlist must fail CLOSED, and say so out loud (#191)
- Exclude spawned-subagent transcripts from the main lane + render inter-agent messages as cards (#187)
- Filter the subsession read surfaces on kind; drop the phantom ansible gate (#188)
- Record the session lifecycle instead of inferring it (18) (#186)
- Render recorded sends on the timeline; retire the cron inference (06) (#184)
- Record an owner-facing send as an event (06, 12, 15) (#183)
- Give the web-view an always-on tier (09) (#185)
- One definition of MCP liveness; stop revealing non-path tabs (24) (#182)
- A blocking gate that cannot run is a failure, not a skip (25.3) (#179)
- Escape the NUL in agentKey so git can merge dashboard.html (#178)
- Reload the open file when it changes on disk (05c) (#177)
- One canonical path space for openable files (05e) (#166)
- Pin host-service ExecStart to the packaged binary, never selfBin() (#176)
- Reconcile the login proxy from apply + fleet sync (#167)
- One stream coalescer for telegram + slack; Teams cannot join (#16) (#174)
- Stamp + brief the lane a turn arrived on, not the primary (#05d) (#173)
- Finish the delivery unification (#14) — 2 silent drops + a gate (#172)
- Seek into transcripts instead of parsing them from zero (audit 21) (#175)
- Cockpit mini-apps: action bridge + read data-plane + app framework + Mail/Calendar (#164)
- Make wvFrame typed-only an invariant, delete the dead
rawrelay seam (#165) - Restore typing indicator on PWA resume when the lane is still working (#168)
- Cockpit+subsession: scope cron/channel cards + per-lane typing + subsession rm (#160)
- Render
agentctl notify selfas a message, both runtimes (#157) - Modern composer capsule (rounded, circular icon send) (#156)
v2.2.6 — 23 July 2026¶
- Webview-login: username field (not email) + no mobile zoom-on-focus (#155)
v2.2.5 — 23 July 2026¶
- Webview-login: form-based login for the basic driver (PWA-compatible) (#154)
- Mcptools --params must precede the call subcommand in wrapped cli.sh (#153)
v2.2.4 — 22 July 2026¶
- Retire send-telegram.sh (use agentctl notify) + surface reject in shim (#150)
- Route ws fs-mutations + webview host-service verbs through the daemon (#151)
- Make plain
applyself-reconciling AND self-bouncing (#148) - Build peerCred cross-platform via build tags (#149)
v2.2.3 — 22 July 2026¶
- Fully event-driven cockpit — workspace + session live push (zero polls, pi + claude) (#142)
- Auto-wrap declared MCPs into clitools during provisioning (#144)
- Deliver pi streamed replies with no live turn ctx (web-view/inject → Teams) (#143)
- Make fresh-agent add fully Go-native; ansible add play behind --legacy (#141)
v2.2.2 — 22 July 2026¶
- Port browser-harness system symlink into the Go native path (#140)
v2.2.1 — 22 July 2026¶
- Tier-A cockpit gaps — typing clear, tool-noise, outbound attachments, distinct image names (#139)
- Resolve harness via package-managed system symlink, drop stale shim
- Surface cron cards only once the run has concluded
v2.2.0 — 22 July 2026¶
- Md italic/strike/task-lists + reliable PWA resume & typing-bubble clear
- Render GFM pipe-tables in the cockpit markdown renderer
- Relay ops + permissions to pi agents so the cockpit stops hanging (#138)
- Allocate a PTY so claude doesn't fall into --print (crash-loop fix)
- Absolute datetime stamp on every message + card (no "ago")
- Only print "(prerelease)" when the version actually is one
v2.1.0 — 22 July 2026¶
- Stage inbound attachments so pi teams/slack/webview agents don't drop owner files (#137)
- Harden agentctl rollout (recursive channel staging, --force restart, fleet-upgrade.sh, release runbook) (#136)
- Total-order the web-view message stream (sub-second, stable merge, monotonic cursor, restart stitch) (#135)
- WhatsApp-quality voice recorder + header/composer polish
- Dual-connect pi bridge to the web-view gateway (#134)
- Fix composer input floating ~4px above the buttons (inline-textarea baseline gap)
v2.0.1 — 22 July 2026¶
- Stage channel/shared into transport/shim/connector run dirs
- Suppress the injected SKILL.md body as a user turn (SKILL card covers it)
v2.0.0 — 22 July 2026¶
- Follow the compaction rollover in a sub's live view + reaper/tail
- Keep the history scroll-back from mixing in subsessions
- Ephemeral 'cleaning up context' card on compaction (PreCompact hook)
- Fold consecutive tool calls into one expandable Tools card
- Subsessions management panel — run any 3 of N (owner's ask)
- Composer alignment + accent-themed rings, optimistic dedup, voice notes, entry motion
- Pi spawn — webview-mode bridge + bound session (mirrors the main pi interface)
- Drag-to-move workspace files (ws mv)
- Guard pi agents from the claude-only spawn path
- SessionStart hook marks rolled-over sessions (compaction spill fix)
- Resume from the UI + cap-check on resume (manage the active 3)
- Cmd/Ctrl+W closes the focused pane/tab + focus indicator (P4 polish)
- Proper drag-to-split editor + per-tile close + composer fix (P4 polish)
- Tiled/split session view — N live panes side by side (P4)
- Subsession chat tabs + start/close controls (P4 frontend, switch-view v1)
- Subsession start/clear control endpoints + route mutating verbs (P4 backend)
- Session-address /api/inject too (P4 backend, completes the seam)
- Session-addressed transcript + permission + sessions endpoints (P4 backend)
- Idle auto-stop reaper (Phase 3)
- Spawn/lifecycle verbs + templated unit + launch (P2 core)
- Channel/shim: webview-only lane mode for subsessions (P2b enabler)
- Channel+cli: per-session ingress socket (subsessions P2a)
subsession listverb — the registry read surface (subsessions P0)- Generalize narrate + stall exclusion to the session registry (subsessions P0)
- Session registry keystone + generalize LiveTranscript exclusion (subsessions P0)
- Internal/cli: isolate the shipped catalog root in tests (AGENTCTL_SHARE_DIR)
- Internal/cli: webview permission parity — render + Allow/Deny in the cockpit chat
- Runtime/teams: render + capture permission replies (close the "teams drops it" hole)
- Runtime/slack: capture permission replies (close the "renders, can't capture" hole)
- Runtime/channel: shared permission-reply parse contract + telegram onto it
- Runtime/channel: key the teams + slack gateways by (agent, session)
- Fold the last off-protocol escape into the typed union
- Internal/cli: key the webview gateway by (agent, session)
- Runtime/channel: shims declare + stamp their session lane (claude + pi)
- Runtime/channel: add session as a first-class routed field (protocol)
- Authenticate register frame against agent owner
- Runtime/channel: extract shared bounded-download primitive for inbound attachments
- Runtime/channel: port channel impls to shared mime/presence/stream
- Runtime/channel: add shared mime/presence/stream helpers
v1.9.26 — 22 July 2026¶
- Composer no-drift (plain textarea in normal mode) + workspace write actions
v1.9.25 — 22 July 2026¶
- Composer scrollbar — hide until content exceeds cap; shorter mobile-safe placeholders
v1.9.24 — 22 July 2026¶
- Cancel op-relay on client abort (canceled download no longer wedges the cockpit)
v1.9.23 — 22 July 2026¶
- Stop-hook-driven typing indicator + SKILL card for skill loads
v1.9.22 — 22 July 2026¶
- Infinite scroll-back across all sessions+crons; composer scrollbar fix
v1.9.21 — 22 July 2026¶
- Interleave cron notify-cards into the seed by timestamp (not clustered at the end)
v1.9.20 — 22 July 2026¶
- Cron runs as notification cards in the cockpit (disk-canonical) + icon cache-bust
v1.9.19 — 22 July 2026¶
- Render agent-SENT attachments in the cockpit (reply/send tool files)
v1.9.18 — 22 July 2026¶
- Right panel redesign — collapsible capped-scroll sections, crons-first, uniform provenance
v1.9.17 — 22 July 2026¶
- Make the slash-command popup scroll (taller max-height, touch scroll, contained)
v1.9.16 — 22 July 2026¶
- Slash-command popup shows all skills (drop 8-item cap), prefix-matches first
v1.9.15 — 22 July 2026¶
- Dedupe a message sent while the agent is working (queue-op + processed copy)
v1.9.14 — 22 July 2026¶
- Rotating placeholder prompts, skill slash-commands, clearer cron display
v1.9.13 — 22 July 2026¶
- Unify cockpit stream onto one socket feed (live tools + seamless reconnect)
v1.9.12 — 22 July 2026¶
- Typing bubble tracks real activity, not the 5s Live flag
v1.9.11 — 22 July 2026¶
- Browse skill FOLDERS (not just SKILL.md); fix stuck typing bubble
v1.9.10 — 22 July 2026¶
- PWA branding is overlay-driven, not baked into the binary
- Re-render WEBVIEW_LEDGER on user_email set; stream SSE through proxies (#132)
v1.9.9 — 21 July 2026¶
- Right-panel items open in tabs (editable defs + read-only session chat); composer polish
v1.9.8 — 21 July 2026¶
- Slack-style code box in composer (type ``` to open); normal-height centered input; live open-fence highlight
v1.9.7 — 21 July 2026¶
- Installable PWA (manifest + service worker + L1D icons) for desktop Edge/Chrome + Android
v1.9.6 — 21 July 2026¶
- Slack-style live code highlighting in composer + bigger field; render remote-sent image attachments live (upgrade dup bubble); suppress notification storm on history replay
v1.9.5 — 21 July 2026¶
- Clickable repos/tmp paths (home-scoped read) + robust notifications + iOS zoom fix
v1.9.4 — 21 July 2026¶
- Dedupe queued+processed message copies (was rendering twice)
- On-demand TG attachment download for thumbnails + notif permission on send
- Inbox image thumbnails+gallery, HTML code-view highlight+edit, tab title/favicon/activity, browser notifications
- Group the You label on optimistic send too (not just on refresh)
- Deliver composer attachments to the agent (gateway mode)
- Render queued (arrived-while-working) messages
- Follow live session rotation in the transcript stream
- Right-hand agent panel (skills/memories/subagents/crons/sessions)
- HTML file preview/code toggle + task-chip subject/status
- Reply-as-message, clickable paths, tab→tree reveal, polish
- Cockpit polish — message grouping, wrapping, themed surfaces
- Full surface/text/border/mono themeability
- Add webview_logo scalar + cockpit cleanup (Pass 1)
- Host-scoped theming for the scoped single-agent web-view
v1.9.3 — 21 July 2026¶
- Clock silent-turn wedge from oldest pending message, not last assistant output
- Order agent@ After telegram-transport@ to prevent getUpdates 409 deadlock (#126)
v1.9.2 — 21 July 2026¶
- Stage channel/ subdirs so shim/ resolves at runtime
v1.9.1 — 21 July 2026¶
- Inbound attachment delivery (all file types) for Teams + Slack gateways (#125)
v1.9.0 — 21 July 2026¶
- Typing tied to reply arrival +
agents set user_email+ host-scalar read - File editing (ws write over the socket) + explicit op chunking
- Raise dial-in WS read limit (large file dropped the whole connection)
- Fix cockpit status lookup (host-key mismatch) + duplicate user bubble
- Capture conv ref from any activity + buffer no-ref proactive sends (#124)
- Fix live push (opStream never returned) + real self-scoped status
- Real card stats + unbounded streamed download + drop local host
- Real session transcript over the socket + full-screen scoped cockpit
- Bound the tool-in-flight guard (catch hung tools) (#123)
- --web no longer swallows a following flag; gateway ExecStart drops --web
- Silent stalled-turn watchdog (claude daemon + pi in-process) (#122)
top --web --gateway --login— one command for local dev- Per-user cockpit scoping + capped reconnect backoff
- Make it an additive channel via shim fan-out, never primary
- Docker image (gateway + login proxy), unified dev/prod
- Generic login proxy (basic + OIDC drivers) fronting the cockpit
- Fold dialed-in agents into the fleet snapshot (cross-host)
- Op-relay for handleWsRaw (bytes) + handleLogs (streaming)
- Op-relay wiring — workspace browse + def over dial-in
- Wire cockpit view+inject to the dial-in registry (gateway mode)
- Op-relay — protocol op/op_result frames + connector handler
- Gateway =
top --web --gateway(Go WS dial-in), drop Bun hub - P1 (runtime) — gateway relay + browser SSE/inject bridge
- P1 (infra) — webview-gateway host service + runtime scaffolding
- P0 — ledger user_email + webview channel converge plumbing
v1.8.4 — 21 July 2026¶
- Proactively finalize informative stream before Teams' 2min cap (#PR)
v1.8.3 — 20 July 2026¶
- Maintenance release; no feature-level changes since the previous release.
v1.8.2 — 20 July 2026¶
- Wire shared-scope MCPs by config membership, not socket unit (#116)
- Drop file-consent re-request allowlist (Linux perms are the boundary)
- Notify admin + retire agent/admin-notify.sh + Teams file-consent TTL/re-request
- Host-monitoring skill: make host-agnostic and detection-based
v1.8.1 — 20 July 2026¶
- Unify cron delivery through agentctl notify (#113)
v1.8.0 — 20 July 2026¶
- Channel-agnostic owner-facing delivery verb (#112)
v1.7.0 — 20 July 2026¶
- Native Go reconcile + cross-host channel connector (#107)
v1.6.7 — 17 July 2026¶
- Stop re-stream flood on Teams stream expiry (#111)
- Adopt the remote's default branch, not hard-coded main (#109)
v1.6.6 — 16 July 2026¶
- Markdown newlines, live-session attach, apply logs, typing indicator (1.6.6) (#106)
v1.6.5 — 16 July 2026¶
- Raise shared MCP socket MaxConnections 10 -> 64
- Agentctl inject verb + operator cockpit in top --web (#105)
v1.6.4 — 14 July 2026¶
- Pull the fleet repo from origin before reconciling (#104)
v1.6.3 — 13 July 2026¶
- Add self-scope
chrome restartto recover a stuck browser (#103)
v1.6.2 — 13 July 2026¶
- Keep typing indicator until turn end, not first narration block (#102)
v1.6.1 — 11 July 2026¶
- Don't collapse a streamed turn into a one-shot when the final lands fast (#101)
v1.6.0 — 11 July 2026¶
- Re-vendor drifted self-MCP payloads without a full agent restart (#100)
- Extract all inbound media kinds, not just photo/document (#99)
- OAuth broker + hands-free google self-login (supersedes #97); remove pi login (#98)
- Drain resolved turn-review candidates into a deletable archive
v1.5.10 — 09 July 2026¶
- Unwire catalog-deleted MCPs via name-only teardown
v1.5.9 — 09 July 2026¶
- Remove defillama from deb (l1d-only, moves to l1d overlay)
- Unify claude tools (MCPs) into the layered defaults model + catalog cleanup
- Host-defaults editor for the catalog-defaults overlay
v1.5.8 — 09 July 2026¶
- Unified layered defaults across all per-agent catalog categories
- Turn-review: bias the proposer toward recall, not restraint
v1.5.7 — 09 July 2026¶
- Union shipped defaults into an agent's recorded hook list
- Port sendRichMessage rich-text path into telegram transport
v1.5.6 — 08 July 2026¶
- Make introspect fileTimes compile on darwin
- Don't let a late-closing old socket clobber the live registration
v1.5.5 — 08 July 2026¶
- Provider-agnostic review-model override (pi PI_SKILL_MODEL + pi cron PI_CRON_MODEL)
- Candidates verb + agents-set skill_model + README/agentctl-skill docs
- Idea+pointer candidates, compose-dream-cycle, curator lifecycle, pi parity
- Turn-review Stop hook — cheap async skill/memory candidate extraction
- Agentd read-proxy for cross-agent introspection reads
- Live read-only introspection verbs (mem, sessions, skills, ws changes/search)
v1.5.4 — 08 July 2026¶
- Ship apt pubkey in the deb + restart watchers on upgrade
v1.5.3 — 08 July 2026¶
- Per-agent transport port — no cross-owner leakage on shared hosts
v1.5.2 — 08 July 2026¶
- Retire obsolete host crons on reconcile + build-repo picks the right deb
v1.5.1 — 08 July 2026¶
- Restart agent on override change (no 409) + presence owner id
v1.5.0 — 08 July 2026¶
- Teams/slack claude agents show paired (not red) — gateway-routed
- Backstop commit for mutating verbs (forgotten-commit safety net)
- Correct channel chip for slack + all claude agents (TUI + web)
- Remove dangling FORMATTING reference that crash-looped the shim
- Commit + push the full agent block on add (cross-host routing)
- Per-agent tool socket ($HOME) — two pi agents per host no longer collide
- Render + conditionally restart the agent on a per-agent secret set
- Reconcile gateways on fleet sync + gateway-only apply
- Cross-host register URL from ledger + channel-aware greeting
- Pi teams/slack add requires the app token only when the gateway is LOCAL
- Zk wrapper recursed into itself (PATH shadow) → hung the agent
- Deterministic Markdown→mrkdwn converter (+ seed guidance as nudge)
- Tell the model each channel's text syntax (per-channel formatting)
- Progressive block delivery — flush each completed paragraph as it lands
- Activity-indicator placeholder + slack media tool (pi) + slack default
- Agent card channel chip slack-aware (was tg for slack) [#55 in-branch part]
- Block delivery — buffer the stream, post ONE message on final (no cascade)
- Proactive DM resolution for presence/notices (users.lookupByEmail + conversations.open)
- Slack owner_email recording + gateway never crashes on a bad outbound
- URL-encode names in generated _files.md links
- Consolidate ALL presence into the runtime (drop agent-notify lifecycle)
- Shim online-on-hello only for gateway channels (no telegram double-ping)
- Offline presence on WS close (teams + slack), debounced
- Shim-owned online presence + slack attachments (files.uploadV2)
- No dangling '...' bubble, presence for teams/slack claude, secret write-on-change
- Narration on teams/slack (route by owner) + static informative
- Multi-bubble narration + teams tool-surface guidance for claude
- Claude first-class on teams/slack — block outbound, attachments, add-path
- Non-streaming replies, idempotent finalize, empty-final guard, Teams stream-restart
- Apply-all-hosts — parallel fleet reconcile with a live per-host bar modal
- Blank-line-separate streamed status lines (were running together)
- Stage bridge + channel mirroring runtime/ so cross-tree imports resolve
- Typing indicator while the agent thinks (parity with main)
- Unified claude narration + hook ingress over the shim (all channels)
- Port the Claude self-login (PKCE) dance into the shim — channel-generic
- Ship runtime/channel + runtime/slack in the .deb (were missing → 203/EXEC)
- Full teams-parity for the web add-agent flow + CLI status/uninstall
- Slack gateway status badge (TUI + web host bars) — teams parity
- Make Slack first-class for pi + fix gateway port clash + layout tests
- Retire telegram-watchdog + make slack_gateway first-class + fix teams owner UI
- Gate apt repo + GHCR container on non-prerelease
- Force fused .mcp.json on direct hosts (no transport)
- Code the 4 deploy items — extra-vars, transport enable, shim, teams-claude
- 1.4 telegram-transport@ unit + CHANNEL env + 3.5 seed audit
- Owner_email end-to-end — ledger round-trip, apply, webui, handler
- 3.1 thread + persist --owner-email through agents add
- 2.4 agentctl slack-gateway install verb + apply reconcile
- 2.3 generic pi SocketChannel (Slack now, Teams later)
- 3.1 recognize slack as a channel (validate + agents add)
- 2.1 gateway core + streaming + 2.2 manifest (mock-tested)
- 1.2 the shim — claude/channel MCP server, pure socket client
- 1.1 shim<->transport socket protocol + streaming + tests
v1.4.0 — 07 July 2026¶
- Force fused .mcp.json on direct hosts (no transport)
- Cron form spans the fleet — pick any agent on any member host
- Catalog 'tool' form renders + agent dropdown populates
- Channel-aware delivery — teams admin via bridge, telegram via bot
- Resolve admin agent from agents.d/ shards, not agents.yaml
v1.3.29 — 07 July 2026¶
- Fleet-health bar replaces always-on host lines
- Collapse host-cron rows behind a per-host toggle
- Declutter agent drawer vitals (no double-counted capability cells)
- Unify provenance vocabulary across drawer + catalog
- Catalog wizard detail pass — subtitle, blue active segment, MCP dot
- Join-fleet 3-step indicator + intro
- Add-agent wiring collapses to a default-activations summary
- Fleet-aware catalog host selector (joined hosts → one shared-overlay target)
- Catalog wizard polish — agentd unification, script hooks, progressive forms
- Don't re-wire http-transport MCPs every apply
- Web catalog browser (browse/read/remove) + agent self-activation
- Agents can
secret getany secret visible to them at runtime (#83)
v1.3.28 — 06 July 2026¶
- Fix: exclude the sops config .sops.yaml from the secret-shard glob
- Fix e2e: host-only agents.yaml keeps an empty
agents: {}marker - Fix CI: remove orphaned indentLevel + seed shards in daemon authz test
- Drop legacy single-file ledger/secret support — sharded is the only layout
v1.3.27 — 06 July 2026¶
- Build-window finds pi's nested sessions (was running blind)
- Sync before migrate so hosts don't independently re-migrate
- Stage 2 — shard the sops store into secrets.d/<owner>.sops.yaml
- Sharding switch is a repo marker file, not an env var
- Shard dir is agents.d/ not agents/ (collision) + e2e sharding section
- Stage 3 — conclude or abort a merge, never strand MERGE_HEAD
- Stage 1 — shard agents.yaml into agents/<name>.yaml (gated, validated)
v1.3.26 — 05 July 2026¶
- Reconcile re-renders the gateway UNIT so unit changes propagate on apply
v1.3.25 — 05 July 2026¶
- Make AGENT_RUNTIME write idempotent (fix e2e non-idempotency)
- Make the cron runtime declaration-driven (agent.env), not FS-probed
- Stage all gateway .ts (fix crash) + run bun tests in CI
- Persist conversation refs so proactive sends survive a gateway restart
- Deliver pi teams agents' cron digests to Teams, not (silently) Telegram
- Resolve pi-vs-claude from the declaration, not the filesystem
v1.3.24 — 05 July 2026¶
- Ineffassign in extractZipStdinToDir (top := f.Name overwritten)
- Shellcheck warnings in wipe-agentctl.sh (SC2038 find-exec, SC2115 rm ${u:?})
- Tool ZIP upload, host-scope (root) crons, agent dropdown
- Tell pi agents their capabilities are CLI tools, not MCPs
- Runtime-aware unit for
logs+status(pi journal was empty) - Document how a teams/telegram agent reaches its owner (the teams tool)
- Auto-scroll to the progress bar when add/gateway/join starts
- Channel-aware agent persona (teams agents no longer claim "reachable over Telegram")
- AllAgentNames delegates to fleet.AgentNames (pi has no .service.d)
- Runtime-aware skill/subagent def + collector subagent path (pi agents)
- AllAgentNames includes pi agents (cron/skill/hook on pi were "unknown agent")
- Surface on-host sudo hint + gate gateway status on env (not unit file)
- On-host mutations (no --host needed) + teams-tool default + rate-limit FP + gateway status
- Binary-safe stdin over the socket (--zip-stdin via daemon-routed verbs)
- Complete #33 — full option coverage + Geist wizard redesign
- Don't trip the browser@ StartLimit on a transient cold-start
- Channel-aware card label + retry browser@ start (transient race)
- Retry push on non-ff rejection (multi-writer convergence)
- Merge (not rebase) to sync — the true fix for the secret-set race
- Pass bot token straight to
agents add(no store round-trip race) - Wizard iteration — http-transport MCP authoring + skill ZIP upload
- 5 add-agent/list findings from the bench run
- Recover from detached HEAD so pusher mutations reach the remote
- Remove browser-use MCP — native
browser(CDP) is the one browser - Sops merge driver for secrets.sops.yaml + defaults + join UX
- Unified add progress bar, collapsed logs, host-shared key, zk default
- MCPs selectable as pi tools — materialize + wrap on activation
- Join age-recipient handoff + add/join/gateway UX
- Teams-gateway install --json + web relays it
- Gateway-install UI + standalone Catalog modal + UX pass
- Allow removing a dangling ref to an unknown job
- Join hosts into a shared gitops family (web wizard + ctl verbs)
- Tool catalog add + web mcp/cron/tool forms + uvx /var materialization
- Converge runtime MCP catalog into the overlay
- Mcp catalog add lands in the overlay; cron add --agent
- Author skills/subagents/hooks into the overlay (CLI + web)
- Reuse an existing shared secret as the API key
- Add
agents validate— lint recorded agents against add-time invariants - Filter dotfiles from catalog listers
- Add-agent button — capabilities + streaming add endpoints + modal
- Surface per-agent secret NAMES through collector + TUI
- --json across list commands, add/apply progress, add guards
v1.3.23 — 03 July 2026¶
- Chroma-highlighted workspace preview — shared renderer with the bundle
v1.3.22 — 03 July 2026¶
- In-modal bundle-style workspace tree with download links
v1.3.21 — 03 July 2026¶
- Geist-grade workspace bundle, markdown autolinks, compact-view hover-peek
v1.3.20 — 03 July 2026¶
- Compact status-grid view toggle in the web dashboard
- Compact highlighter — Chroma lexer, minimal spans, no size cap
- Fold a format-version into the hash so rendering changes re-publish
- Cap syntax highlighting at 24K to shrink the bundle
- Per-type rendering — Chroma highlighting, CSV/JSONL tables
- /workspace command — move the pin to a fresh message
- Telegram deep-link fetch, task lists, strip HTML comments
- Relative-link anchors, Geist folder icons, copy chips
- Render markdown tables + drop HTML comments
- Pure static HTML, no JS — works in Telegram's in-app viewer
- Surface per-agent secret key names (no values) in TUI + WebUI (#77)
- Fold template into content hash so UI changes re-publish
- Mobile-friendly explorer — breadcrumb drill-down, not Miller columns
- Pinned Telegram workspace explorer, refreshed on Stop
- Space the Explore workspace button off the metrics grid
v1.3.19 — 03 July 2026¶
- Color = status only — brand + runtime π to monochrome
- Redesign TUI + web dashboard in the Geist design language
v1.3.18 — 02 July 2026¶
- Don't render the workspace deploy key into agent-<user>.env
- Audio-mcp: add transcribe_audio_diarized (speaker diarization) path
v1.3.17 — 02 July 2026¶
- Workspace explorer — TUI cd-navigator + web Miller-columns file browser (#72)
v1.3.16 — 02 July 2026¶
- Sessions as a first-class def section (readable transcript) (#71)
v1.3.15 — 02 July 2026¶
- Host crons in TUI (picker + multi-host header); web list polish (#70)
v1.3.14 — 02 July 2026¶
- Memories section, compact-list detail view, host-cron clickable, binary guard (#69)
- Pass 4 does class-level memory consolidation
v1.3.13 — 02 July 2026¶
- Keep def view open across ticks; gofmt remote.go (CI red) (#68)
v1.3.12 — 02 July 2026¶
- TUI def resolves remote hosts; pretty-print skill frontmatter (#67)
v1.3.11 — 02 July 2026¶
- Scroll def list in TUI, quote SSH args, markdown viewer + pull scripts (#66)
- Bypass classifier for self-improvement crons
v1.3.10 — 02 July 2026¶
- Click/select skills·subagents·crons·hooks to read their definitions (#65)
- V2 — phased passes (orient → memory/skill extract → consolidate)
v1.3.9 — 02 July 2026¶
- Grant the admin agent write access to the /opt/agentctl overlay (#64)
v1.3.8 — 02 July 2026¶
- Bun symlink — also skip when the host-global source is absent
v1.3.7 — 02 July 2026¶
- Don't fail reconcile when an agent has a real bun binary
v1.3.6 — 02 July 2026¶
- Idempotent reconcile + hoist/parallelize/fingerprint plan (#62)
- Admin alerts silently dropped — nested owner_id + usercron OnFailure (#63)
v1.3.5 — 01 July 2026¶
- Include session transcripts in the per-agent backup (append-only, both runtimes) (#61)
v1.3.4 — 01 July 2026¶
- Use git ls-files -z so special-char filenames untrack correctly
v1.3.3 — 01 July 2026¶
- Case-insensitive video/audio patterns; back up images
- Agents manage their own secrets (secret set/get/remove --agent self) (#59)
v1.3.2 — 01 July 2026¶
- Push -u origin HEAD so first push on a fresh remote sets upstream
v1.3.1 — 01 July 2026¶
- Wire declared-but-unwired MCPs + reconcile by default (#58)
- Pin cron claude runs to standard context (disable 1M) (#57)
v1.3.0 — 01 July 2026¶
- Git remote + deploy-key CLI for per-agent + fleet backup repos (#56)
- Stability + clean-code pass: single ledger reader, cron levels, secret subtree, add-path dedup, README landscape (#51)
- Default .gitignore + prune helper (prereq for per-agent repos) (#55)
v1.2.15 — 01 July 2026¶
- Auto-writeback to origin on every commit, not just apply (#54)
v1.2.14 — 01 July 2026¶
- Drawer logs beside the info on wide screens (#53)
- Auto-insert blank line before markdown tables so they render (#52)
v1.2.13 — 30 June 2026¶
- Unify the multi-host web view into one grid with per-card host tags
v1.2.12 — 30 June 2026¶
- Wrapped watch lines kept their color on continuation lines
v1.2.11 — 30 June 2026¶
- Populate the detail drawer immediately on open
v1.2.10 — 30 June 2026¶
- --host watch broke when the web dashboard wraps the collector + drawer auto-close
v1.2.9 — 30 June 2026¶
- Web dashboard works under --host — proxy logs/watch to the owning host
v1.2.8 — 30 June 2026¶
- Show full per-agent skill/subagent/hook/cron lists in the drawer
v1.2.7 — 30 June 2026¶
- Stream the live session transcript in the detail drawer
- In-place dashboard updates, compact host bar, agent detail + live logs
v1.2.6 — 30 June 2026¶
- Single-binary local web dashboard over SSE (#50)
- Reject a --skill host cron (root has no agent/LLM context)
v1.2.5 — 30 June 2026¶
- Guard runs on auth failures (stop logged-out agent spam) (#48)
v1.2.4 — 30 June 2026¶
- Omit host.provisioned when false; skip an empty host: block
- Drop the systemd journal tail from failure messages
v1.2.3 — 29 June 2026¶
- Ship build-window.sh + wire cron prep (was always 0 sessions)
- Per-user REPL port + log so agents don't collide (#45)
v1.2.2 — 29 June 2026¶
- Hook provenance — bare vendored commands (e.g. rtk) are deb, not loc
v1.2.1 — 29 June 2026¶
- List hooks (name + event + provenance) in the agent detail pane
v1.2.0 — 29 June 2026¶
- Teams/pi: checksum-compare the bridge stage so only real byte changes restart
- Teams/pi: restart the bridge when apply re-stages changed bridge code
- Render the tool/status line on its own line (not inline)
- Teams gateway: show animated working indicator from turn dispatch
- Conflict-marker commit/push guards + host rename + multi-host docs
- RecordAgent inserts into agents: block, not EOF (agent-b-in-hosts bug)
- Fix sops updatekeys config discovery (global --config flag)
- Pin host on agent add + ensure age key on apply (multi-host join fixes)
- Drop committed host.name; host identity is always os.Hostname()
- Correct + churn-free sops re-wrap ordering (multi-writer)
- Queue mid-turn messages silently (drop the 'queued' ack)
- Synchronous tool-socket reply + manifest supportsFiles:true
- Tool-reply delivery, inbound HTML noise, mid-turn message queuing
- Rich messaging — agent sends images/files (attachments both directions)
- Private-bind cross-host register + init --git join + apply writeback
- Restart/stop-self/logs are runtime-aware (pi-agent@ vs agent@)
- ASCII ellipsis in push echo (macOS bash 3.2 multibyte $var bug)
- Add manifest icons (L1D logo) — color 192x192 + outline 32x32
- Prerelease-from-branch — ship a real .deb without touching prod channels
- Teams+sops: reconstruct teams agents from the ledger + auto-commit re-wrap
- Containerize the gateway + GHCR image workflow
- Updatekeys re-wrap via .sops.yaml rule, not a --age flag
- Per-agent cross-host register URL (wss://<gateway>/register)
- Run-scope host filter + multi-recipient sops re-wrap
- Multi-host: per-agent host: field + host.name/hosts ledger helpers
- Real botbuilder auth boundary (inbound JWT + outbound Entra token)
- Apply reconciles the teams-bridge ledger (CI-ready)
- Render per-agent env unconditionally in the claude path
- Gateway binds loopback + TEAMS_AGENTS=[] not null + teams-run HOME guard; sink handles plain messages
- Reset cred via systemd drop-in instead of a placeholder secret
- Agentctl provisioning — agents add --channel teams + teams-bridge (phase 5)
- BridgeChannel + gateway + sink, no-Azure e2e green (phases 2-3)
- Scaffold templated Teams app manifest
v1.1.27 — 29 June 2026¶
- Timer must not pull its service on enable (off-schedule catch-up)
v1.1.26 — 28 June 2026¶
- Chat_id forward reconcile in apply (declared → agent.env)
- Agents set verb, apply --prune, migrate hooks/usercron carry
- Back-fill owner_id + chat_id into agents.yaml on apply
v1.1.25 — 28 June 2026¶
- Secret get --agent resolves per-agent secrets
v1.1.24 — 28 June 2026¶
- Admin agent can name other agents for local read-only verbs
- Make per-user custom crons declarative (record + reconcile)
v1.1.23 — 28 June 2026¶
- Stop browser@ crash-loop disk bleed (xvfb recovery + StartLimit) (#37)
v1.1.21 — 26 June 2026¶
- Cap host tag at 8 cols + π runtime glyph; stop card wrap (#35)
v1.1.20 — 26 June 2026¶
- Cut-release.sh — bump + tag + push to trigger the release workflow
- Claude --api-key → ANTHROPIC_API_KEY (zero-touch, no OAuth)
- Read canonical /opt/agentctl/agents.yaml, not legacy fleet.yaml
- Buttery live-typing via sendRichMessageDraft (the Hermes approach)
- Paced draft reveal for smoother live-typing
v1.1.19 — 26 June 2026¶
- Finalize via native sendRichMessage only — drop HTML + chunking
- Always render rich Telegram output; fix telegram tool HTML send
- Truncate host tag to fit the card so a long hostname never wraps
- Ship tools/ catalog through packaging/payload
- Template ~/AGENTS.md so the agent's name is seeded (not 'a_user')
- Add default 'recall' skill — how to read previous sessions + memory
- SKILL.md invokes the tool by its PATH command name, not ./cli.sh
- Never write through a same-named skill symlink (catalog corruption)
- Wrap-mcp: never overwrite or shadow a tool with a converted MCP
- Mcp add: runtime-aware — wrap+wire MCPs as tools for pi agents
- Tool wrap-mcp: manifest-driven, support http MCPs via mcp-remote bridge
- Make pi clitools, owner_id, admin + host watchdog declarative & reconciled
- Auto-transcode voice notes to OGG/OPUS via ffmpeg
- Add pi telegram tool for proactive media sends
- Make provider/model declarative in agents.yaml, reconciled by apply
- Simplify the no-reply message, drop Groq-specific wording
v1.1.13 — 26 June 2026¶
- Tolerate rotated host keys in --host SSH (read-only viewer)
- Runtime-aware migrate (pi support)
v1.1.12 — 26 June 2026¶
- --model pins PI_PROVIDER/PI_MODEL for a pi agent (1.1.12)
- Preview host-cron seed/prune in the plan (parity with -cron)
- Watch (log view) works over --host via SSH event stream
- Pi liveness glob (cwd-subdir sessions) + show tool file path + no host wrap
- Version-gated re-provision + cron-removal delta (1.1.11)
v1.1.10 — 26 June 2026¶
- Drop Requires= from timer units — THE catch-up root cause (1.1.10)
v1.1.9 — 26 June 2026¶
- Pi-runtime: vendor mcptools so wrap-mcp tools actually work (1.1.9)
- Pi-runtime: follow-ups — top badges pi-aware + scaffold AGENTS.md (1.1.7)
- Pi-runtime: fix cron-runner — export model override + surface real errors
- Pi-runtime: Chunk 7 — docs + CLI-help alignment for pi
- Pi-runtime: browser — tool + skill rename (cdp→browser) + browser@ for pi
- Pi-runtime: Chunk 5.6 — GitOps overlay parity + catalog/→tools/ rename
- Pi-runtime: Chunk 5.5 — pi parity: crons + zk + memory
- Pi-runtime: Chunk 6 — OAuth subscription login (login pi)
- Pi-runtime: bridge — rich (HTML) finalize, plain stream
- Pi-runtime: Chunk 5 — surviving hooks as pi extensions + irreversible floor
- Pi-runtime: finding #8 — make apply + skill-link runtime-aware
- Pi-runtime: bridge — serialize draft pushes + 429 backoff (fix flood)
- Pi-runtime: bridge streams via native Telegram drafts (sendMessageDraft)
- Pi-runtime: Chunk 5 (part) — runtime-aware skills wiring for pi agents
- Pi-runtime: fix 6 droplet-test findings + VALIDATE Chunk 4 schema
- Pi-runtime: Chunk 4 — observability adapters (top/usage read pi sessions)
- Pi-runtime: fix nfpm pi-run.sh content collision
- Pi-runtime: Chunk 3 — the
toolverb + pi CLI tool catalog (MCP replacement) - Pi-runtime: Chunk 2 — host-side provisioning for pi agents
- Runtime spine — telegram↔pi-SDK bridge + agent unit (Chunk 1)
- Ynab as a native CLI (pi tool) — direct YNAB API, no MCP
v1.1.8 — 26 June 2026¶
- --host is remotes-only + surface remote stderr (1.1.8)
v1.1.7 — 26 June 2026¶
- Pi-runtime: follow-ups — top badges pi-aware + scaffold AGENTS.md (1.1.7)
- Pi-runtime: fix cron-runner — export model override + surface real errors
- Pi-runtime: Chunk 7 — docs + CLI-help alignment for pi
- Pi-runtime: browser — tool + skill rename (cdp→browser) + browser@ for pi
- Pi-runtime: Chunk 5.6 — GitOps overlay parity + catalog/→tools/ rename
- Pi-runtime: Chunk 5.5 — pi parity: crons + zk + memory
- Pi-runtime: Chunk 6 — OAuth subscription login (login pi)
- Pi-runtime: bridge — rich (HTML) finalize, plain stream
- Pi-runtime: Chunk 5 — surviving hooks as pi extensions + irreversible floor
- Pi-runtime: finding #8 — make apply + skill-link runtime-aware
- Pi-runtime: bridge — serialize draft pushes + 429 backoff (fix flood)
- Pi-runtime: bridge streams via native Telegram drafts (sendMessageDraft)
- Pi-runtime: Chunk 5 (part) — runtime-aware skills wiring for pi agents
- Pi-runtime: fix 6 droplet-test findings + VALIDATE Chunk 4 schema
- Pi-runtime: Chunk 4 — observability adapters (top/usage read pi sessions)
- Pi-runtime: fix nfpm pi-run.sh content collision
- Pi-runtime: Chunk 3 — the
toolverb + pi CLI tool catalog (MCP replacement) - Pi-runtime: Chunk 2 — host-side provisioning for pi agents
- Runtime spine — telegram↔pi-SDK bridge + agent unit (Chunk 1)
- Ynab as a native CLI (pi tool) — direct YNAB API, no MCP
v1.1.6 — 26 June 2026¶
- Self-heal managed-unit drop-ins + cron-template ordering (1.1.6)
v1.1.5 — 26 June 2026¶
- Sign apt repo + deb in CI (import AGENTCTL_GPG key)
v1.1.4 — 25 June 2026¶
- Containerized apt + brew repo server, built by CI, served on srv
- Converge shipped cron unit templates (propagate timer/unit changes)
v1.1.2 — 25 June 2026¶
- Host crons: seed into ledgers with no host: block + stop digest catch-up (#16)
v1.1.1 — 25 June 2026¶
- Default host crons: seed into host.cron + reconcile like skills (#14)
v1.1.0 — 25 June 2026¶
- Multi-host fleet view over SSH
v1.0.4 — 25 June 2026¶
- Cron add --host: point ExecStart at the durable overlay copy (#13)
v1.0.3 — 25 June 2026¶
- Declarative host crons: ledger-recorded + apply-reconciled (like skills) (#12)
v1.0.2 — 25 June 2026¶
- Host crons: source shared secret env + document the pattern in the agentctl skill (#11)
v1.0.1 — 25 June 2026¶
- Deterministic token-usage digest, opt-in cron, and top cron-count (#10)
v1.0.0 — 25 June 2026¶
- Admin agent can snapshot the full fleet via agentd (rc27)
- Show hooks count (hk) on the card next to mcp/sk/cr (rc26)
- CLI fleet gates honor agentd's authorization (rc25)
- Size snapshot dynamically to agent count + trim to content (rc24)
- Non-interactive --once / --snapshot; retire commander (rc23)
- RATE-LIMITED badge on the card (rc22)
- Deliver via events.sock + robust recent-tail detection
- Responsive cards that fill the row + stretched activity strip
- Never permanently give up on 409 (port from main b6b37ad)
- Pulse mcp/sk/cr + host crons when in use (rc19)
- Blink grace window + wider card so height stays uniform (rc18)
- Extend agentExists gate to login, secret set, agents restart (rc17)
- Reject 'mcp add' to a non-agent target (rc16)
- Compact no-creds marker so cards never wrap (rc15)
- Self-authored ynab MCP with transfers + approve + bulk (rc14)
- Create the repo dir on a fresh host (rc13)
- Force color profile under sudo + activity-strip/glyph clarity (rc12)
- Activity-first redesign + grid scrolling + http-mcp & watch fixes (rc11)
- Live full-screen fleet dashboard (agentctl top)
- Self-serve
cron add— schedule any skill/script as a timer (m96, rc9) - Honor the repo overlay for skills/subagents (m92, rc6)
- Chown entire dest home to the new agent
- Exclude legacy .zk/templates symlink + non-fatal workspace/transcripts (m91, rc4)
- Git tag sanitizes ~ -> - (m90)
- Config+audit check uses gitDir() not /etc (m89, rc3)
- Ynab is per_user so its API token scopes to one agent (m88, rc2)
- New-agent: add l1d ms365 send-gating step (sessions f5aaaade, 5df4eb1a)
- New-agent skill: ms365 L1D client-id/tenant, login-shell helpers, fresh-agent plugin-pin restart
- Examples/agents.l1d: add danielp (Daniel Perroud) agent
- Decommission opencode/openai agent (drop block; services stopped+disabled, user removed)
- New-agent skill: document self-serve Telegram /login as preferred Claude sign-in
- Macos/start-agent: ASCII-safe poller-clear echo (bash 3.2 syntax fix)
- Telegram-plugin: never permanently give up on 409 (poll-loop death fix)