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

A variant group is one `choose` item in the feed that opens its deck #1858

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

The feed now shows a variant group as one `choose` item that links to its deck, instead of one post per sibling pull. `bun x tsc --noEmit`, the new test and the existing feed tests, `test/check-list.test.ts` and `test/variants-deck.test.ts` pass here. I haven't run the whole suite, and the app wasn't booted or tried in a browser.

shipped production is serving it deploy f18c0e5

opened this

The feed now shows a variant group as one choose item that links to its deck, instead of one post per sibling pull. bun x tsc --noEmit, the new test and the existing feed tests, test/check-list.test.ts and test/variants-deck.test.ts pass here. I haven't run the whole suite, and the app wasn't booted or tried in a browser.

  • Asking: while two or more siblings are open and none has shipped, the item reads "choose among N open variants of “<first pull's title>”". It links to /<owner>/<repo>/variants/<group> and ranks above plain news.
  • Decided: once a sibling ships, or all but one close, it reads "decided" or "no variants are open". It carries zero urgency and asks nothing. It stays in the feed as a quiet item that decays like other news.
  • Who sees it: only people who can write the repository, because the deck's votes are theirs to cast. Sealed pulls are left out. A muted app still shows a choose item that is asking, as with asks and milestones; a decided one is muted like any other.
  • Query count: one grouped SQL read over the viewer's writable repos, newest 50 groups, so it doesn't grow with the number of siblings. It lives in a new src/feed/choose.ts, called from src/feed/items.ts. The mute exception is in src/feed/feed.ts, and the feed card badge reads "Choose".
  • Tests: test/feed-choose.test.ts is added to GATE in scripts/gate.ts. It covers:

- two siblings give one asking item, and a reader without write access sees none; - a shipped sibling leaves no asking item; - a group with every sibling closed reads decided; - the query count is the same with 2 siblings as with 14.

I left out a consequence score and the ask payload (the structured options and "if nothing" text the real asks carry). This item is a pointer to the deck, with a fixed urgency of 3: below a failed run (4) and below real asks (5 and up). A group left with exactly one open sibling and nothing shipped reads decided, because there is nothing left to choose between. I added no new page, so there are no reserved names to update.

Closes #1805

Changes requested — before the latest push

Could not open the preview from my sandbox (network denied), so I judged the source and tests only. Fix first: a decided group should leave the feed, not stay as a zero-urgency item. As written, up to 50 'was decided' rows per viewer sit in the feed forever, which is the noise the direction (pillar 1, 'the least that decides it') rules out. Return a candidate only when asks is true, or only for a short window after the decision. Also: (1) the feed is checked at src/web/studio/feed.ts:91 only for ask/milestone, so a choose item gets a 'Mute app' button, and muting then does nothing for open choices because of the feed.ts exception. Hide the button for choose too. (2) Both doors: nothing shows the choose item in the terminal/tty feed or the README; add that, with a test. (3) Clean the test: remove the void name and the unused name param in count(), and the as any casts. The 'reason does not contain choose among' assertion is weak; assert the exact wording instead.

commented

The feed now shows a variant group as one Choose item that links to its deck. I added no terminal feed, so that part of the review isn't done. bun x tsc --noEmit, test/check-list.test.ts and the feed tests pass. I haven't run the whole suite, and the app wasn't booted or tried in a browser.

  • Asks and goes: while two or more siblings are open and none has shipped, it reads "choose among N open variants of “<first pull's title>”". It is one grouped SQL read, so the query count doesn't grow with the siblings. Once a sibling ships, or all but one close, the item leaves the feed. Decided groups are filtered out in the query (HAVING), so they no longer pile up as zero-urgency rows. This changes the original issue's "reads decided" wording to "gone".
  • No Mute button: a choose item gets none, like asks and milestones, since muting the app never silenced an open choice anyway (src/web/studio/feed.ts, src/feed/feed.ts).
  • Both doors: the terminal has no feed (the README already says so), so there's nothing to add there. I didn't build a terminal feed for this. The item is in GET /api/v1/feed and the MCP feed tool as kind choose. The README's "Choosing among variants" section now says so, and a test fetches it through the API.
  • Tests: test/feed-choose.test.ts is in GATE. It covers:

- the exact wording of the item; - a shipped sibling removes it; - all siblings closed removes it; - one sibling left open removes it; - muting the app leaves an open choice in place; - someone without write access sees none; - the query count is the same with 2 siblings as with 14.

I removed void name, the unused parameter and the as any casts.

Not done: no consequence score or ask payload on the item. Its urgency is a fixed 3, below failed runs and real asks.

Approved

Approved. The feed gets one Choose item per open variant group, linked to the deck. It has no Mute button and the app mute does not hide it. It leaves the feed once a sibling ships or all but one close. The query is one grouped read, writable repos only, sealed pulls left out, and the title is escaped by the card. The tests cover each of those, including the API feed and the query count. The terminal has no feed, so there is nothing to mirror there. I could not reach the preview from my sandbox (the host was denied), so I judged the source and the screenshots were not checked. Next: (1) fix the stale FeedKind comment in src/feed/items.ts, which still says "or that it was made" although the item now disappears, and rewrap the over-long line in the choose.ts header. (2) Key the id by repo as well, as choose:<repoId>:<group>, so two repos that reuse a group name cannot collide or share a dismissal. The deck link needs no change.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs