docs: the publish skill teaches stele amend, which now exists - #23
Conversation
The skill served at `GET /skill` told agents that `stele` has no rename command and no retime command, that a lifetime is "still chosen once, at publication", and that a user wanting either "is asking for a newer `stele`". True when 570b375 shipped the route. False as of stele-cli#5, which added `stele amend`. That is the exact failure this document has already had once, in the opposite direction: `--ttl` shipped in the client while the prose still read "`stele publish` does not expose this yet", so an agent refused a permanent page over a flag that already existed, citing a limitation confident enough to read as policy. Leaving these sentences would have reproduced it verb for verb. The "Renaming a page, and changing its deadline" section now documents the command instead of its absence, and leads with the two things an agent gets wrong by carrying over what it knows from `publish`: - omitting `--ttl` leaves the deadline alone rather than applying the default, so a rename does not quietly put seven days on a page published to be kept; - dropping `--slug` is not the escape from a `409` that it is on a publish, because there it asks for a generated name and here it asks for no rename. `doesNotClaimALifetimeIsUnchangeable` grew a third time, and the reason is the point: when the server learned to retime a page, every absolute claim became a claim about the client — "no command you can run" — which was honest for exactly as long as it was true. The client-scoped hedge is not a safer way to say it, it is the same claim with a shorter shelf life. Both spellings are in the sieve now. `minimumCLIVersion` is deliberately NOT raised. A 0.2.0 client's wire behaviour is unchanged — it simply lacks a subcommand — and this file's own policy says to raise the gate when the wire contract moves, not when the CLI gains a feature. Gating every write, including the publishes that still work perfectly, would be a disproportionate answer to a missing subcommand. What an old client gets instead is documented: an unknown-command error, whose fix is a reinstall rather than a rewording, which is a sentence the suite now pins. Also updates `SteleCLI.exits`' code-5 remedy, which is a hand-checked transcription of the client's exit table and had drifted — "omit it and take a generated one" is advice `stele amend` cannot act on. 309 tests pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qEtLbpPoxtUtucznPohMG
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Free Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughThe PR documents ChangesAmend command documentation
Estimated code review effort: 2 (Simple) | ~10 minutes Poem
Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login. Comment |
Companion to stele-cli#5, which adds
stele amend.The problem
The document served at
GET /skill— the onestele skillproxies verbatim into an agent's context — currently states:…along with "no command you can run will change it afterwards", "nothing you can run changes it once the page exists", and that a user wanting a rename "is asking for a newer
stele".All true when
570b375shipped the route. All false once stele-cli#5 merges.This is the same failure this document has already had once, running the other way:
--ttlshipped in the client while the prose still read "stele publishdoes not expose this yet", so an agent refused a permanent page over a flag that already existed — and the refusal read as considered policy rather than a stale sentence.documentsEveryFlagTheAgentCanUseexists because of that incident. Leaving these sentences in place would have reproduced it verb for verb.What changed
"Renaming a page, and changing its deadline" documents the command instead of its absence, leading with the two things an agent gets wrong by carrying over what it knows from
publish:--ttlleaves the deadline alone, rather than applying the default — so a rename does not quietly put 7 days on a page somebody published to keep.--slugis not the escape from a409that it is on a publish: there it asks for a generated name, here it asks for no rename at all.Plus the hard-move warning (kept verbatim,
documentsThatRenamingReleasesTheOldNamepins it), the commands table, the route table row, and the four scattered permanence claims.minimumCLIVersionis deliberately not raisedWorth stating plainly, since it was considered and rejected. This file's own policy:
A 0.2.0 client's wire behaviour is unchanged; it simply lacks a subcommand. Gating every write — including the publishes that still work perfectly — would be a disproportionate answer, and would break publishing on every machine in the field until each was reinstalled.
What an old client gets instead is now documented:
stele amendfails with an unknown-command error carrying no exit code from the table, and the skill says outright that the fix is a reinstall rather than a rewording. That sentence is the entire mitigation, so the suite pins it.This also keeps
mentionsExactlyTheMinimumCLIVersionintact — the document still contains exactly one version string, the one in the426row.Tests
documentsTheAmendRouteinverts: the assertions that pinned the absence of the command are the lie now, so they are replaced by ones pinning the command and the two inverted defaults.doesNotClaimALifetimeIsUnchangeablegrew a third time, and that is the interesting part. When the server learned to retime a page, every absolute claim became a claim about the client — "no command you can run" — honest for exactly as long as it was true. The client-scoped hedge is not a safer way to say it; it is the same claim with a shorter shelf life. Both spellings are in the sieve now.One mechanical lesson recorded in
CLAUDE.md: the markdown is a wrapped raw string, so an assertion phrase straddling a line break cannot be pinned at all. One of my new assertions failed exactly that way. Prose carrying an assertion gets reflowed to keep the claim on one line — not the reverse.Also fixes
SteleCLI.exits' code-5 remedy, a hand-checked transcription of the client's exit table that had drifted: "omit it and take a generated one" is advicestele amendcannot act on.309 tests pass.
Merge order
🤖 Generated with Claude Code
https://claude.ai/code/session_018qEtLbpPoxtUtucznPohMG
Summary by CodeRabbit
stele amendcommand for renaming pages and changing deadlines.