Repository navigation
koto 1.7.2
Important
Upgrading from 1.7.1 or earlier: koto update fails on this release with SHA256SUMS names koto-version:, which is not a x86_64 asset. The 1.7.2 SHA256SUMS is now bound to its version by a # koto-version: 1.7.2 line, and installers before 1.7.2 cannot parse that line. Nothing is installed when it fails. Upgrade once with the 1.7.2 installer, pinned to the tag:
curl -fsSL https://raw.githubusercontent.com/jpzk/koto/1.7.2/install.sh | sh -s -- --version 1.7.2
From 1.7.2 on, koto update works again.
koto 1.7.2
Security hardening (#76, #78)
- This release has security hardening across the daemon, proxy, installer, TUI and guest agent. Advisories will be published after the release. Upgrade recommended.
- Details are held back until the advisories are public.
Installer: refuses releases older than 1.7.2 (#76)
- From now on,
make distwrites a# koto-version: X.Y.Zline at the top of SHA256SUMS, so the signature covers the version number. install.sh(and thereforekoto update) refuses a SHA256SUMS that does not name exactly the version you asked for. Releases signed before 1.7.2 have no such line, so this installer refuses them. That is intentional: it is rollback protection. To go back to an older release, use that release's own installer.latestis resolved to a concrete tag before anything is downloaded. A mirror (KOTO_BASE_URL) now needs an explicit--version.- A release must contain all five assets (koto, koto-tui, firecracker, vmlinux, rootfs.img), each exactly once, with koto and koto-tui at the requested version. Otherwise nothing is installed.
Workspace resize happens inside the guest (#78)
- When a workspace disk is enlarged, the host now only extends the sparse image file. The guest grows its own filesystem online after
/workspaceis mounted (best effort, with a timeout; on failure boot continues at the old size and the error is logged). - The host no longer needs e2fsprogs resize tools for this.
mkfs.ext4is still used when a workspace is first created. - Needs the 1.7.2 rootfs. A guest still on an older rootfs will not grow its filesystem after a resize.
koto installwith 1.7.2 installs the matching rootfs.
TUI: Nerd Font glyphs for every pictograph (#75)
- One icon table now drives the tree dots, transcript glyphs, notification bell, queue badge, goal/schedule lifecycle lines and ok/err marks, extending the session-row icons from 1.7.1.
- Nerd Font forms keep the same cell width as the plain forms.
KOTO_TUI_NERDFONT=0gives output byte-identical to 1.7.1's plain glyphs, and black-and-white mode folds every Nerd Font codepoint.
TUI: agents tree scrolls with its cursor (#77)
- On short terminals the tree used to be cut off at the bottom of the pane, and the cursor could move onto rows that were never drawn, so part of the fleet could not be reached.
- The tree pane now shows a window that moves only when the cursor would leave it (pager style, no recentering). Dim
↑ N more/↓ N moremarkers show hidden rows. Clicks, resizes and folds stay in sync with what is drawn. - Also fixes the fleet view's height calculation, which disagreed with the height the layout gave the tree.
Assets
- koto: rebuilt (#76, #78). Same pinned go1.26.10 build image as 1.7.0/1.7.1.
- koto-tui: rebuilt (#75, #76, #77). Same pinned go1.26.10 build image.
- rootfs.img (fedora44): rebuilt, because the guest agent changed (#78). The rootfs recipe (Dockerfile.rootfs, build scripts, pinned base image, pinned RPMs and agent tarballs) is unchanged since 1.7.0. The main package install resolves from the Fedora repos at build time, so package builds may differ from the 1.7.1 rootfs; see Tests for the comparison.
- vmlinux 6.1.188, firecracker 1.17.0: the 1.7.1 assets, reused byte-for-byte. They were downloaded from release 1.7.1 and checked against its signed SHA256SUMS.
- No dependency changes since 1.7.1: go.mod, go.sum, go.work and package*.json are identical to tag 1.7.1.
Tests
- On release/1.7.2 @3ae74a3 (d06c5f0 = develop with #75, #76, #77, #78, plus the DIST_VERSION bump) with the go1.26.10 image: gofmt is clean on every .go file changed since 1.7.1, and build and vet pass for all 4 modules. go test for tui, protocol, fcguest and daemon passes on the first full run (daemon 248.7s, tui 21.9s, fcguest 7.0s). The only later commit is the artifacts.sha256 manifest update, which changes no code.
- rootfs check: the built rootfs contains resize2fs and the go1.26.10 guest agent (checked with debugfs). Its package set is identical to the 1.7.1 rootfs (278 packages). The end-to-end smoke run (claude-wan, claude-none, minimax) was skipped for this release on operator decision. The candidate is installed and the daemon is up (
koto ctl listok).
Known issues
- The goal-finished notification banner is not session-scoped. The handoff turn goes to the origin session, but the operator banner is raised against the group as a whole (
goalNotifypasses no session, daemon/goals.go:1665). TestOtelUnreachableReceiverNeverBlocksis slow (about 2 minutes of the daemon test run). It measures wall-clock p99 latency, so it can flake on a heavily loaded host.TestFcGrowWorkspaceImgOnlyTruncatesdepends on the host disk being under 90% full, because the disk-admission guard is not stubbed in that test.TestStopDisarmsTheReportWindowfails rarely, with no message, under full-suite ordering (1 of 5 full runs). It passes 5/5 in isolation and in the other 4 full runs. Suspected cause: a race between tests over a TempDir or global path.- Guest boot has a fixed 30s limit. On a heavily loaded host a guest can miss it and the send fails with a boot timeout. Retrying once the load drops works.
- GO-2026-5932 (golang.org/x/crypto/openpgp) still shows up in dependency scans. govulncheck finds the vulnerable code is not reachable, and there is no fixed version upstream.
- Carried over from 1.6.0:
koto ctl historycan return a partially written reply if it is polled while the reply is still being written. Accept a reply only once it is stable across two polls.
🤖 Generated with Claude Code