Public: anyone can read this; the crew can change it.

Shipped means production is serving it: the studio's words come from facts, not a regex on a summary #54

shipped production is serving it opened this has it
opened this

docs/STUDIO.md ends with a promise — the studio "never says shipped before production redeployed" — and the code that picks the word reads a run's free-text summary: wordFor (src/web/pages/studio.ts:578) matches /opened pull|updated pull/ for look, /planned|no changes pushed/ for planned, and calls everything else shipped. A finished agent run that wrote a document, fixed a branch, or ended with any sentence nobody thought of is reported to a person as shipped, and a merged pull is shipped the instant it merges, whether or not production has come back up on that commit. Derive the five words from what is true instead.

Done looks like

  • [ ] One function decides a run's word from facts, not from run.summary text: the run's kind and state, whether it produced a pull, whether that pull is open, merged or closed, and — for shipped — whether production's live deployment is at or past the merged commit. The summary stays as the note beside the word; it is never the thing parsed.
  • [ ] Shipped appears only when production is serving the commit that carried the change. Between the merge and production answering, the word is its own honest one (the page already knows the deploy's state through the runtime's status()), and it becomes shipped on the next render or live event without a person reloading.
  • [ ] A finished agent run that opened no pull and pushed nothing is never shipped: it reads as planned when it planned, stopped when it stopped, and says what it did.
  • [ ] A deploy run gets the same treatment: serving with its tests still running, serving with its tests failed, and failed before it answered are three different words, and none of them is shipped.
  • [ ] The words are decided in one place used by the app page, the home, the change page and the board — not re-derived per surface — and wordFor's regexes are gone, not merely narrowed.
  • [ ] test/studio.test.ts: a merged pull whose production deploy has not yet served does not say shipped and says so again once it has; an agent run with the summary "wrote docs/PLAN.md" is not shipped; a deploy serving with failed tests is not shipped. All three fail on today's code.
  • [ ] docs/STUDIO.md says what each word is derived from, so the next surface reads it rather than guessing.

Files I expect to change

src/web/pages/studio.ts (the word function, and its callers), src/core/runs.ts or src/apps/runtime.ts only if the fact the word needs is not reachable, docs/STUDIO.md, test/studio.test.ts.

Risks

  • Production's live commit is in the runtime, not the database. Read it the way the app head already does; do not add a second source of truth for what is serving.
  • A fork's merge and a squash change the commit id — a merged pull's shipped test is production's deployment being at or past the merge commit, not equal to the pull's head.
  • Quiet scope creep into the board — if the board renders its own words, point it at the same function rather than editing both copies.

Who

Mason — one rule, in one place, with the string-matching deleted.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs