Repository navigation
Conversation
A description like "Bake sale" can now come back with questions instead of a draft, so the page needs somewhere to answer them. "A few details first" shows only the topics the reply asks about: the AI's options for what people sign up for plus the organizer's own, a day or several or not decided, and a count for each item. The page sends exact values (FollowUp) built and tidied by one pure function, so an empty "Several days" box or a day with no date goes as not decided, and Draft with placeholders sends every asked topic skipped. The answers live in the page rather than the screen, so Cancel and any error on the call with answers come back to the questions with every pick, date and number kept. Back writes the answers into the description as plain lines, items as typed, and the next draft starts fresh. Until a reply arrives the waiting screen no longer promises a draft, and the compose helper line says what a draft needs. The description is quoted by one "You wrote" component on the waiting screen, the questions and the new Drafting from card. The questions screen and the card load only when a reply asks, which keeps about 4 kB out of the page's first load. What is left, the "You wrote" box and the new phases, takes /app/signups/new from 113.7 to 114.7 kB, so its budget goes from 114 to 115. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
The help page's drafting note now gives the new helper line, and says what to do on "A few details first": pick what fits, add your own, or choose Draft with placeholders. The walkthrough can't reach that screen because CI runs without an AI, so the article's unit test renders it and checks the two new names instead, as it already does for the compose screen. No screenshot changes: none shows the drafting screens. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
Formatting had re-sorted Tailwind classes and re-wrapped help text in lines this change doesn't otherwise touch. Put those back as they were, so the diff shows only the helper line, the compose box's label, the reading and drafting copy, the shared "You wrote" box and the help article's new sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
… the questions If a deploy replaces the page's code while an organizer has the new signup page open, the questions screen's code can fail to load when the questions arrive. That error reached Next's "client-side exception" screen and took the description with it. Now the questions and the Drafting from card each sit inside an error boundary: a questions screen that can't load sends the organizer back to the compose box, description still in it, with a note to copy it and reload, and a Drafting from card that can't load shows the description box instead. The preloads no longer leave a rejected promise unhandled, and the drafting screen stays up while the questions' code loads rather than going blank. Add and a chip's remove button disappear once used, which dropped keyboard focus to the page. Focus now stays in "Add your own" after Add, moves to the next chip's remove button (or the box) after a remove, and moves to the line about the limit when the twelfth item takes the box away. The number control's buttons and box, and the two time boxes, were 40 to 42px tall. They are now 44px, the size every target on this screen is meant to be. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
This was referenced Oct 24, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
A date with a year before 1900, an easy slip in a date box (202 becomes 0202), went to the server, which refused it with "The date must be a real day, as YYYY-MM-DD". The page now says "Check the date's year." before sending, and the date box starts at 1900, the server's earliest year. An error stayed on screen while the organizer changed their answers, so answers they had fixed still looked wrong. It now goes once an answer actually changes, and the next try brings its own. When drafting from answers ran too long, the message said to simplify a prompt the questions screen doesn't let them edit; it now says only to try again. When the questions can't be shown, the message no longer says the page was updated, since an error while rendering them lands there too. The page also tidies typed text with the server's own function now, so the two can't drift. Part of #570. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
It was cut to "Reload" to stay a few bytes under the page's budget. The words come first; the budget is raised in the next commit, with its reason. Part of #570. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
Measured with a clean install against main (with #525 and #526): - /app/signups/new goes from 113.8 kB (the telemetry branch) to 115.0 kB: the reading and drafting copy, the shared "You wrote" box, the error boundary and focus handling. The questions screen and the Drafting from card already load only when a reply asks for them; loading them with the page would add about 4 kB more. - Loading them on demand adds about 0.1 kB to the shared runtime every page loads (its map of chunks). / was at 132.9 of 133 kB on main and goes just over. Budgets: /app/signups/new 115 -> 116, / 133 -> 134. Part of #570. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #570, the fourth of five stacked PRs. It's based on #575 (activity events for the questions round).
Two things change for organizers as soon as this lands:
The questions screen itself is dormant until #577 makes the prompt ask.
The questions screen
MagicComposeRootgoes compose → reading → A few details first → drafting with the answers → builder. The page holds the answers, not the screen, so nothing typed is lost:FormErrorabove the card, and go away when an answer changes.What: Bake something to sell (no limit), Staff the table (2)andWhen: Saturday, November 14, 9am to 1pm. The next Draft my signup is a first call again.Questions.tsxfollows the design boards:aria-pressedtoggles in a labelled group. "Add your own" takes Enter or an Add button and makes chips with a × ("Remove Bring drinks"), up to 12 items. Focus stays in the box after an add and moves to the next chip after a remove.While the second call runs, the drafting screen shows a Drafting from card: the description, each item with "2 people" or "No limit", and the date. A blank question reads "Not decided. The draft will use placeholder dates you can fill in later."
Reuse.
YouWrote.tsxis the one "You wrote" box, used by the waiting screen, the questions screen and the card. It replaces the old blockquote.tidyText, so the page and the server can't disagree about a duplicate.What the browser sends
answers.tsbuilds theFollowUp(unit-tested), normalised before sending:not_decided.howManyis sent only when "how many" was asked and there are items: one entry per item, picked then added,nullfor an empty box.placeholders: true.Page size
The questions screen and the Drafting from card load only when a reply asks for them. That keeps about 4 kB out of the first load of
/app/signups/new. If their code can't load (say, after a deploy), the organizer goes back to the compose box with the description kept, under "The questions couldn't be shown. Reload the page and try again; copy your description first if you want to keep it."Measured with a clean install, against
mainwith #525 and #526:/app/signups/new//app/signups/newgrows by the reading/drafting copy, the "You wrote" box, the error boundary and focus handling./and every other page grow by about 0.1 kB: the shared runtime's map of the on-demand parts./was already at 132.9 of 133.Loading the screen with the page would cost about 4 kB more on
/app/signups/new, so I've raised the two budgets by 1 kB each rather than drop the lazy loading.Help
"Create and publish a signup" gets:
The walkthrough never reaches the questions (e2e runs without an AI), so
.ui.tssays so and the article's unit test renders the screen and checks those two names. No screenshot shows the drafting screens, so none needed retaking.Where it departs from the boards
Tests
Questions.test.tsxcovers the issue's list:It also covers the first-call questions, heading focus, focus after Add, × and the 12th item, a short year, and errors clearing only on a real change.
answers.test.tscovers theFollowUpbuilder, the Back text, the year check andsameAnswers.lazy-chunks.test.tsxcovers the fallbacks when the code can't load.MagicComposeRoot.test.tsxcovers both watchdog messages.Drafting.test.tsxcovers the reading/drafting copy.pnpm lint && pnpm typecheck && pnpm knip && pnpm test(1471) andpnpm build && pnpm budgetspass.Tophat
This branch on its own, against a local fake OpenAI-compatible endpoint:
With the questions screen's code blocked in the browser, the page goes back to the compose box with the description kept and the fallback message above it.
The whole stack, earlier, on desktop and phone: Cancel mid-draft, a refusal, Back, Draft with placeholders and the hourly limit.
Reviews
/code-review), fixed in d4ffb57 and be2c366:🤖 Generated with Claude Code
https://claude.ai/code/session_01UW9ZpEu4MWkeqTv2Qe14ks