Skip to content

Put a duplicated slot right after the original and open it - #568

Open
richshaw wants to merge 3 commits into
mainfrom
claude/issue-557-duplicate-after-original
Open

richshaw wants to merge 3 commits into
mainfrom
claude/issue-557-duplicate-after-original

Conversation

@richshaw

Copy link
Copy Markdown
Owner

Fixes #557.

Overlaps #565, which renames the slot editor's Capacity field in SlotEditor.tsx. Whichever lands second gets a small merge.

The problem

On the Build tab, Duplicate added the copy to the end of the list (or the end of its group), often off screen. The editor stayed open on the original, so the date an organizer changed next moved the original, not the copy.

The fix

  • duplicateRow (src/components/build-shared/useBuildState.ts) now posts one row to POST /api/signups/[id]/slots/bulk, with beforeSlotId set to the slot after the original in the rows' current order. When the original is last, it leaves beforeSlotId out. addSlotsBulk already inserts there and renumbers the slots in one transaction, so no server code changes. It resolves to the copy's id, or null when nothing was added (a refused save still shows its error on the rail).
  • New reducer action INSERT_ROW_AFTER puts the server's row straight after the original and renumbers sortOrder from 0, as the server does.
  • BuildWysiwyg opens the copy once it exists, which closes the original's editor, and asks its editor to take focus. SlotEditor takes a focusOnOpen prop (passed through WysiwygGroup and WysiwygSlot) and focuses its first field's control when it opens. Only Duplicate sets it. Opening any row clears it, so clicking a row still doesn't move focus.
  • Duplicate in a closed row's toolbar does the same, as the issue's default says.
  • Uncapped originals still give the copy capacity 1. Duplicating a slot in the builder fails when the slot has a value in a Number field #512's typed Number values still go through toTypedValues.
  • addRow lost its capacity seed, which only duplicateRow used.
  • Help: the step in "Create and publish your first signup" now reads "To copy a slot, open it and choose Duplicate. The copy opens below it, ready for you to change its date." No screenshot shows this step. I re-ran the walkthrough with HELP_SCREENSHOTS=1. The PNGs came back with pixel-level rendering noise and looked the same, so I didn't commit them.
  • CHANGELOG entry under Changed.

Tests

  • useBuildState.test.ts: the INSERT_ROW_AFTER reducer (puts the row after the named one and renumbers, or appends when that row is gone). For duplicateRow: copying the second of four slots sends beforeSlotId for the third slot and leaves the rows as a, b, copy, c, d. Copying the last slot sends no beforeSlotId and appends. A refused copy resolves to null and shows the server's error. The existing body tests (typed values, empty Number left out, null capacity → 1) now point at the bulk route.
  • SlotEditor.test.tsx: focusOnOpen focuses the first field, and its absence leaves focus alone.
  • The help walkthrough now duplicates the first slot and checks four things: the copy's editor opens as the second row with focus in What, changing the date changes the copy (Apr 6 stays first, Apr 13 is second), and the order holds after a reload.
  • Ran and passed:
    • pnpm lint && pnpm typecheck && pnpm knip && pnpm test (1353 tests).
    • pnpm build && pnpm budgets: the builder page is 151.5 kB against its 152 kB budget.
    • Playwright, container config, chromium: tests/e2e/help, organizer, slot-row-layout, enum-picker, reminder-field and time-format (21 passed), then the help walkthrough again after the reload check (3 passed).
  • I didn't run pnpm test:db: no service, route or schema changed.

Generated by Claude Code

Duplicate on the Build tab added the copy at the end of the list and left
the editor on the original, so the date an organizer changed next moved the
original instead (#557). The copy now goes through the bulk route with
beforeSlotId set to the slot after the original, lands in the same place in
the builder's rows, and its editor opens with focus in the first field.

The help step and its walkthrough say and check where the copy goes.

Fixes #557.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M9MpB8R3EBVQjjrQFr3VqP
@richshaw richshaw added pipeline:ux Changes what a person using OpenSignup sees or does pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude
@richshaw
richshaw requested a balanced review from Copilot October 23, 2026 10:05

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@richshaw richshaw added pipeline:tophat pipeline:working A session is working on it right now and removed pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude

Copy link
Copy Markdown
Owner Author

Tophat: passed

I ran 74e619b locally with pnpm dev, Postgres 16, and Chromium at 1280×900 and 390×844. I didn't run the worker, because nothing here touches jobs or email. All the data is made up and was created through the API: "Snack duty — Spring season" and "Bake sale — by day" (grouped by Date). Each has a Servings Number field and four slots: Fruit and water (Apr 6, Servings 12, 3 spots), Paper plates (Apr 6, no limit), Juice boxes (Apr 7, Servings 20, 2 spots) and Napkins (Apr 7, 1 spot).

Check Result What I saw
Base (c2282b6), for comparison ✅ seen I opened Paper plates (row 2 of 4) and chose Duplicate. The copy went to the end as row 5, and the editor stayed open on the original, with focus on the Duplicate button (568-base-after-duplicate).
Duplicate a middle slot ✅ The same steps on the head: the copy's editor opens as row 3, straight under Paper plates, the original's editor closes, and focus is in What (568-head-after-duplicate). The uncapped original's copy has 1 spot.
Change the copy's date ✅ I set the copy's date to Apr 13 and chose Done. The original stays on Apr 6 and the copy reads Apr 13 in row 3. After a reload the order and both dates are the same (568-head-copy-redated-reload).
Duplicate the last slot ✅ Copying Napkins sent no beforeSlotId. The copy was added at the end, opened, and had focus in What (568-head-last-duplicate).
Duplicate from a closed row's toolbar ✅ I hovered Juice boxes and used the toolbar's Duplicate. The request carried beforeSlotId for the next slot, and Servings 20 went through as a number. The copy (2 spots) opened under the original with focus in What (568-head-toolbar-duplicate).
Opening another row afterwards ✅ Clicking another row opened its editor and left focus alone, as it does on main.
Grouped by date, on a phone ✅ At 390 px, duplicating Fruit and water opened the copy inside the Sat, Apr 6 group, directly under the original. The editor starts at y=498 of 844, so it's on screen, and the page is 390 wide (568-head-phone-grouped-after). After I changed the copy's date to Apr 7, it moved to the top of the Sun, Apr 7 group (568-head-phone-grouped-moved).
Public page ✅ After publishing, /s/<slug> lists the slots in the builder's order, with each copy next to its original (568-head-public).
Help article ✅ /help/create-and-publish-a-signup reads "The copy opens below it, ready for you to change its date."
Console and server logs ✅ No console errors. The only server errors came from the health check's pgboss.job query, because the worker wasn't running.

Note, not a failure: in my first try I changed the copy's date and reloaded the page straight after choosing Done. The new date was lost, because no PATCH had gone out yet. Cell edits save after an 800 ms debounce, and closing the editor doesn't flush it. With a 2.5 s pause the date saved and survived the reload. This PR doesn't change the debounce, and main behaves the same for any cell edit. It may matter a bit more now, because "Duplicate, change the date, Done" is the flow this PR makes quick.

For the owner (UX): in the builder, Duplicate now puts the copy directly under the original (inside its group, when the signup is grouped) instead of at the end of the list. It opens the copy's editor with the cursor in its first field, so the next change goes to the copy, not the original. This works from the open editor and from a closed row's hover toolbar. One help step now reads "The copy opens below it, ready for you to change its date." Compare 568-base-after-duplicate with 568-head-after-duplicate, and see 568-head-phone-grouped-after for a phone.

Screenshots are in https://claude.ai/code/session_01NgZY3dzoNEst5b7t3ciuCm.


Generated by Claude Code

@richshaw richshaw added pipeline:review pipeline:working A session is working on it right now and removed pipeline:tophat pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude

@richshaw richshaw left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: changes needed (round 1)

The PR does what #557 asks, and the approach is right. duplicateRow posts one row to the existing bulk route with beforeSlotId set to the next row, or with none when the original is last, so addSlotsBulk places and renumbers it under its existing signup and slot locks. No server code changes. INSERT_ROW_AFTER puts the copy in the same place locally. BuildWysiwyg opens the copy, and SlotEditor focuses its first field. Uncapped originals still give the copy capacity 1, and #512's typed values still go through toTypedValues. The help step, its walkthrough (now with a reload check) and CHANGELOG are updated. Each "Done when" item is covered, and the tophat confirmed it, a grouped signup on a phone included. One regression holds it back: the focus request is never cleared, so in a signup grouped by date the copy's editor pulls focus back to What when its date changes.

Blocking (1):

  • src/components/build-wysiwyg/SlotEditor.tsx:44-46: focusRowId stays set while the copy is open. A date change in a date-grouped signup moves the row to another WysiwygGroup (keyed by the value), and the remounted editor focuses What again. Typed date digits can then land in What and autosave there. Clear the request once it has been used, and add a test.

Optional (5):

  • src/components/build-wysiwyg/BuildWysiwyg.tsx:235-241: if the organizer opens another slot while the copy is being saved, the copy still opens and takes focus when the response arrives. You could open it only if expandedRowId is still the original.
  • src/components/build-shared/useBuildState.ts:588-601: beforeSlotId comes from this tab's rows. If that slot was deleted elsewhere (another tab, or the AI connector), the bulk route refuses the copy with "beforeSlotId is not a slot in this signup", where Duplicate used to always work. That's rare. One way to handle it is to retry without beforeSlotId.
  • src/components/build-shared/useBuildState.ts:606: two quick Duplicates of one slot both send the same beforeSlotId. The server stores A, c1, c2, B, but locally each copy goes straight after A, giving A, c2, c1, B until a reload.
  • src/components/build-shared/useBuildState.ts:130: the comment says the server renumbers around an insert. It does only when beforeSlotId is sent. When the last slot is copied, the server appends with nextSlotSortOrder. Client sortOrder for slots isn't sent anywhere, so this has no effect. Reword it if the file is touched.
  • From the tophat: a cell edit saves after an 800 ms debounce, and Done doesn't flush it, so a reload straight after "change the date, Done" can lose the date. main behaves the same, but this PR makes that flow quicker. It's worth a follow-up if it shows up in walkthroughs.

Earlier threads: none. Copilot couldn't review because its quota is used up.
Checks: CI is green on 74e619b (lint-type-test, e2e, CodeQL). The tophat passed on 74e619b, the current head. I read the full diff against main, addSlotsBulk and the bulk route, partitionRows and the WysiwygGroup keys, and OPTIMISTIC_EDIT_CELL. I also ran a high-effort code review and checked its findings by hand. I dropped the capacity-1 fallback for uncapped copies (the issue asks to keep it) and the extra slot locks on the beforeSlotId path (an existing service path, used only on Duplicate). Checklist: no service, route, schema, policy or query change, and no new activity event. The help article and walkthrough are updated, and so is CHANGELOG.

Why owner, once fixed: pipeline:ux. Duplicate in the builder now puts the copy straight under the original (inside its group) and opens it with the cursor in its first field, from the editor and from the row toolbar. The help step says so. See the tophat's 568-base-after-duplicate, 568-head-after-duplicate and 568-head-phone-grouped-after.

https://claude.ai/code/session_01RvniWhwpuaRQz8GC7Z4UfJ


Generated by Claude Code

Comment thread src/components/build-wysiwyg/SlotEditor.tsx Outdated
@richshaw richshaw added pipeline:fix pipeline:working A session is working on it right now and removed pipeline:review pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude
The copy's focus request stayed set until another row was opened. In a
signup grouped by date, changing the copy's date moves it to another
group, which remounts its editor, and the editor took focus again, so
the next keystroke could land in the first field. SlotEditor now calls
onFocused once it has focused, and BuildWysiwyg clears the request there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qs4VL324ZQL9uvmPQATuQ
@richshaw richshaw added pipeline:tophat pipeline:working A session is working on it right now and removed pipeline:fix pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude

Copy link
Copy Markdown
Owner Author

Tophat: passed

I ran 0f5f9a3 locally with pnpm dev (no worker, since nothing here touches jobs or email), using Postgres 16 and Chromium at 1280×900 and 390×844. The last tophat passed on 74e619b, so I focused on what 0f5f9a3 changes (the copy's editor takes focus once, not again when it remounts) and re-ran the main Duplicate flows around it. All the data is made up and was created through the API:

  • "Snack duty — Spring season": ungrouped, with Fruit and water, Paper plates (no limit), Juice boxes and Napkins.
  • "Bake sale — by day": grouped by Date, with Cupcakes and Cookies on Apr 6, and Brownies and Lemonade on Apr 7.
Check Result What I saw
Previous commit (74e619b), for comparison ✅ seen On the grouped signup, I duplicated Cookies and set the copy's date to Apr 7. The copy moved to the Apr 7 group, and its editor took focus again in What. Pressing x y then changed What to "Cookiesxy" (568-prev-grouped-copy-moved). That's the bug the commit describes.
Head: the copy changes groups ✅ I did the same with Cupcakes. Duplicate opened the copy with focus in What. After I set the date to Apr 7, the copy moved to the top of the Apr 7 group with its editor open. Focus stayed out of the editor, and x y left What as "Cupcakes" (568-head-grouped-copy-moved).
Duplicate a middle slot ✅ Duplicating Paper plates opened the copy straight under the original, with focus in What and 1 spot. The API order is Fruit and water, Paper plates, the copy, Juice boxes, Napkins (568-head-ungrouped-after-duplicate).
Duplicate the last slot ✅ The copy of Napkins went to the end, opened, and had focus in What (568-head-last-duplicate).
Duplicate from a closed row's toolbar ✅ The toolbar's Duplicate on Juice boxes put the copy (2 spots) straight after it (568-head-toolbar-duplicate). Clicking another row afterwards left focus alone.
Phone, grouped ✅ At 390 px, duplicating Brownies opened the copy inside the Apr 7 group, with focus in What. The page is 390 wide. Moving the copy to Apr 6 put it in that group, and focus didn't come back (568-head-phone-grouped-after, 568-head-phone-grouped-moved).
Saved after a reload ✅ I duplicated Lemonade, set the copy to Apr 8, waited 2.5 s and reloaded. A new Mon, Apr 8 group holds the copy, and the original stays on Apr 7 (568-head-grouped-reload).
Tests and logs ✅ BuildWysiwyg.test.tsx and SlotEditor.test.tsx passed (19 tests). No console errors. The only server error was the health check's pgboss.job query, because the worker wasn't running.

Note, not a failure: the last tophat's note still applies. A date change made and then left within the 800 ms save debounce is lost. Twice my scripted browser closed straight after changing a copy's date, and the change didn't save. With a pause, it saved every time. This PR doesn't change the debounce.

For the owner (UX): this is the same change as before. In the builder, Duplicate puts the copy directly under the original (inside its group, when the signup is grouped) and opens the copy's editor with the cursor in its first field. The new commit fixes one rough edge: in a signup grouped by date, the cursor used to jump back to the copy's first field when its new date moved it to another group, so the next key typed changed its name. Now the cursor only goes there once. Compare 568-prev-grouped-copy-moved with 568-head-grouped-copy-moved.

Screenshots are in https://claude.ai/code/session_01YGWWmNrkYQtUFQx1y72M2r.


Generated by Claude Code

@richshaw richshaw added pipeline:review pipeline:working A session is working on it right now and removed pipeline:tophat pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude

@richshaw richshaw left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: passed (round 2)

Since round 1 (at 74e619b), 0f5f9a3 fixes the one blocking finding. SlotEditor takes an onFocused callback and calls it right after it focuses the first field. WysiwygSlot and WysiwygGroup pass it through, and BuildWysiwyg gives it a stable clearFocusRow (useCallback) that sets focusRowId back to null. The focus request is now used once. When a date change moves the copy into another date group and its editor remounts, focusOnOpen is false and the new editor leaves focus alone. Because clearFocusRow is stable, the effect's new onFocused dependency doesn't re-run it. Under StrictMode's double effect in dev, the second run only focuses the same field again before the state clears, so nothing changes. focusRowId is still cleared by expandRow as before, and nothing else in src reads focusOnOpen or focusRowId. The new BuildWysiwyg test reproduces the round 1 scenario in a builder grouped by date: it duplicates, checks What has focus, moves the copy to Nov 21, checks the new group header appears, and checks What no longer has focus. The fix comment says it fails without the wiring. The SlotEditor tests check onFocused is called once with focusOnOpen and never without it. The rest of the diff is what round 1 reviewed.

Blocking (0): none.
Optional (0): none new. Round 1's five optional notes still stand as written: a copy that opens after the organizer has opened another slot, a stale beforeSlotId after a delete in another tab, two quick Duplicates of one slot ordering differently until a reload, the sortOrder comment in useBuildState.ts:130, and the 800 ms cell-edit debounce that Done doesn't flush. That last one is how main already behaves. Both tophats saw it, and it's worth a follow-up if walkthroughs keep hitting it.

Earlier threads: all resolved (the focus thread, answered and fixed in 0f5f9a3). Copilot couldn't review because its quota is used up.
Checks: CI is green on 0f5f9a3 (lint-type-test, e2e, CodeQL). The tophat passed on 0f5f9a3, the current head. It compared against 74e619b to show the focus jump, then showed it gone on the head, on desktop and on a phone. I read the diff since round 1 and searched src for every use of the focus props.

Why owner: pipeline:ux. In the builder, Duplicate now puts the copy directly under the original (inside its group when the signup is grouped) and opens the copy's editor with the cursor in its first field. This works from the open editor and from a closed row's hover toolbar. One help step now reads "The copy opens below it, ready for you to change its date." See the tophats' 568-base-after-duplicate, 568-head-after-duplicate, 568-head-phone-grouped-after and 568-head-grouped-copy-moved.

https://claude.ai/code/session_01CgaxVHCZfi1RL6LhTVPpdH


Generated by Claude Code

@richshaw richshaw removed the pipeline:review label Oct 23, 2026 — with Claude
@richshaw richshaw added pipeline:owner Passed; waits for the owner (UX or high-risk) and removed pipeline:working A session is working on it right now labels Oct 23, 2026 — with Claude
@richshaw richshaw added pipeline:merge and removed pipeline:owner Passed; waits for the owner (UX or high-risk) labels Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Approved by the owner at 0f5f9a3.

Merge: not merged

The only gate that failed is a merge conflict: mergeable_state is dirty against main, probably from #565 (which renamed the Capacity field in SlotEditor.tsx, as the description expected) or #567. Every other gate passes on 0f5f9a3: main is green, the review passed (round 2, gate=owner), the tophat passed, and the owner cleared it. I'm sending it to pipeline:fix for a merge from main. If that merge brings in no commits of the PR's own, the approval above carries over and it can come straight back to merge.

https://claude.ai/code/session_01ChCvABTWNwZNvyV1i2dKRP


Generated by Claude Code

@richshaw richshaw added pipeline:fix pipeline:working A session is working on it right now and removed pipeline:merge labels Oct 24, 2026 — with Claude
Resolves conflicts with #565 and #567 in SlotEditor, WysiwygSlot, the
SlotEditor tests and CHANGELOG by keeping both sides: the editor takes
focusOnOpen/onFocused alongside the new taken/remindersOn props, and the
focus ref sits on the field grid below the new signed-up note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015pfDqwVMpLjQtmFKGF5jBa

Copy link
Copy Markdown
Owner Author

Address: merged main, conflict resolved in runtime code

The only open item was the merge conflict. 1a30a4d merges main in. #565 (Spots wording) and #567 (slot-change emails) caused conflicts in four files. In each one both sides added something and neither side removed anything, so I kept both:

Ran on 1a30a4d: pnpm lint && pnpm typecheck && pnpm knip && pnpm test (1364 passed). pnpm build && pnpm budgets also passed, with the builder at 151.7 kB of its 152 kB budget.

The conflict was in runtime code, so the owner approval at 0f5f9a3 doesn't carry over. Once CI is green this goes back to tophat, to check that the editor's focus and the new signed-up note work together.

https://claude.ai/code/session_015pfDqwVMpLjQtmFKGF5jBa


Generated by Claude Code

@richshaw richshaw added pipeline:tophat pipeline:working A session is working on it right now and removed pipeline:fix pipeline:working A session is working on it right now labels Oct 24, 2026 — with Claude

Copy link
Copy Markdown
Owner Author

Tophat: passed

I ran 1a30a4d locally with pnpm dev, Postgres 16 and Chromium at 1280×900 and 390×844. I didn't run the worker, because nothing here touches jobs. The test signup was "Snack duty — Spring season" with four slots: Fruit and water on Apr 6 (2 spots), Juice boxes on Apr 13 (1), Crackers on Apr 20 (no limit) and Cookies on Apr 27 (3). All the data is made up.

Check Result What I saw
Duplicate a middle slot from its open editor ✅ The copy of Juice boxes became row 2, straight under the original. Its editor opened, the original's editor closed, and focus went to What (568-before-duplicate-desktop, 568-after-duplicate-desktop)
Change the copy's date ✅ One PATCH went to the copy's slot, and the original kept Apr 13. With Cookies' copy: May 4 on the copy, Apr 27 on the original, still there after a reload
Duplicate the last slot ✅ The copy of Cookies went to the end of the list, with no beforeSlotId
Order after a reload ✅ The server's sortOrder matches the order on screen (0 to 6, each copy right after its original)
Duplicate from a closed row's toolbar, uncapped original ✅ The copy of Crackers went straight under it, opened with focus in What, and has capacity 1 (568-toolbar-duplicate-desktop)
Signup grouped by date ✅ The copy of Fruit and water went into the Apr 6 group under the original (568-grouped-duplicate-desktop). When I changed its date to Apr 27, it moved to that group with its editor still open, and focus didn't jump back to it (568-grouped-moved-desktop)
Phone width ✅ Same result: the copy opens as row 2 and focus is on What, which is on screen. The page is 390 wide with no sideways scroll (568-after-duplicate-phone)
Console ✅ No console errors on any run

Notes, not failures:

  • If I typed a new date and pressed Done at once, then reloaded, the date sometimes didn't save. This happens on any row, a copy or not, and this PR doesn't touch the edit path. Given a second, it always saved.
  • The local driver's click Duplicate picks the hidden hover toolbar of the first row, so I clicked the open editor's button directly. This is a quirk of the test driver, not of the app.

For the owner (UX): Duplicate now puts the copy straight under the original instead of at the end of the list, and opens it with the cursor in its first field, so the next date you type changes the copy. It works the same from a closed row's toolbar, and in a signup grouped by date. The help article's step changes to match. 568-after-duplicate-desktop and 568-grouped-moved-desktop show the difference.

Screenshots are in https://claude.ai/code/session_014wwMCvAzJZ9dvn4SQynAUJ.


Generated by Claude Code

@richshaw richshaw added pipeline:review pipeline:working A session is working on it right now and removed pipeline:tophat pipeline:working A session is working on it right now labels Oct 24, 2026 — with Claude

@richshaw richshaw left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: passed (round 3)

Round 2 passed this change at 0f5f9a3. Since then the only commit is 1a30a4d, a merge from main that resolved conflicts with #565 (Spots wording) and #567 (slot-change emails) in runtime code. I reviewed that resolution against main:

  • SlotEditor.tsx keeps focusOnOpen/onFocused next to main's taken/remindersOn. The React import is useEffect, useId, useRef, and spotsHelpId is unchanged. gridRef sits on the field grid, which is now below the new "signed up" note, so focus still goes to the first field's control and not to the note.
  • WysiwygSlot.tsx passes all four props to SlotEditor. WysiwygGroup.tsx and BuildWysiwyg.tsx are what round 2 reviewed: clearFocusRow is stable, expandRow clears the request, and the copy opens only when duplicateRow resolves to an id.
  • No change from main was dropped: the PR's diff against main in these files only adds things.

Blocking (0): none.
Optional (0): none new. Round 1's five optional notes still stand as written. The one most worth a follow-up is the 800 ms cell-edit debounce, which Done doesn't flush. All three tophats hit it, and it's how main already behaves.

Earlier threads: all resolved. Copilot couldn't review because its quota is used up.
Checks: CI is green on 1a30a4d (lint-type-test, e2e, CodeQL). The tophat passed on 1a30a4d, the current head, after the merge. It checked focus and the signed-up note together, a grouped signup on a phone included. The branch is now behind main by #525, without a conflict. The merge stage will update it.

Why owner: pipeline:ux. The owner's approval at 0f5f9a3 doesn't carry over, because the merge resolved conflicts in runtime code. The change is the same one the owner already approved. In the builder, Duplicate puts the copy straight under the original (inside its group, when the signup is grouped) and opens it with the cursor in its first field. The help step says so. See the latest tophat's 568-after-duplicate-desktop and 568-grouped-moved-desktop.

https://claude.ai/code/session_01DzTZ8jFXB8McW78y18rxFS


Generated by Claude Code

@richshaw richshaw added pipeline:owner Passed; waits for the owner (UX or high-risk) and removed pipeline:review pipeline:working A session is working on it right now labels Oct 24, 2026 — with Claude
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pipeline:owner Passed; waits for the owner (UX or high-risk) pipeline:ux Changes what a person using OpenSignup sees or does

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicating a slot leaves the editor on the original and puts the copy at the end

3 participants