What #
Every runnable command now declares whether it writes:
writes: 'network'— changes state on the network: your account, or something other people can see (post,reply,quote,delete,like/unlike,repost/unrepost,bookmark add/remove,gate,profile update/pin/unpin,follow/unfollow,block/unblock,mute/unmute, the list commands,feed save/unsave/pin/unpin,notifications seen, every chat mutation,record create/put/delete,upload,report).writes: 'local'— writes only this machine's state: sessions, config, the shell's startup file (login,logout,account remove/default/refresh,config set/unset/forget,skill install,completion --install/--uninstall).writes: false— reads only.
xrpc is classified as a network write with an extra line in every document: whether it writes depends on the method — queries (GET) read, procedures (POST) write.
Why #
An agent that cannot tell reading from writing will eventually publish by accident. This came out of a real one: an agent ran atcli post <at-uri> believing post was a read ("show this post") and created a junk post; the same session had been silently mis-classifying actions all morning. Every document an agent might read should answer "does this write?" without guessing from the summary line.
How #
CommandSpecgainswrites?: false | 'network' | 'local', set on every runnable command (91 of them, including the helper-generated families:toggle→ like/unlike/repost/unrepost,relationCommand→ follow/unfollow/block/unblock,saveCommand→ feed save/unsave/pin/unpin,convoAction,reaction,interactions,actorList).src/reference.tsrenders a marker line under each writing command's summary, and a "Which commands write" section up top of the generated reference. It refuses to generate while any runnable command lacks the declaration, so a future command cannot silently skip classification — the generation step (andnpm test's currency check) fails until it is classified.skills/atcli/SKILL.mdgains a Which commands write section: a table of every network write with what it does, a table of the local writes, and the xrpc caveat. Ground rule 4 (ask before acting in public) now points at it.README.mdgains a What writes section with the same three kinds.
Tests #
npm run typecheckclean.npm test: 67/67 pass (includes the reference-currency check against the regeneratedskills/atcli/reference.md).