Repository navigation
feat(ui): confirm your computer inside the Final step panel - #918
Conversation
f8fcd01 to
b8d05ca
Compare
|
Security review (GPT 6.1 Sol, xhigh) on c540633: four findings, all fixed Sol's verdict on that commit: the server-side guards on confirmation, and the serialization of Not me against the mint, hold up; the framing and account-switch gaps did not.
Checks: typecheck, lint, and |
b8d05ca to
a758add
Compare
|
Security review round 2 (GPT 6.1 Sol, xhigh) on b8d05ca: three should-fixes and a nit, all fixed Sol confirmed the round-one fixes hold, including the reload on an account change before the busy check in both panel and watch mode. It found no blocker and no way to get a key, and judged the defences against a stolen line and phishing sound, provided the person matches their agent's code. It held sign-off for these:
Checks: typecheck, lint and 42 affected test files (491 tests) pass locally. A third Sol round is checking these for sign-off. |
|
Security review round 3 (GPT 6.1 Sol, xhigh) on a758add: sign-off for #911's threat: yes. Sol found no blocker or should-fix, and all four round-2 fixes hold. Besides the suites, it checked the polling script in isolation: missing markers, an account change before the busy check, form preservation, and steady polling without repeated reloads. One nit, fixed in the next commit: cutting the hint made the start-overflow tests in |
2455397 to
d915399
Compare
With setup links the panel knows when the person's agent has started a login, so it now shows that login's own confirmation in place: the code to check against the agent's, the computer's suggested name, Confirm and Not me. It is the device page's form, posting to its route with the line; the server rechecks the line (own, live, uncontested, bound to this login) under the login's locks before answering, and every outcome goes back Home. Not me denies a pending login, cancels a confirmed one whose key isn't collected, and says so when a key was already made. The printed link keeps working. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…unt switch /guide/steps now carries the inline confirmation, so it gets frame-ancestors 'none', form-action 'self' and base-uri 'none' like the device page. The panel's steps carry the viewer they were rendered for, and the guide script reloads the page when a poll answers for another account instead of swapping that account's form under the first one's header. Not me and Deny answer even with the name field emptied. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ng hints can't block Deny confirmInline now locks the setup line and then checks it against a fresh clock: a wait for the lock could outlast the line, and now() stays at the transaction's start. A terminal's name hint is kept to the 64 characters a name may have, since it prefills the form and a longer one could push Deny or Not me past the form's size cap. The guide script doesn't poll a region that doesn't say which account it was rendered for. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…hat hints are cut Co-Authored-By: Claude Opus 5.5 <[email protected]>
74faa3e to
c876ce7
Compare
## What changed This PR adds release 18's What's new entry, written from `b23e6ad`. It covers everything merged since release 17's `through` (`5dd94f3`), and it sets the `patchy` release to `0.18.0` in `packages/patchy/package.json` and `CURRENT_RELEASE`. With this release, onboarding ends in a Final step on Home that follows the person's agent through setup and lets them confirm it right there (#906). | Change | PRs | | --- | --- | | New: A Final step to connect your AI agent | #916, #917 | | New: Confirm your computer without leaving Home | #918 | | Improved: Setting up ends with your first page | #914 | | Improved: The logo takes you Home | #913 | | Behind the scenes: the first time someone opens a colleague's tool is counted, for activation | #915 | One merged PR gets no line: #905 is release 17's own entry. ## Look at - **The entry**, at the top of `releases` in `packages/core/src/whatsNew.ts`. Its labels are the pages' own: Final step, Later, Not me, Home, Patches. - **Rollback safety, from the live commit `a049a3c` to `b23e6ad`.** - No PR in the range is labelled `one-way`, and every PR answers both Release impact questions with "Yes". - Migrations 0026 and 0027 are additive: the `setup_prompt_sign_ins` and `setup_links` tables, and a nullable `device_logins.setup_link_id` with `ON DELETE SET NULL`. Release 17 never reads them. - `rollback-rehearsal` exercised both migrations on the landed heads: - #916: `Exercised rollback paths passed: a049a3c → 6037d86 → a049a3c → 6037d86, in 234s.` - #917: `Exercised rollback paths passed: a049a3c → d03a5bf → a049a3c → d03a5bf, in 217s.` - #918 and #915 change no migration or handler descriptor, so they had nothing to rehearse. - A rollback takes the Final step panel and setup links away. Home goes back to the old guide, and a CLI at `0.18.0` stays usable against release 17: `--setup` is only sent when `/llms.txt` prints it, and release 17's `/llms.txt` doesn't. ## How it was verified - `pnpm typecheck` and `pnpm lint` pass, and so do `packages/core`, `packages/api`, `packages/portal` and the skill lock test (245 tests), including `whatsNew.test.ts`, `schemas.test.ts` and `WhatsNewPages.test.ts`. - The live commit was pinned from `/healthz/deep`: `a049a3c`, release 17. The Deploy run updated last succeeded, and none is unfinished. - Each PR in the range was read, including its Release impact answers. All six landed with the reviewed trees: each squash left `main`'s tree identical to its PR's reviewed head. ## Release impact - [ ] **Breaking** — requires action from anyone already running this - [x] **Not breaking** — no action required This PR changes only the changelog text and the `patchy` version. As with every release, a CLI installed before this deploy is told to upgrade. - **What does a revert leave behind?** Nothing. People whose seen marker reached 18 would just see no new release. - **Does the release before it still work with that?** Yes. If this release misbehaves, roll back to `a049a3cf544ae89691eec547dea46773febfdf05` (release 17). Made by Claude Opus 5.5 in Claude Code, running in T3 Code. Co-authored-by: Claude Opus 5.5 <[email protected]>


What changed
Once the person's agent starts a login with the setup line, the Final step panel shows that login's confirmation right there, so the person never opens a second tab. The link the agent prints keeps working exactly as before.
Closes #911. Part of #906. Stacked on #917.
Look at
The form is the device page's own.
confirmForminpackages/auth/src/DevicePages.tsis now shared by the device page and the panel. In the panel it reads "Name this computer", prefilled from the login's hint, with Confirm and Not me, and carries the setup link as a hidden field.The server decides, not the page. A form with
setupposts to the existingPOST /login/device, which sends it toDeviceLogins.confirmInline/denyInline.pending(so not contested) and bound to this code. Anything else confirms nothing.frame-ancestors 'none') and posts only to Patchy. It names the account it was rendered for, and the script reloads the page rather than swap in another account's form after an account switch.Not me settles the login by where it actually is, in one transaction:
The line ends
denied, and the panel says "Nothing was connected. If you didn't just paste the line, you're fine: no computer can publish as you." with Get a new line.Polling never eats a half-typed name. The panel's script leaves the form alone while it has focus or an edited name.
Where this differs from #911's wording:
required, so an empty name rarely reaches the server.deniedinstead of retiring it. The effect is the same: the line can't bind another login, and Get a new line starts over.How it was verified
pnpm exec vitest runacrosspackages/auth,packages/portal,packages/sdk,packages/limits,packages/core, the CLI login and the server's setup-pickup and migration tests: 491 tests pass. New ones cover:pnpm typecheckandpnpm lintpass.pnpm dev up team): an agent's login started with the line, answered in the panel.Release impact
No schema change: an optional
setupfield on the device form, and new queries over #917's tables.setupfield the old route ignores, so it acts as an ordinary device confirmation.Made by Claude Opus 5.5 in Claude Code, running in T3 Code.