11# v0.5.0
22
3- Breaking. Six commands are gone and ` expose ` refuses to run without a grantee.
3+ Breaking. The CLI is overhauled: six commands are replaced, and ` expose ` now
4+ requires a grantee.
45
56## Where this came from
67
7- The commands came last.
8+ The CLI had grown organically. A feature landed, a command arrived with it, and
9+ each one made sense next to the one before. Nobody had looked at the whole
10+ surface in a while. By 0.4 there were five commands covering a single job,
11+ getting two machines to talk to each other: ` ticket ` , ` grant-token ` , ` add-peer ` ,
12+ ` pin ` , ` remove-peer ` .
813
9- We started by writing ` docs/scenarios.md ` : two flows spelled out end to end from
10- the operator's side, before touching any code. The first was reaching a shared
11- build box from a laptop that was already running a daemon of its own .
14+ So we stopped adding to it and sat down with ` docs/scenarios.md ` instead. Two
15+ real flows, spelled out end to end from the operator's side, every command a
16+ person types, in order, across both machines .
1217
13- It did not work. Two values had to travel out of band, a key and a token, and
14- they were always used together. ` add-peer ` could not present a token. ` --enroll `
15- existed only on ` pai-sho daemon ` , so a laptop already serving other peers had to
16- restart to admit one more. None of that was news to the code. It became obvious
17- the moment someone had to write down what a person actually types, in order,
18- across two machines .
18+ The first flow did not work. Reaching a shared build box from a laptop already
19+ running a daemon meant two values travelling out of band, a key and a token,
20+ always used together. ` add-peer ` could not present a token. ` --enroll ` existed
21+ only on ` pai-sho daemon ` , so a laptop already serving other peers had to restart
22+ to admit one more. None of this was hidden in the code. It just never came up
23+ until someone had to write down what you actually type .
1924
20- Then the names went through several rounds. ` pin ` was tried and dropped. So were
25+ The names took several rounds. ` pin ` was tried and dropped, along with
2126` grant-key ` and ` allow ` /` connect ` . Each described a mechanism rather than the
2227thing happening, which is closer to: hi, be friends. And: yeah, be friends. That
2328is ` invite ` and ` accept ` , and once the pair had honest names the rest followed.
@@ -95,6 +100,8 @@ replacing the grant check with `if true` fails five tests.
95100
96101## Raw commits
97102
103+ * refactor: overhaul the cli api, from the scenarios up (2026-08-19)
104+ * docs: a narrative for how the CLI fell out of the scenarios (2026-08-19)
98105* docs: absolute links in the changelog, and 0003's name note up top (2026-08-19)
99106* docs: lead the tagline's list with no account (2026-08-19)
100107* refactor: move grants into the pure core, and give the model one home (2026-08-19)
@@ -111,4 +118,3 @@ replacing the grant check with `if true` fails five tests.
111118* refactor: pure core for admission and authorization, and expose requires a grantee (#10 ) (2026-08-18)
112119* docs: macOS supervised operator via brew services, with the trust/XDG note (2026-08-07)
113120* chore: bump to v0.4.2-dev (2026-08-07)
114- * docs: a narrative for how the CLI fell out of the scenarios (2026-08-19)
0 commit comments