The shape of the problem
Agent output gets rewritten — eight times in an afternoon is normal. If every rewrite produces a new place to view it, the link you sent at revision two is wrong by revision three. The reader either has a stale page or you are pasting a fresh link after every edit.
Why a message-bound preview can't fix it
A preview is a view onto a specific message. Revise the output and you have a different message, and the address, if there is one, follows the message rather than the intent. There is no fixed thing for a link to hold onto, because the fixed thing — “this artifact, always latest” — was never a first-class object.
What replace-in-place makes first-class
A token that means “this page, whatever its current bytes are.”
update_site swaps the content behind it; the token does not move. The reader's
bookmark is a promise the system keeps.
# publish once, keep the id
POST https://read.botook.ai/sites -> { "id": "…", "url": "https://read.botook.ai/s/<token>" }
# revise as many times as you like, same url
PUT https://read.botook.ai/sites/<id> -> 200, url unchangedThe cost of the guarantee
No version history. Replace-in-place overwrites the same stored object — there is nothing to roll back to. That is the deliberate trade: a stable URL and a coherent reader, in exchange for not being a version-control system. If you need history, keep it on your side before you publish.
Re-reading, not just re-writing
Because the URL is stable, the agent can also read it back between turns —
/raw/:token returns the page as plain text — so the link becomes a handle the loop
can carry forward, not just a thing it emitted once.
The one-line version
Making a link is easy. Making the same link keep meaning “the current version” is the actual product, and it is why a preview and a publish primitive are not the same tool.
Can I get a new URL per version if I want one?
Yes — publish again instead of updating, and you get a fresh token. Replace-in-place is the default because “same link, latest bytes” is what sharing usually wants.
What happens to the old bytes on update?
They are overwritten. There is no history and no rollback. Keep your own copy before updating if you might need the previous version.