Repository navigation
feat(send): the review shows to, the amount, the privacy strip and the fee - #1797
Open
alejoamiras wants to merge 17 commits into
Open
alejoamiras wants to merge 17 commits into
alejoamiras wants to merge 17 commits into
Conversation
alejoamiras
marked this pull request as ready for review
November 12, 2026 04:18
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
nulo-landing | 6d8c94f | Commit Preview URL Branch Preview URL |
Nov 13 2026, 12:28 AM |
Extension preview build —
|
…e fee The review sheet follows RV4a: the payee block, the amount, the privacy strip heard as one sentence, the warning when the fee names the account, and the fee row reading the form's line through one shared rule. Send now takes focus and stays focusable while it arms. No edit control: the close returns to the form with every value kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`readReview` reads the strip's cells, the warning and whether Send now refuses a press; the form's payee is read inside the page, since the review draws its own. The warned send's review is checked to open on Send now, refuse a press until armed, hold two Tab stops and send by Enter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Space clicks at its release, so a press started while Send now refused would send once the sheet armed. Such a press is now refused at keydown and at keyup, and a held key's repeats never start one. The fee line's notes come from one rule beside `feeLine`, the hand-added sponsor's sentence is no longer heard twice, the card's unused cap model is gone, and ARCHITECTURE and the e2e-testing skill describe the review as built. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Space and a pointer click at their release, so a press begun while Send now was armed, held while the payer changed and released after the sheet armed again sent what it never saw. The sheet keeps one press record from keydown or pointerdown, marks it refused whenever Send now stops being sendable, and the click reads it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Enter acts at its keydown, so a refused Enter's record no longer waits for the next press and cannot refuse a later click-only activation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e strip
The owner preferred today's heading "This send publishes" over its three
rows to the strip (page 138). The rows return in the strip's slot, in RV4a's
order: To, the amount, the rows, the form's warning when the fee names the
account, then the fee row. Each row keeps today's words, marks and
`send-review-row-{you,to,amount}` testids and is heard as today's sentence;
a hand-added sponsor's "Your address" row carries the form's sentence. The
review's bridge link stays gone (P138-05 = a).
`PublishStrip`, unmounted since the form's strip left, is deleted with its
type-role exceptions; the review's fixture, page tests, ARCHITECTURE and the
e2e skill read the rows, and the skill's fee paragraphs read the radios.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
P138-03 = b: with a price known, the review's hero reads the token amount then "≈ $43.20" in the prototype's form, the very figure the form's readout shows: `AmountCard` hands its own `≈ $` words out as `usdFigure`, priced at the live quote in token mode and at the frozen quote in USD mode, so no second rounding rule exists. The figure sits on the amount's baseline, is heard after it, and wraps whole under it, flush left, when the line is full. No price, no amount: the token amount alone, nothing reserved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ary's entry The owner, on P138-06's note (2026-11-12 16:04 UTC): "dot the FPC then". `FpcSentence` prints a line and, when it opens with "Nulo can't tell what this FPC publishes about you." or "Nulo can't tell what this FPC charges you.", makes that sentence's "FPC" a `DottedTerm` keyed to the existing `fpc` entry; only the constant is dotted, so a name after it never is. The form's publish line and fee line, and the review's "Your address" row and fee row, print through it. A screen reader hears each sentence as before, the term described by the glossary's definition. Dotted terms per screen with a hand-added sponsor in effect: the form two, the review two, the cap; none elsewhere on either. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OA-16 is answered with page 138's entries quoted; the publish block's reversal gets its own section; the ledger gains D25 (the rows back), D26 (the hero's dollar figure) and D27 (the dotted FPC, with the counts per screen), and D18, D19, D20 and the review's UI impact line follow. OA-19 lists what the answers leave open, each with what ships now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
alejoamiras
force-pushed
the
send-build-1-a2
branch
from
November 13, 2026 00:27
dfd8fdc to
6d8c94f
Compare
This branch has not been deployed
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.
The review sheet's body is rebuilt as the owner picked it, then changed on page 138: To, the amount (with its dollar figure when a price is known), "This send publishes" over its three rows, the warning when the fee names your account, the fee row, then Send now. Plan:
implementations-plan/send-build-1/plan.md; owner asks with what ships now:implementations-plan/send-build-1/OWNER-ASKS.md. Arc 2 of the three-arcsend-build-1stack (the form, the review, the close-out), onsend-build-1-a1(#1795). No issue is linked on pages 129, 131, 133 or 138, so this PR closes none. The title stays as first opened; the strip it names became the rows on page 138.Changed after page 138
Each entry is quoted from the answers file the orchestrator keeps for this lane, then what shipped. Each change is its own commit.
The review's publish block (page 138's P138-01): the three "This send publishes" rows, not the strip
Shipped (
plan.mdD25): RV4a's order with today's heading and three rows in the strip's slot, each row in today's words and marks, read as today's sentences; the warning box under the rows, 12 px above the fee row; the rows wrap at 240 px as today's do. A hand-added sponsor's "Your address" row carries the form's sentence.PublishStrip.vue(with its test, story and type-role exceptions) is deleted: nothing mounted it once the form's strip left. Home's re-ask review mounts the same sheet and follows. No new words.P138-02 = a (2026-11-12 15:37 UTC)
P138-03 = b (2026-11-12 15:37 UTC)
Shipped (D26): with a price known, "≈ $43.20" after the token amount (
send-review-amount-fiat). It is the form's own readout:AmountCardhands out the same≈ $words it draws under the field (usdFigure, the live quote in token mode, the frozen quote in USD mode), so the two cannot round differently. The figure sits on the amount's baseline 8 px after it, in the prototype's meta type and secondary ink, is read right after the amount, and wraps whole under it, flush left, when the line is full. No price or no amount: the token amount alone, nothing reserved.P138-04 = read (2026-11-12 15:38 UTC)
Shipped: (a), the form's line on one line with its notes under it, as the page said. (b), the prototype's two-line row, is captured below beside (a) at the same state, not built.
P138-05 = a (2026-11-12 15:38 UTC)
P138-06 = a (2026-11-12 15:39 UTC), and its note answered (16:04 UTC)
Shipped (D27):
FpcSentence.vuemakes the "FPC" of "Nulo can't tell what this FPC publishes about you." and of "Nulo can't tell what this FPC charges you." a dotted term keyed to the glossary's existingfpcentry (send-fpc-term), on the form (the publish line and the fee line) and the review (the "Your address" row and the fee row). No glossary entry or definition changes, and the term has no text of its own. Only the constant sentence is dotted, so a sponsor's or payee's name after it never is. A screen reader hears each sentence as before, with the glossary's definition on the term.Dotted terms per screen (measured on the built extension): with a hand-added sponsor in effect, the form 2 and the review 2, the cap; with any other payer, 0 on each. Neither screen reaches 3, so nothing went to
OWNER-ASKS.md. The answers file expected the form to dotpriority-feealready (AppFeeLine.vue); it does not:AppFeeLinemounts only in the dApp windows.What the answers leave open ships as listed in OA-19: when the fee names your account, the "Your address" row's sentence and the warning box both say so; Home's re-ask shows no dollar figure (it has no form to price it); in USD mode the figure is the sent amount priced at the frozen quote; each dotted FPC is a Tab stop.
What changed and why
SendReviewSheet.vue, in order:PayeeBlock("To", the name, the whole address in two lines of 33, the check line for an address the wallet does not know), the hero amount with its dollar figure when a price is known, "This send publishes" over its three rows (today's, after page 138), the form's warning box when the fee names your account, and the fee row, label left and value right. Send now takes focus when the sheet opens.SendFeeLine.vueintofeeLine()andfeeLineNotes()infee-line-words.ts.send.vuehands onefeeLineStateto the form's line and to the review, so the two read the same words in every state: paid, sponsored, a hand-added sponsor, estimating, slow, failed, queued with and without a cap. A component test mounts both on each state and compares them.FACT_SENTENCES,rowSentence,noticeBodyForinpublish-facts.ts); a hand-added sponsor's "Your address" row reads the form's sentence. The strip's sentence (stripSentence) andstripAriaLabel, built first, are gone withPublishStrip.vue.AmountCardasusdFigure, the words its own readout draws; the dotted FPC isFpcSentence.vue, used by the form's publish line and fee line and the review's rows and fee row.aria-disabledand the base's faded look withpointer-events: none. A key or pointer press that met it refusing never sends, at its start or while held, including across a re-arm when the payer changes.queuedCapTextmodel is gone;ARCHITECTURE.mdand thee2e-testingskill describe the review as built.UI impact (the owner's sign-offs, verbatim)
Owner asks this arc ships in their "what ships now" form: OA-15 (Home's re-ask review: today's sentence and payer words on the row's grid, no name line, no check line) and OA-19 (what page 138's answers leave open, above). OA-16 is answered by page 138.
Captures
After page 138
From the real popup over the local sandbox (never Testnet), 360 x 600 unless marked; every frame also exists in the other theme. The local network has no price feed; the priced frames seed the sandbox token's quote at $1.
A named payee on Nulo's sponsor, light and dark; the same review at 240 px (the rows wrap as today's do)
P138-03: with a price, light and dark; a long amount at 240 px, the figure wrapped whole under it
Paid from private Fee Juice; paid from public Fee Juice with the warning, light and dark
A pasted address nobody has paid; a public send; the priced review at 240 px
P138-06's dotted FPC: the form paid by a hand-added sponsor ("Mine"), light and dark; its first term focused
The review paid by the same sponsor, light and dark; its first term focused
P138-04 (b), the prototype's two-line fee row at (a)'s state ("paid public with warning" above), light and dark, cropped to the row: drawn for the owner's pick, not built
Measured on Chrome, the sheet's dialog: 406 px paid privately, 506 px named on the sponsor (priced or not), 539 px a public send, 558 px pasted (the check line), 545 px with the warning, 441 px on a hand-added sponsor. Tab stops: the close and Send now in every state but the hand-added sponsor's, which adds its two dotted terms (four). With the rows back the sheet is taller than as first built (309 to 384 px) and than the prototype's RV4a (392 and 410 px); at 360 x 600 it still fits without scrolling.
As first built (superseded on page 138: the strip in place of the rows)
A named payee on Nulo's sponsor, light and dark; the same review at 240 px
Paid from private Fee Juice; paid from public Fee Juice, with the warning, light and dark
A pasted address nobody has paid (its check line); a public send; Send now while it arms
Queued behind an earlier send (Queue send); Home's re-ask review, light and dark (the earlier send's toast closed first, #1796)
Home right after Send now (unchanged, D2); dark at 240 px; dark, Send now while it arms
As first built, measured on Chrome: the sheet's dialog was 309 px paid privately, 326 px sponsored (named or public), 345 px pasted (the check line) and 384 px with the warning; the prototype's RV4a drew 392 and 410 px, with "≈ $43.20" beside the amount and the method on a second line. Tab stops in every state: the close and Send now (three while the fee's Try again shows).
Accessibility calls (under the 2026-10-19 delegation)
Popup'sinitial-focus) and is never natively disabled, so focus survives the arm and every change of state;aria-disabledannounces the refusal, the press guards enforce it.Testids
send-review-sheet,send-review-amount,send-review-fee,send-review-fee-cap,send-review-fee-queued,send-review-fee-slow,send-review-fee-retry,send-review-fee-reask,send-review-submit; the payee block'ssend-payee*(the review's sits in#popup, so the fixtures scope the form's tosend-page).send-review-row-you,send-review-row-to,send-review-row-amount(data-visibility; the "Your address" row alsodata-notice-shape). The specs that had moved to the strip moved back:fixtures/send-page.tsreadReviewreads the rows again, andfee-methods,send-amount-exactandsame-token-concurrent-sendsread the review through it. No smoke spec opens the review, before or after.send-review(the dialog),send-review-warning(data-notice-shape),send-review-fee-value,send-review-amount-fiat,send-fpc-term.send-review-recipientandsend-review-recipient-address(the type-roles inventory),send-fee-privacy-remedyin the review (fixtures/send-page.ts,fee-methods; the form's warning keeps its fix).send-review-strip{,-spoken}andsend-review-unvouched, added as first built, are gone and never shipped.Validation
Every run at retry 0 on
0b4170356, the last code commit (the commits after it are plan notes and the captures), on a shared host at load 45 to 95 on 188 cores.bun run lint,bun run typecheck:all,bun run test:all(extension 18,421 passed),bun run check:plans,bun run test:ci-gating(755 pass),build-storybook: green.submitSendorreadReview, plus the plan's threeconcurrent-sendtxspecs): Firefox 62 passed, 0 red. Chrome 60 passed and 2 red, both intype-roles-windows: the per-test fixture timed out opening the playground page (connectPlayground:openPlayground, 30 s) before "the capabilities window holds its roles" ran, and "every identifier site the network suite owns was read in its role" then listed only that window's six sites. This round touches neither the playground nor the capabilities window; that file, rerun alone once, went 6 of 6. The three opt-in specs (send-chaos,store-captures,stale-network-a10-capture) ran armed on Chrome: 3/3.AmountCard's figure in token and USD mode;FpcSentence(the dotted word, a name after the sentence never dotted, other text plain, the glossary's definition); the dotted terms counted on the form and the review with a hand-added sponsor, two each.The suites' content barely moved (the rows replace the strip; no scenario was added), so the rises track the host's load.
No e2e scenario is added or changed in this round:
readReviewreads the rows again, and the dotted terms and the figure are proven in component and page tests; the captures read both on the built extension.Found on the way and filed: #1796 (an in-flight send's toast sits over the review's fee row; it predates this arc).
🤖 Generated with Claude Code