import InfoBox from '../components/InfoBox.astro';

[Signing in with Google](/posts/no-email-required#one-account-one-shape-of-data) used to ask a question the moment a device with its own local Daily Challenge history first signed in: claim those numbers into the account, or start fresh. That question is gone. Signing in on any device, the first time or the fifth, now silently folds whatever local progress it has into the account, no prompt, nothing to click. The choice it used to offer moved out entirely, a standalone action in Settings that has nothing to do with signing in.

## The dialog that only worked once

The claim-or-discard prompt was built and tested against one scenario: a device's very first sign-in, with no account data yet to compare against, genuinely unambiguous. In production it also fired on a second or third device signing into an account that already held numbers from elsewhere, and there the same dialog showed two different-looking totals side by side with nothing explaining how they related. The button next to that confusion carried the real risk: discard, a one-shot, irreversible wipe of local progress, sitting one confused tap away from a number a player might not have recognized as their own.

## Reset moves out, silence moves in

The sync itself needed nothing new: the same rolling-stats sync that already ran silently after every finished game just gained a second trigger, once per device, on first sign-in, folded into the same code path rather than announced as a separate event. Discard's destructive capability survived, relocated to a "Reset your Daily Challenge progress" action in Settings, reachable only by a signed-in player who goes looking for it, never offered in the moment that used to cause the confusion. Sitting right above it, "Delete my account" needed to read as the more serious of the two without borrowing the app's accent color, which would have made deletion look like the app's preferred, default action instead of its most dangerous one. It got a trash icon and red-tinted text and border instead, background left exactly like every other secondary button in the panel.

## The same recap, wherever it's opened

The account also now carries whichever Daily Challenge a player finished today, not just the rolling streak. A signed-in player opening the game on a device with nothing local for today, but who already played it on another one, sees the exact same recap: board, score, game log, share image, "Play Again", all rendered through the same code path that already handles revisiting a result on the device that produced it. No badge, no "synced from elsewhere" copy. Three variants of that badge were built and reviewed side by side before landing on the plain one, and the first live pass of the reviewed prototype used a stripped-down demo result that undersold the feature until it was rebuilt with a real board, real edibles, and a full log. Reusing the existing path this thoroughly meant the ticket itself needed almost no new interface, only the wiring that decides where a recap's data comes from.

<InfoBox title="Two departures from the written plan">
The plan for the two new page-level flows called for end-to-end coverage, matching how this repo usually tests a full page. Neither flow can be driven end to end in this environment, since nothing here can act as a real signed-in Google account, so both landed as component tests instead, extending the same stubbed-fetch seams the settings and daily pages already used. The account's own sync endpoint, reachable only while signed in, had its request body planned as a flat addition, one more field alongside the existing ones; it shipped nested instead, the pre-existing stats grouped under their own key and today's result kept separate, closer to what the two values actually are than a single flat list would have been. A later pass caught one real finding: three destructive-confirmation buttons, two new and one existing, all carried a color fallback that did not match any theme's actual value and was doing nothing. Removed from all three.
</InfoBox>

What Google sign-in still needs, as of this point, is a real client to sign into. The button exists everywhere it should now, four decisions deep, and none of them make it functional without that one piece still sitting outside any of this repo's code.