Custody Transfer artifact sources¶
Two published pages carry the Custody Transfer plan. Until 2026-09-13 their only editable copies
lived in a session scratchpad under /private/tmp, which does not survive the session — so the
published page was the sole source of truth. These files fix that.
| File | Publishes to | What it is |
|---|---|---|
release-plan.html |
https://claude.ai/code/artifact/a0fcca2f-49e3-4574-806b-653b4fa0b4e4 | The plan and the live status tracker. 23 releases, 110 slices, 14 operator gates. |
proposal.html |
https://claude.ai/code/artifact/3ab34375-35e3-439e-b07e-4508a582066b | The why, with the five diagrams. |
execution-guide.md |
not published | How to ship one slice. Read this first. |
Republishing¶
Edit the file, then publish it with the Artifact tool passing the URL above as url. Publishing
without url from a conversation that did not publish the artifact creates a separate artifact
instead of updating this one, which is how you end up with two trackers and no idea which is live.
A conversation that has not read or published a given artifact is refused on publish; read it first
(action: "read" with its url) and build the edit on what comes back, so a change made from
another session is not silently discarded.
Trap 1 — omit capabilities, or the tracker goes dark¶
release-plan.html declares the db capability. That is what makes the live status work: the
banner, the per-slice pills, the lane progress bars and the fourteen gate ticks all read from the
artifact database, not from the file.
Omitting capabilities on republish carries the stored declaration forward. Passing a
non-empty object is a full-set declaration, so anything not restated is revoked — pass
{db: {}} or nothing at all. Passing {} clears it outright and every live field goes blank.
Trap 2 — the gate wording is in the file, not the database¶
GATES_DATA in release-plan.html holds all fourteen gate descriptions as a hard-coded array.
Only done and at come from the gates/<n> documents. Writing a note field to a gate document
does nothing visible. To change what a gate says, edit this file and republish.
What lives in the database rather than here¶
Written by Claude with the Artifact tool's write_db, read back with read_db:
status/<sliceId>→{state, pr, note, at}wherestateisdone|wip|review|blocked. A slice with no document renders as todo.gates/<1..14>→{done, at, by}. The operator ticks these in the page himself — read them, never overwrite adone: truewithout being asked.meta/current→{updated, by, headline, working, next, blocked}. The handoff banner at the top of the page. Update it at the end of every working session; it is what a fresh session reads to know where things stand.
Known drift, 2026-09-13¶
These files are byte-exact mirrors of what is published, deliberately — a repo copy that silently differs from the live page is worse than one that matches, because then neither is authoritative. Two things are consequently stale in both, and should be corrected on the next republish:
proposal.htmlsays "One release credential expired in May and its rotation is still pending", as an illustration of pre-existing backlog. That rotation has since completed: theRELEASE_PATwas migrated to areview-e-botApp token across all sevendashe-*repos, and its deadline is closed. The point it illustrates still stands; the example no longer does. Note thatCLAUDE.mdcarries the same stale claim.release-plan.htmlwas corrected on 2026-09-13 to withdraw a false TestFlight deadline that had been driving lane prioritisation. Builds 9 and 10 run to 8 and 9 December; only the superseded builds 1-8 expire on 19 September. If you find that claim anywhere else, it is wrong.