# An app that connects to a wallet

The three app reference designs, plus connecting, permissions, signing in, errors and the three charging patterns: one-off payments, micropayments and agent spending. Also covers what an app owes a user who wants to leave.

The costly rules come first; the full list follows, grouped by page. Every line carries the address of the sentence it came from.

349 rules: 39 that can cost money, 86 that can cost trust, 224 standard.

## Start here

- **DON'T** _(Costs money)_ Build a product where the user's funds depend on your company continuing to exist. Every wallet should be recoverable without you. See Backups.
  <https://www.bitcoinsv.design/guide/rule/665b6af4ce/>
- **DO** _(Costs money)_ Make the irreversible step unmistakable. A payment cannot be recalled, so the review screen is the last line of defence.
  <https://www.bitcoinsv.design/guide/rule/b502171c81/>
- **DO** _(Costs money)_ Show the total a payment takes from the user, who it goes to, and that it cannot be undone, before they commit.
  <https://www.bitcoinsv.design/guide/rule/72c3ab54e4/>
- **DO** _(Costs money)_ Name the limits. "This backup covers your keys but not your payment records" is the sentence that stops somebody losing money later.
  <https://www.bitcoinsv.design/guide/rule/02cda8cac2/>
- **DON'T** _(Costs money)_ Let the everyday wallet draw from savings on its own, or let an agent raise its own budget. Both turn a bridge into a leak.
  <https://www.bitcoinsv.design/guide/rule/8d5c89ed47/>
- **DON'T** _(Costs money)_ Show an amount taken from the app's description text. Show the amount from the request itself, and warn if the two disagree.
  <https://www.bitcoinsv.design/guide/rule/b50f273390/>
- **DON'T** _(Costs money)_ Let an AI agent approve key linkage, share a Pass, or widen its own permissions.
  <https://www.bitcoinsv.design/guide/rule/be5632560c/>
- **DON'T** _(Costs money)_ Show long decimal BSV amounts in a consumer interface. "0.00012500 BSV" asks the reader to count zeros, and they will get it wrong.
  <https://www.bitcoinsv.design/guide/rule/5fe9c5b068/>
- **DO** _(Costs money)_ Make the handle the default and the address the fallback. Every payment that uses a handle is a payment that cannot go to the wrong network.
  <https://www.bitcoinsv.design/guide/rule/98fc09f14d/>
- **DO** _(Costs money)_ Put the network name next to the address field, always, not only on error. "BSV address" is three words and it is the whole defence.
  <https://www.bitcoinsv.design/guide/rule/fea05e6af6/>
- **DO** _(Costs money)_ Warn on every pasted address rather than trying to detect a bad one. You cannot detect it, and a warning that only fires sometimes teaches people it means something specific.
  <https://www.bitcoinsv.design/guide/rule/7b6afde89f/>
- **DON'T** _(Costs money)_ Use "bitcoin address" as the field label. That is the word that cannot distinguish the networks, on the screen where the distinction is the whole point.
  <https://www.bitcoinsv.design/guide/rule/e92e4f5284/>
- **DO** _(Costs money)_ Put the network on the confirmation, beside the recipient, in the same weight as the amount.
  <https://www.bitcoinsv.design/guide/rule/e7486b509a/>
- **DO** _(Costs money)_ Say plainly what cannot be undone, before the button: "Sent to the wrong network, this usually cannot be recovered."
  <https://www.bitcoinsv.design/guide/rule/94b4f84162/>
- **DO** _(Costs money)_ Offer a test payment for a first-time address above a threshold you choose, and ask the user to check with the recipient that it arrived. It costs a fraction of a penny and it is the only defence that proves the address is right.
  <https://www.bitcoinsv.design/guide/rule/ea9599e1da/>
- **DO** _(Costs money)_ Make the network selection impossible to leave at a default, and restate the chosen network on the confirmation.
  <https://www.bitcoinsv.design/guide/rule/278b3b2795/>
- **DON'T** _(Costs money)_ Offer "Try again" on a payment until you know the first attempt did not go out.
  <https://www.bitcoinsv.design/guide/rule/24ccdc3485/>
- **DO** _(Costs money)_ Tell the user once when their wallet is retrying for them: "Your wallet will keep trying to send this. You don't need to pay again."
  <https://www.bitcoinsv.design/guide/rule/2a72388be3/>
- **DO** _(Costs money)_ Fund an agent by deliberate top-up, as a human action. A standing instruction to refill is the thing that turns a bounded loss into an unbounded one.
  <https://www.bitcoinsv.design/guide/rule/a96515e0c0/>
- **DON'T** _(Costs money)_ Hand an agent the user's identity key or their Passes. It can have its own identity and act as itself; it should never be able to prove it is the person.
  <https://www.bitcoinsv.design/guide/rule/a4ece91f55/>
- **DO** _(Costs money)_ Enforce limits outside the agent, in the wallet or the service holding its keys. A limit the agent checks itself is a limit an injected instruction can argue with.
  <https://www.bitcoinsv.design/guide/rule/63a9fc8258/>
- **DO** _(Costs money)_ Treat the supply decision as final in the interface, because it is. A field labelled "Supply" with no warning is a trap.
  <https://www.bitcoinsv.design/guide/rule/d20dfe7b12/>
- **DON'T** _(Costs money)_ Write anything identifying a person without an explicit, specific consent for that write. "Agreed to the terms" is not consent to publish somebody's name forever.
  <https://www.bitcoinsv.design/guide/rule/d18ac5c2f8/>
- **DO** _(Costs money)_ Name the article being bought on the wallet's payment sheet, so the reader can see that the thing she tapped is the thing she is paying for.
  <https://www.bitcoinsv.design/guide/rule/dc76c094e7/>
- **DON'T** _(Costs money)_ Charge for an article the reader has already bought, whether she returns to it on the same day or a month later.
  <https://www.bitcoinsv.design/guide/rule/aa6089c9cb/>
- **DO** _(Costs money)_ Stop charging the moment the reader taps Stop, before any confirmation or animation, and say how much she spent today.
  <https://www.bitcoinsv.design/guide/rule/2981555d83/>
- **DON'T** _(Costs money)_ Show Try again on an article while the wallet reports its payment as still being sent.
  <https://www.bitcoinsv.design/guide/rule/08826b6288/>
- **DO** _(Costs money)_ Show on the review screen the same sats amount the wallet's prompt will show, and if the rate moves before Anna presses the button, update the figure on this screen first rather than letting the wallet show a different number.
  <https://www.bitcoinsv.design/guide/rule/cef01aa4a6/>
- **DON'T** _(Costs money)_ Add a booking fee or any other charge after the review screen. If the product charges one, it is part of the price shown here.
  <https://www.bitcoinsv.design/guide/rule/9d65fbb29c/>
- **DO** _(Costs money)_ Make a ticket valid at the door from the token alone, so it still works after Anna deletes her data or removes the site from her wallet.
  <https://www.bitcoinsv.design/guide/rule/4740a3dd92/>
- **DO** _(Costs money)_ Show the amount and the payee from the payment Scout's wallet refused, and Scout's explanation separately, labelled as Scout's. If the explanation names a different amount, show both and say they disagree.
  <https://www.bitcoinsv.design/guide/rule/fa105418c9/>
- **DON'T** _(Costs money)_ Put "Always allow" or "Add to Scout's services" on the approval screen. Widening Scout's scope from a notification is how one odd request becomes a standing permission.
  <https://www.bitcoinsv.design/guide/rule/44db19b4c1/>
- **DON'T** _(Costs money)_ Let the assistant approve its own request, or accept an approval from anywhere other than Anna's own device.
  <https://www.bitcoinsv.design/guide/rule/54786d4a9a/>
- **DO** _(Costs money)_ Refuse a payment above the price shown on the limits screen, even when it is inside the per-payment limit, and send it to Anna like any other request outside scope.
  <https://www.bitcoinsv.design/guide/rule/23eeedf9ef/>
- **DO** _(Costs money)_ Cap paid retries to one service at a fixed number per task, show that number on the limits screen, and stop using the service when it is reached. Each retry is another payment, and a loop of small failures is how an agent spends its budget on nothing.
  <https://www.bitcoinsv.design/guide/rule/5b82904b28/>
- **DO** _(Costs money)_ Make pausing take effect in Scout's wallet, not in the assistant. Spending stops even if the assistant is still running or has not noticed.
  <https://www.bitcoinsv.design/guide/rule/35dd3d1ba8/>
- **DO** _(Costs money)_ Offer only the wallet that funded Scout as the destination for what is left. A payee chosen at the end of a delegation is a payee nobody vetted.
  <https://www.bitcoinsv.design/guide/rule/1b0b0bbfed/>
- **DO** _(Costs money)_ Show the network on every receive screen that shows a plain address, and warn on send when an address is pasted rather than picked.
  <https://www.bitcoinsv.design/guide/rule/282a044b2d/>
- **DO** _(Costs money)_ When an import of recovery words finds nothing, check the other derivation path before telling the user the wallet is empty.
  <https://www.bitcoinsv.design/guide/rule/cce4fe671e/>
- **DON'T** _(Costs trust)_ Require an identity document, an email address or a phone number to hold money. Where a regulation requires it for a particular feature, gate that feature, not the wallet.
  <https://www.bitcoinsv.design/guide/rule/2a1abdf36f/>
- **DO** _(Costs trust)_ Give every wallet an export the user holds themselves, and a send to a plain address that works without your servers. See Legacy compatibility.
  <https://www.bitcoinsv.design/guide/rule/0d8433711c/>
- **DO** _(Costs trust)_ Before revealing key linkage for a counterparty, tell the user it exposes every payment between them and that counterparty, past and future. See Wallet privacy.
  <https://www.bitcoinsv.design/guide/rule/6db3fdafda/>
- **DON'T** _(Costs trust)_ Put a savings total and a quick-pay action on the same screen. The total makes the payment feel smaller than it is.
  <https://www.bitcoinsv.design/guide/rule/11140daf0a/>
- **DO** _(Costs trust)_ Let the weight of a confirmation follow its consequence: whether it can be undone, how large the amount is against what the wallet holds, whether the recipient is new, and whether it grants something that keeps working after today.
  <https://www.bitcoinsv.design/guide/rule/ca4deb21a3/>
- **DON'T** _(Costs trust)_ Use one confirmation style for everything. People learn the shape of "confirm" within a week and stop reading what is inside it.
  <https://www.bitcoinsv.design/guide/rule/cf6fbcfa5c/>
- **DO** _(Costs trust)_ Give every failure on the send and connect flows a message that says whether money moved: "Nothing left your wallet" or "The payment went through".
  <https://www.bitcoinsv.design/guide/rule/9653a8c175/>
- **DO** _(Costs trust)_ Export the wallet backup in the wallet data format (BRC-38 and BRC-39), to a file the user holds. If your format is your own, say so plainly and publish it.
  <https://www.bitcoinsv.design/guide/rule/383024fd53/>
- **DO** _(Costs trust)_ Make a wallet's permission prompt readable in full by a screen reader: who is asking, what for, and for how long. A grant the person could not hear is not consent.
  <https://www.bitcoinsv.design/guide/rule/783df4309f/>
- **DO** _(Costs trust)_ Request each permission when the user first uses the feature that needs it.
  <https://www.bitcoinsv.design/guide/rule/5d5c53b7cd/>
- **DON'T** _(Costs trust)_ Bundle every permission into one approval screen during onboarding.
  <https://www.bitcoinsv.design/guide/rule/09052402ed/>
- **DON'T** _(Costs trust)_ Preselect broad permissions, describe a permission as less than it is, or show a refused prompt again until the user gives in. All three teach people to tap Allow without reading.
  <https://www.bitcoinsv.design/guide/rule/a4593d9103/>
- **DO** _(Costs trust)_ Show the app's name from its manifest beside its verified domain in every prompt, and the domain alone when the app has no manifest.
  <https://www.bitcoinsv.design/guide/rule/2dc3c0d133/>
- **DON'T** _(Costs trust)_ Cancel a wallet request because the user has not answered yet. A timeout turns a user who was reading into an error.
  <https://www.bitcoinsv.design/guide/rule/5be139d90a/>
- **DO** _(Costs trust)_ Cap an allowance per payment, per hour and per day as well as per month, where the wallet supports it, and show every cap in the same prompt.
  <https://www.bitcoinsv.design/guide/rule/7b093f1075/>
- **DO** _(Costs trust)_ Ask the user again when an amount is unusually high, the recipient is new, the payment pattern changes, an allowance that has ended would start again, or the app asks for a new protocol, basket, Pass field, the identity key or key linkage.
  <https://www.bitcoinsv.design/guide/rule/aad955fa0f/>
- **DO** _(Costs trust)_ Make a revoke take effect at once, and say what stops working: "The Satoshi Vision can no longer charge you. It will ask again when you next open an article."
  <https://www.bitcoinsv.design/guide/rule/2ed9e55238/>
- **DO** _(Costs trust)_ Ask for key linkage fresh each time, name who receives it and what they learn, and keep a local record of what was revealed to whom.
  <https://www.bitcoinsv.design/guide/rule/59118a881e/>
- **DON'T** _(Costs trust)_ Ask for an email address or a password as part of signing in. If you need an email for receipts, ask for it afterwards, as its own optional step.
  <https://www.bitcoinsv.design/guide/rule/6cb55dd598/>
- **DO** _(Costs trust)_ Sign users in with a key derived for your app. If your database leaks, the leaked keys can't be matched to the same person's activity elsewhere.
  <https://www.bitcoinsv.design/guide/rule/8f450792bc/>
- **DON'T** _(Costs trust)_ Use the root identity key as the account ID for a social network, game, shop or payment service. One breach then becomes a cross-app tracking event.
  <https://www.bitcoinsv.design/guide/rule/99b4b29b25/>
- **DON'T** _(Costs trust)_ Request the wallet's root identity key without a reason you can state in the prompt. Approving a sign-in or a payment must never include it.
  <https://www.bitcoinsv.design/guide/rule/3763695367/>
- **DO** _(Costs trust)_ Say on sign-out that the app is still connected in the wallet, and where to disconnect it: "Signed out. Pixel Arcade is still listed in your wallet. Remove it there to stop it asking."
  <https://www.bitcoinsv.design/guide/rule/db6818a134/>
- **DON'T** _(Costs trust)_ Call sign-out "Disconnect wallet". It does not touch the wallet's permissions, and the user will think it did.
  <https://www.bitcoinsv.design/guide/rule/f2c89e599b/>
- **DO** _(Costs trust)_ Use Bitcoin SV or BSV on screen: "Send BSV", "Your BSV balance", "Bitcoin SV address". Use one of the two consistently within a screen.
  <https://www.bitcoinsv.design/guide/rule/4e724b402c/>
- **DON'T** _(Costs trust)_ Write "bitcoin" alone on a screen where somebody is about to move money. Used precisely it is an umbrella covering several chains, so it is the one word that cannot tell a user which network they are on. See Bitcoin.
  <https://www.bitcoinsv.design/guide/rule/ff7e7b18ab/>
- **DO** _(Costs trust)_ Say when a converted figure is an estimate, and roughly how fresh the rate is. A price that silently drifts is worse than one labelled approximate.
  <https://www.bitcoinsv.design/guide/rule/ab0796fbfa/>
- **DO** _(Costs trust)_ Keep one bitcoin unit per screen. Mixing "0.0001 BSV" and "10,000 sats" in one view asks the user to do arithmetic to compare two things you wrote.
  <https://www.bitcoinsv.design/guide/rule/19ba942704/>
- **DON'T** _(Costs trust)_ Abbreviate amounts in a financial context. "12.5k sats" saves four characters and introduces a rounding question.
  <https://www.bitcoinsv.design/guide/rule/e8d6661969/>
- **DON'T** _(Costs trust)_ Shorten a number with an ellipsis, ever. Reformat it or let it wrap.
  <https://www.bitcoinsv.design/guide/rule/28ab6b7ed7/>
- **DO** _(Costs trust)_ Show the running total against the allowance wherever the spending is happening, not only in a settings screen.
  <https://www.bitcoinsv.design/guide/rule/758fae5e4a/>
- **DO** _(Costs trust)_ Put a stop control next to that total. One action, no confirmation, effective immediately.
  <https://www.bitcoinsv.design/guide/rule/780419e009/>
- **DON'T** _(Costs trust)_ Renew an allowance that has ended without asking the user again. A limit that starts again each month within a live grant is normal, provided the reset date is shown beside what is left.
  <https://www.bitcoinsv.design/guide/rule/4399f2f0dc/>
- **DO** _(Costs trust)_ Make stopping obvious and instantaneous, and confirm that it stopped. "Stopped. You spent 340 sats." closes the loop.
  <https://www.bitcoinsv.design/guide/rule/0b795249b1/>
- **DO** _(Costs trust)_ Offer a ceiling before starting, not only an allowance. "Stop at 5,000 sats" is a different and more reassuring promise.
  <https://www.bitcoinsv.design/guide/rule/c46631d9e7/>
- **DO** _(Costs trust)_ Fail towards not charging. A user who got something free will forgive you; one charged twice will not.
  <https://www.bitcoinsv.design/guide/rule/41ccf96223/>
- **DO** _(Costs trust)_ Say what happened in plain words: which network it went to, that the money is not lost from the chain but is out of reach from here, and what recovery would require.
  <https://www.bitcoinsv.design/guide/rule/6221629f1c/>
- **DON'T** _(Costs trust)_ Promise recovery you cannot deliver. If it needs the other party's cooperation, say that is what it needs.
  <https://www.bitcoinsv.design/guide/rule/d3b1447e05/>
- **DO** _(Costs trust)_ Say whether money moved in every message that follows a payment attempt, including when the answer is that nothing left the wallet.
  <https://www.bitcoinsv.design/guide/rule/10b3023998/>
- **DO** _(Costs trust)_ Require a human for anything outside the scope: a new payee, a larger amount, a wider permission. Send the person a notification for it, rather than adding it to a list they have to check.
  <https://www.bitcoinsv.design/guide/rule/8f8a59fa96/>
- **DO** _(Costs trust)_ Record what each payment was for at the moment it happens. Intent cannot be reconstructed afterwards.
  <https://www.bitcoinsv.design/guide/rule/e68f2cc069/>
- **DO** _(Costs trust)_ Surface the unusual rather than the complete. A payee it has never paid, or a payment larger than its usual, belongs at the top; the routine belongs in a total.
  <https://www.bitcoinsv.design/guide/rule/03963e9df4/>
- **DON'T** _(Costs trust)_ Report agent spending only in a log. A log is for after somebody already suspects something.
  <https://www.bitcoinsv.design/guide/rule/74988614f8/>
- **DO** _(Costs trust)_ Put one control that stops everything, visible wherever the agent is, with no confirmation step. Confirmations are for actions you might regret, and stopping is not one of them.
  <https://www.bitcoinsv.design/guide/rule/d715b16a24/>
- **DO** _(Costs trust)_ Name the agent and its purpose wherever its spending appears. "Example Assistant, buying search results" is a thing a person can consent to; "automated payments" is not.
  <https://www.bitcoinsv.design/guide/rule/155356ce9f/>
- **DON'T** _(Costs trust)_ Ask for broad wallet access in order to read a token balance. Ask for the basket. An app that wants everything in order to show one number is the reason permission screens get ignored.
  <https://www.bitcoinsv.design/guide/rule/468c1a74fb/>
- **DO** _(Costs trust)_ Show provenance as a short human sentence before a trade or a transfer: "Issued by Example Studio, 3 owners since, unbroken." The full chain belongs behind that line, not in front of it.
  <https://www.bitcoinsv.design/guide/rule/3d6d023dfe/>
- **DO** _(Costs trust)_ Resolve the real-or-fake question for the user rather than printing an ID and hoping. Match against issuers they already trust, and say plainly when you cannot.
  <https://www.bitcoinsv.design/guide/rule/032bc32a78/>
- **DON'T** _(Costs trust)_ Show a token's picture at the size of a decision without the provenance beside it. The picture is the part that is trivial to fake.
  <https://www.bitcoinsv.design/guide/rule/3ad9441a9c/>
- **DO** _(Costs trust)_ Say what is being written on chain, that it cannot be edited later, and what it costs. The cost is a fraction of a penny, which is worth saying out loud because people expect otherwise.
  <https://www.bitcoinsv.design/guide/rule/19b03c2390/>
- **DO** _(Costs trust)_ Name the issuer wherever the balance appears, not only at acquisition. "120 GBP, issued by Example Trust" is the honest form.
  <https://www.bitcoinsv.design/guide/rule/df5ae6683e/>
- **DON'T** _(Costs trust)_ Draw a stablecoin balance in the same type as a BSV balance with no distinction. One is a bearer asset and the other is a claim on a company.
  <https://www.bitcoinsv.design/guide/rule/ab34f1e402/>
- **DO** _(Costs trust)_ Say "permanent and public" in the consent step, in those words, before anything is written.
  <https://www.bitcoinsv.design/guide/rule/f3791442cf/>
- **DO** _(Costs trust)_ Show exactly what will be written. If it is a hash, say that the document stays on your server and only a fingerprint goes out.
  <https://www.bitcoinsv.design/guide/rule/5ec4966080/>
- **DON'T** _(Costs trust)_ Offer a delete button for on-chain data. You can stop displaying it. That is not the same thing and the difference is the whole point.
  <https://www.bitcoinsv.design/guide/rule/e608a8eef7/>
- **DO** _(Costs trust)_ Default to the hash. Publishing is the irreversible option and should be the deliberate one.
  <https://www.bitcoinsv.design/guide/rule/f21b5fcb40/>
- **DO** _(Costs trust)_ Make sure the data can still be verified without your overlay. The point of putting it on chain was independence from you.
  <https://www.bitcoinsv.design/guide/rule/7162ccb4f6/>
- **DO** _(Costs trust)_ Name the price, in satoshis and local currency, on the same panel as the connect button. The reader should know what the first tap costs before the wallet opens.
  <https://www.bitcoinsv.design/guide/rule/49340e32ba/>
- **DO** _(Costs trust)_ Ask for a key made for this site only at connection, and nothing else: no identity key, no Pass, no spending grant.
  <https://www.bitcoinsv.design/guide/rule/d0c330a5ba/>
- **DO** _(Costs trust)_ Give the allowance an end date in the request itself, and show that date on the wallet's sheet. When it ends, ask again and show what the last one was spent on.
  <https://www.bitcoinsv.design/guide/rule/7bf718fae1/>
- **DO** _(Costs trust)_ Say on the stopped state that the allowance still exists in the wallet, and where to remove it.
  <https://www.bitcoinsv.design/guide/rule/3cbfd2bd9e/>
- **DON'T** _(Costs trust)_ Describe a refund in the app as a payment being reversed or cancelled. Say "We've sent you 20 sats back".
  <https://www.bitcoinsv.design/guide/rule/fc4fae7aaf/>
- **DO** _(Costs trust)_ After a revocation, keep every article the reader already paid for readable once she connects the same wallet again, with no new payment.
  <https://www.bitcoinsv.design/guide/rule/db9aa2e469/>
- **DO** _(Costs trust)_ Ask only for the sign-in key at this step. Payment, the age check and the ticket basket each wait for the screen where Anna first needs them.
  <https://www.bitcoinsv.design/guide/rule/cf71fe8ba0/>
- **DON'T** _(Costs trust)_ Ask for a name or email straight after sign-in to make the header friendlier. "Your account" is enough until Anna chooses to add something.
  <https://www.bitcoinsv.design/guide/rule/d243cfb658/>
- **DON'T** _(Costs trust)_ Offer to "find" Anna's account when a different wallet connects. The site cannot tell it is her, and guessing from anything else would link identities she kept apart.
  <https://www.bitcoinsv.design/guide/rule/43d25db81b/>
- **DO** _(Costs trust)_ List on the site, before the wallet prompt opens, the one thing the site will receive and the things it will not, in the same words the wallet is about to use.
  <https://www.bitcoinsv.design/guide/rule/3d0644d70d/>
- **DON'T** _(Costs trust)_ Ask for a date of birth and work out the age on the site. The site then holds a fact it never needed, and the wallet's field-level choice is wasted.
  <https://www.bitcoinsv.design/guide/rule/d0624dea5c/>
- **DO** _(Costs trust)_ Ask for the same single field, "over 18", at every age-restricted checkout, and never widen a later request because an earlier one was granted.
  <https://www.bitcoinsv.design/guide/rule/64fb68ab22/>
- **DON'T** _(Costs trust)_ Ask for a spending allowance "to make the next purchase faster". A site people pay a few times a year should ask each time.
  <https://www.bitcoinsv.design/guide/rule/6d94573c75/>
- **DON'T** _(Costs trust)_ Put a "Disconnect" button on the site that only clears the session. Anna would believe the site lost its access when the wallet still lists it.
  <https://www.bitcoinsv.design/guide/rule/c0d587e4e7/>
- **DO** _(Costs trust)_ Store the result of an age check, the gig and the date, and never the Pass or any field beyond the one asked for, and say so on the site's data page.
  <https://www.bitcoinsv.design/guide/rule/174de490e2/>
- **DON'T** _(Costs trust)_ Keep anything about Anna that this page does not list. If the site starts storing something new, the page changes the same day.
  <https://www.bitcoinsv.design/guide/rule/4bcb851c13/>
- **DON'T** _(Costs trust)_ Offer to connect Scout to Bitcoin SV Wallet with a spending permission as a quicker alternative. Two routes to the same task make the safer one look like the slow one.
  <https://www.bitcoinsv.design/guide/rule/0b18fa39bf/>
- **DON'T** _(Costs trust)_ Ask Anna to switch on a low-balance refill during funding. Topping up is a separate decision each time, made when she can see what the last budget bought.
  <https://www.bitcoinsv.design/guide/rule/e0a63a7226/>
- **DO** _(Costs trust)_ Say plainly when a service kept the money: "Example Data was paid 15 sats and sent nothing back." Whether money moved is the first thing the errors pattern asks every failure to answer.
  <https://www.bitcoinsv.design/guide/rule/62372051f5/>
- **DO** _(Costs trust)_ Record Scout's reason with each payment at the moment it is made, and keep it unchangeable. A reason written afterwards is a story, not a record.
  <https://www.bitcoinsv.design/guide/rule/aa39be0fe6/>
- **DON'T** _(Costs trust)_ Present Scout's note in the same style as the amount and payee. The amount and payee come from the payment; the note comes from the agent, and the screen should show the difference.
  <https://www.bitcoinsv.design/guide/rule/d9a50748d3/>
- **DON'T** _(Costs trust)_ Offer "Get a refund" or "Dispute" on an agent payment. Scout cannot reverse a payment, and a button that implies it can will be pressed and will fail.
  <https://www.bitcoinsv.design/guide/rule/eabf7ac795/>
- **DO** _(Costs trust)_ Show the exact time spending stopped, and whether a payment was already on its way at that moment: "The last payment, 20 sats to The Satoshi Vision at 14:32, went through before you paused."
  <https://www.bitcoinsv.design/guide/rule/e088a098bd/>
- **DON'T** _(Costs trust)_ Let Scout's stop message argue for resuming. "I was nearly there" turns a safety control into a negotiation with the thing being stopped.
  <https://www.bitcoinsv.design/guide/rule/f20efb8ac0/>
- **DO** _(Costs trust)_ Say on the revoke screen that the money left in Scout's wallet stays there until Anna sends it back, and show the amount.
  <https://www.bitcoinsv.design/guide/rule/c7dc404e84/>
- **DO** _(Costs trust)_ Always show the user what they're paying for, and the running total against their allowance. Small, frequent payments add up, and users should never be surprised by them.
  <https://www.bitcoinsv.design/guide/rule/2cc79b8eeb/>
- **DON'T** _(Costs trust)_ Trust a single service's word that a payment is confirmed. The merkle proof is the evidence; verify it against headers rather than displaying whatever the API returned.
  <https://www.bitcoinsv.design/guide/rule/a093cf784f/>
- **DO** _(Costs trust)_ Move funds out of a seed-only wallet by sending them, not by importing its words.
  <https://www.bitcoinsv.design/guide/rule/074187441b/>
- **DO** _(Costs trust)_ Every consumer wallet should still be able to send to a plain address. It's the user's guaranteed exit if anything else in the stack fails. Label it clearly, for example Send to external wallet, and make sure it works without any vendor service.
  <https://www.bitcoinsv.design/guide/rule/24346e61e5/>

## Every rule, by page

### Design principles

https://www.bitcoinsv.design/guide/getting-started/principles/

- **DO** Let the user hold their own keys, and make the path to doing so the default rather than an advanced option.
  <https://www.bitcoinsv.design/guide/rule/0e25385677/>
- **DO** Say plainly when something is custodial. A service holding keys on a user's behalf is a legitimate product; describing it as self-custody is not.
  <https://www.bitcoinsv.design/guide/rule/3726e3cf93/>
- **DON'T** _(Costs money)_ Build a product where the user's funds depend on your company continuing to exist. Every wallet should be recoverable without you. See Backups.
  <https://www.bitcoinsv.design/guide/rule/665b6af4ce/>
- **DO** Match the protection to the amount. A wallet holding coffee money and a wallet holding savings are different products, and pretending otherwise produces one that is wrong for both. See Wallet setups.
  <https://www.bitcoinsv.design/guide/rule/88ed0414ab/>
- **DO** _(Costs money)_ Make the irreversible step unmistakable. A payment cannot be recalled, so the review screen is the last line of defence.
  <https://www.bitcoinsv.design/guide/rule/b502171c81/>
- **DO** Ask for as little as the product needs. The independent risk assessment of the wallet interface (BRC-151) warns how much a wallet can be asked for; the answer is to need less of it. See Connecting a wallet.
  <https://www.bitcoinsv.design/guide/rule/0341c279d1/>
- **DON'T** Train people to tap approve. A prompt that appears constantly, is pre-ticked, or reappears until accepted teaches exactly the habit that gets someone robbed.
  <https://www.bitcoinsv.design/guide/rule/b405f2b096/>
- **DO** Write for someone who has never heard of a UTXO and never needs to. Internal vocabulary belongs in advanced views and documentation.
  <https://www.bitcoinsv.design/guide/rule/da45913bb9/>
- **DO** Meet WCAG 2.2 AA: contrast, touch targets, screen reader labels, and amounts that read aloud sensibly. See Accessibility.
  <https://www.bitcoinsv.design/guide/rule/bb3271f0dc/>
- **DON'T** _(Costs trust)_ Require an identity document, an email address or a phone number to hold money. Where a regulation requires it for a particular feature, gate that feature, not the wallet.
  <https://www.bitcoinsv.design/guide/rule/2a1abdf36f/>
- **DO** Support the standards rather than a bespoke integration. Design your connect flow around "your wallet", not a brand.
  <https://www.bitcoinsv.design/guide/rule/381f5ac09f/>
- **DO** _(Costs trust)_ Give every wallet an export the user holds themselves, and a send to a plain address that works without your servers. See Legacy compatibility.
  <https://www.bitcoinsv.design/guide/rule/0d8433711c/>
- **DON'T** Invent a proprietary format for something a BRC already covers. A format only your product reads is a lock-in whether or not you meant it as one.
  <https://www.bitcoinsv.design/guide/rule/f6ae896c38/>
- **DO** _(Costs money)_ Show the total a payment takes from the user, who it goes to, and that it cannot be undone, before they commit.
  <https://www.bitcoinsv.design/guide/rule/72c3ab54e4/>
- **DO** Say what your product can see and what it stores. A wallet that phones a service on every balance check should say which service and what it learns.
  <https://www.bitcoinsv.design/guide/rule/ca1aefc429/>
- **DO** _(Costs money)_ Name the limits. "This backup covers your keys but not your payment records" is the sentence that stops somebody losing money later.
  <https://www.bitcoinsv.design/guide/rule/02cda8cac2/>
- **DON'T** Describe a product as private, anonymous or instant without the qualifier that makes it true.
  <https://www.bitcoinsv.design/guide/rule/630f05adcd/>
- **DO** Keep outputs from unrelated counterparties apart when selecting what to spend. Spending them together is the main remaining on-chain leak. See Coin selection.
  <https://www.bitcoinsv.design/guide/rule/8e1c2b6c46/>
- **DO** _(Costs trust)_ Before revealing key linkage for a counterparty, tell the user it exposes every payment between them and that counterparty, past and future. See Wallet privacy.
  <https://www.bitcoinsv.design/guide/rule/6db3fdafda/>
- **DON'T** Collect what you do not need, and never attach a user's identity to routine payments for convenience.
  <https://www.bitcoinsv.design/guide/rule/532e6d6e67/>
- **DON'T** Write personal data on chain in the clear. There is no delete.
  <https://www.bitcoinsv.design/guide/rule/9cf7b80b0a/>
- **DO** Let users choose or self-host the services your wallet depends on, and support more than one. See Nodes and verification.
  <https://www.bitcoinsv.design/guide/rule/a310b591f1/>
- **DON'T** Weld a product to one provider's endpoint. That is your product's lifespan as well as theirs.
  <https://www.bitcoinsv.design/guide/rule/90f2e1b5df/>

### Visual language

https://www.bitcoinsv.design/guide/getting-started/visual-language/

- **DO** Use the BSV mark, the upright B on gold, wherever a BSV product needs the symbol as a mark.
  <https://www.bitcoinsv.design/guide/rule/fe64509ecb/>
- **DON'T** Use the orange disc or a tilted B to stand for BSV. Both say a different network to anyone who knows the difference.
  <https://www.bitcoinsv.design/guide/rule/349de561b7/>
- **DO** Use the Unicode character ₿, not the logo, when you need the bitcoin symbol in text. It scales, reflows and can be read by a screen reader. For amounts and labels, use sats and BSV; see Amounts and units.
  <https://www.bitcoinsv.design/guide/rule/3da32ce0ba/>
- **DON'T** Use the golden disc logo inside a sentence. It is a mark, not a letterform, and at text size it is a smudge.
  <https://www.bitcoinsv.design/guide/rule/2e80a24df0/>
- **DON'T** Put memes in a product. They read as a private joke to people inside and as unseriousness to people outside, and the second group is who you are trying to reach.
  <https://www.bitcoinsv.design/guide/rule/48418fbe04/>
- **DO** Draw the thing that is happening. A payment is a person handing something to a person.
  <https://www.bitcoinsv.design/guide/rule/6200916e40/>
- **DO** Pick a point on the scale deliberately and hold it across the product. Drifting between the two is what produces an app that is baffling to newcomers and patronising to everyone else.
  <https://www.bitcoinsv.design/guide/rule/d3b7b38cd3/>
- **DON'T** Use a lightning bolt to mean speed in a BSV product. Show the thing itself: a payment confirmed while the customer is still at the till.
  <https://www.bitcoinsv.design/guide/rule/8aabfb2d4b/>
- **DON'T** Put advocacy in a product. Say what yours does and let it be judged on that.
  <https://www.bitcoinsv.design/guide/rule/69599bcb85/>
- **DO** Reach for the gold metaphor on a savings surface and leave it off an everyday one. A payment app that looks like a vault tells people their coffee money is an investment.
  <https://www.bitcoinsv.design/guide/rule/4f51bc1620/>

### Spending, saving and delegating

https://www.bitcoinsv.design/guide/designing-products/spending-saving-delegating/

- **DO** Decide which state of mind each screen is for, and design that screen for it alone.
  <https://www.bitcoinsv.design/guide/rule/7f98a99062/>
- **DON'T** _(Costs trust)_ Put a savings total and a quick-pay action on the same screen. The total makes the payment feel smaller than it is.
  <https://www.bitcoinsv.design/guide/rule/11140daf0a/>
- **DO** Build each state of mind on its own wallet, so the separation holds even when the interface does not. A layout can be redesigned; a key the everyday wallet never had cannot leak from it.
  <https://www.bitcoinsv.design/guide/rule/ad2b23851e/>
- **DO** Make every move between states of mind a visible step the person takes, with its own confirmation.
  <https://www.bitcoinsv.design/guide/rule/10f19e8865/>
- **DON'T** _(Costs money)_ Let the everyday wallet draw from savings on its own, or let an agent raise its own budget. Both turn a bridge into a leak.
  <https://www.bitcoinsv.design/guide/rule/8d5c89ed47/>
- **DO** Pick the primary state of mind for the product, and say so. A payments app is for spending, with saving as an optional layer reached by a bridge. A savings product is for saving, with a quick top-up as its one shortcut. A product that will not choose ends up with the savings total next to the pay button.
  <https://www.bitcoinsv.design/guide/rule/e557c3aab8/>

### Getting to know your users

https://www.bitcoinsv.design/guide/designing-products/getting-to-know-your-users/

- **DO** Lead with the concrete benefit for the person in front of you. "Keep the 45p the card company takes on a £5 sale" beats any sentence containing the word sovereignty.
  <https://www.bitcoinsv.design/guide/rule/4d5e8b87d4/>
- **DO** Count the ideas a person has to hold to finish their first task, not just the steps. Each new idea is a place they can stop.
  <https://www.bitcoinsv.design/guide/rule/6633d7fd30/>
- **DON'T** Treat speed as comprehension. Removing friction removes the reason to stop; it does not answer "what did I just do?"
  <https://www.bitcoinsv.design/guide/rule/5d79ca507e/>
- **DO** _(Costs trust)_ Let the weight of a confirmation follow its consequence: whether it can be undone, how large the amount is against what the wallet holds, whether the recipient is new, and whether it grants something that keeps working after today.
  <https://www.bitcoinsv.design/guide/rule/ca4deb21a3/>
- **DON'T** _(Costs trust)_ Use one confirmation style for everything. People learn the shape of "confirm" within a week and stop reading what is inside it.
  <https://www.bitcoinsv.design/guide/rule/cf6fbcfa5c/>
- **DO** Decide which of the three you are for, and say so. A product aimed at all three serves none well.
  <https://www.bitcoinsv.design/guide/rule/6102c7a17c/>
- **DON'T** Assume somebody who has used another chain understands this one. They will look for a fee picker, wait for confirmations, and assume their recovery words work here. See Legacy compatibility.
  <https://www.bitcoinsv.design/guide/rule/dd776c8dbe/>
- **DO** Test recovery before you polish onboarding: confirm a new user can restore their wallet on a second device before refining the first-run screens.
  <https://www.bitcoinsv.design/guide/rule/c011785af6/>

### Common user flows

https://www.bitcoinsv.design/guide/designing-products/common-user-flows/

- **DON'T** Lead a store listing with self-custody or decentralisation. They are reasons to stay, not reasons to install.
  <https://www.bitcoinsv.design/guide/rule/5e4df29166/>
- **DO** Use the device's own biometric with a passcode fallback, and require authentication for payments above a threshold the user can see.
  <https://www.bitcoinsv.design/guide/rule/6f716b945f/>
- **DO** Make the wallet's own activity the place to find out whether something worked. See Activity.
  <https://www.bitcoinsv.design/guide/rule/40259c712c/>
- **DO** Offer a view-only mode for people who should see a balance but not spend it.
  <https://www.bitcoinsv.design/guide/rule/6d0c87d856/>
- **DO** _(Costs trust)_ Give every failure on the send and connect flows a message that says whether money moved: "Nothing left your wallet" or "The payment went through".
  <https://www.bitcoinsv.design/guide/rule/9653a8c175/>

### Usage life cycle

https://www.bitcoinsv.design/guide/designing-products/usage-life-cycle/

- **DON'T** Keep showing onboarding hints to somebody on their hundredth payment.
  <https://www.bitcoinsv.design/guide/rule/69e63ba024/>
- **DO** Teach each of the four at the moment it first applies: ownership when money first arrives, irreversibility on the first review screen, the backup when the balance is worth protecting, the network name wherever somebody pastes an address.
  <https://www.bitcoinsv.design/guide/rule/86f56f942f/>
- **DON'T** Teach what the product can take care of for them, such as fees or key schemes. Every concept taught before it is needed is a reason to stop.
  <https://www.bitcoinsv.design/guide/rule/1f6a29ac0d/>
- **DO** Make the first thing a new user does end with them holding real money: received from a person, or spent on something they wanted anyway.
  <https://www.bitcoinsv.design/guide/rule/2a864d4717/>
- **DON'T** Build a practice wallet or a simulated payment in place of a real first receive. It teaches the user that the real thing is somewhere else.
  <https://www.bitcoinsv.design/guide/rule/584baf8aaf/>
- **DO** Design for the person doing the introducing: a handle they can share, a payment request they can send, and a first payment that says who it came from. See Contacts.
  <https://www.bitcoinsv.design/guide/rule/86c37f9174/>
- **DO** Get a new user from opening the app to holding money in one sitting, without leaving the app except to ask somebody to pay them.
  <https://www.bitcoinsv.design/guide/rule/38199c11b4/>
- **DO** Give every setup step a way back. A mistake during setup should cost a tap, not the wallet.
  <https://www.bitcoinsv.design/guide/rule/1e89fe909b/>
- **DO** Ask the person, after a test, to explain to a friend what they just did. What they cannot explain did not land.
  <https://www.bitcoinsv.design/guide/rule/9f4988651b/>
- **DO** Measure where people stop, step by step, and work on the worst step first. A whole-funnel number tells you there is a problem and not where it is.
  <https://www.bitcoinsv.design/guide/rule/44e7d6568e/>
- **DO** Design the "frightening moment" explicitly. A payment that looks stuck, an unexpected balance, an app asking for something alarming. One clear explanation at that moment can keep somebody who would otherwise leave.
  <https://www.bitcoinsv.design/guide/rule/09a0b91ad8/>
- **DO** We suggest two causes to check first: being asked to choose a key scheme, and having nowhere to get any BSV. The first is yours to fix. See First use.
  <https://www.bitcoinsv.design/guide/rule/daa04676a4/>

### Interoperability

https://www.bitcoinsv.design/guide/designing-products/interoperability/

- **DO** Talk to the wallet through the connection standard rather than bundling one. The user keeps their keys where they already are, and your app works with wallets that did not exist when you shipped.
  <https://www.bitcoinsv.design/guide/rule/9d2bbd0f1e/>
- **DON'T** Build a wallet inside your app because it is quicker. You inherit key custody, recovery and support, and the user now has one more set of keys to lose.
  <https://www.bitcoinsv.design/guide/rule/82d554c9de/>
- **DO** Accept a pasted or scanned value without asking the user which kind it is. Detect it and say what you found.
  <https://www.bitcoinsv.design/guide/rule/5d0805ff30/>
- **DO** Support the peer-to-peer payment flow, where the payee's software supplies the output script and gets the transaction and its proof directly. It is the privacy-preserving default and it is how handles work.
  <https://www.bitcoinsv.design/guide/rule/df7caa73bd/>
- **DO** _(Costs trust)_ Export the wallet backup in the wallet data format (BRC-38 and BRC-39), to a file the user holds. If your format is your own, say so plainly and publish it.
  <https://www.bitcoinsv.design/guide/rule/383024fd53/>
- **DO** Support restoring a backup written by other software, and report honestly what came across and what did not.
  <https://www.bitcoinsv.design/guide/rule/7564b30c43/>
- **DON'T** Keep the only copy of a user's proofs on your server. That is custody by another name, whoever holds the keys.
  <https://www.bitcoinsv.design/guide/rule/ed9cf79714/>
- **DO** Verify Passes rather than issuing your own account. A person who has already proved who they are to somebody you trust should not have to do it again.
  <https://www.bitcoinsv.design/guide/rule/45ceb7d433/>
- **DO** Ask for the single field you need. A Pass can be shown selectively, and asking for all of it when you need one line is a design choice, not a protocol limit.
  <https://www.bitcoinsv.design/guide/rule/9b7e45558c/>
- **DO** Offer a plain export of contacts and labels, in a documented format, without a support request.
  <https://www.bitcoinsv.design/guide/rule/d7ed3e6a10/>
- **DO** Encode a handle rather than an address where you can. It is shorter, it survives being printed once, and it does not tie a person to one key forever.
  <https://www.bitcoinsv.design/guide/rule/129a35ec55/>
- **DO** Support animated codes for anything that does not fit in one frame, such as a transaction with its proof going to an offline signer.
  <https://www.bitcoinsv.design/guide/rule/3b682ab184/>
- **DO** Use upper case for codes made only of digits, capitals and $%+-./:. Those encode in a smaller, faster-scanning mode. Handles and addresses do not qualify.
  <https://www.bitcoinsv.design/guide/rule/9fdd213885/>
- **DON'T** Use a transaction format that leaves out the input proofs. The receiver then has to ask a third party whether the transaction is real.
  <https://www.bitcoinsv.design/guide/rule/fed7c84f43/>
- **DO** Follow the fountain-coded air-gap transport (BRC-141) rather than a private encoding, so a user's existing signer works with your software.
  <https://www.bitcoinsv.design/guide/rule/4c2d4eeb47/>
- **DO** Exchange public keys and pending transactions in documented formats, and let a cosigner review and sign in whatever wallet they already use.
  <https://www.bitcoinsv.design/guide/rule/a5d21af2be/>
- **DO** List your dependencies somewhere a curious user can find them, and let the technical ones be changed.
  <https://www.bitcoinsv.design/guide/rule/a500cecc36/>
- **DO** Let a user point at their own header source and their own broadcaster. Most will never touch the setting, and the option costs little.
  <https://www.bitcoinsv.design/guide/rule/0c5f608d33/>

### Accessibility

https://www.bitcoinsv.design/guide/designing-products/accessibility/

- **DON'T** Ship a control labelled "button". A QR code built as an unlabelled image is not selectable at all, so it does not exist for a screen reader user.
  <https://www.bitcoinsv.design/guide/rule/975540d1d7/>
- **DO** Name the thing and its effect: "QR code, double tap to copy the payment handle".
  <https://www.bitcoinsv.design/guide/rule/c4b54d03e8/>
- **DO** _(Costs trust)_ Make a wallet's permission prompt readable in full by a screen reader: who is asking, what for, and for how long. A grant the person could not hear is not consent.
  <https://www.bitcoinsv.design/guide/rule/783df4309f/>
- **DO** Put the recipient before the amount in the reading order of a review screen. It is the field most worth hearing first.
  <https://www.bitcoinsv.design/guide/rule/b61d8d3e8a/>
- **DO** Give every scan a typed or pasted equivalent. A user who cannot aim a camera still needs to pay.
  <https://www.bitcoinsv.design/guide/rule/e62777c1c9/>
- **DO** Pair colour with a word or a symbol, always. Sent and received, plus and minus, not just red and green.
  <https://www.bitcoinsv.design/guide/rule/dd06a6092e/>
- **DON'T** Put a countdown on a confirmation. Nothing here expires, so a timer is a difficulty you added. If a rate quote goes stale, refresh it rather than timing the person out.
  <https://www.bitcoinsv.design/guide/rule/58d003b536/>
- **DO** Make sure an amount reads aloud correctly. "12,500 sats" should be spoken as a number and a unit, which means it has to be text with a real unit beside it.
  <https://www.bitcoinsv.design/guide/rule/8d7230c7d8/>
- **DO** Use fixed-width digits (tabular-nums), so a changing balance does not shift the layout under a magnified viewport.
  <https://www.bitcoinsv.design/guide/rule/c4dae24589/>
- **DO** Offer at least one route that does not need handwriting: an encrypted file the user stores themselves, split shares held by people they trust, or a signing device.
  <https://www.bitcoinsv.design/guide/rule/e6ffe7da39/>
- **DO** Let the words be read aloud in private, and let the confirmation step be completed with a screen reader. A test that only works by sight makes recovery impossible later.
  <https://www.bitcoinsv.design/guide/rule/0ceff10f13/>
- **DO** Write at a reading age of about twelve. Short sentences, common words, one idea each.
  <https://www.bitcoinsv.design/guide/rule/e93cc9b805/>
- **DO** Say what happened and what it means for the money. "The payment did not go through. Nothing left your wallet." beats an error code every time.
  <https://www.bitcoinsv.design/guide/rule/89b13e7a98/>
- **DO** Run the send and recovery flows with the screen reader on and the screen off. It takes an afternoon and finds problems an automated audit misses.
  <https://www.bitcoinsv.design/guide/rule/2fb80808d8/>
- **DO** Include people with disabilities in research, paid, rather than simulating them.
  <https://www.bitcoinsv.design/guide/rule/a4d68925d0/>

### Connecting a wallet

https://www.bitcoinsv.design/guide/patterns/connecting-a-wallet/

- **DO** Write the connect flow around "your wallet". Name a specific wallet only when helping somebody install one.
  <https://www.bitcoinsv.design/guide/rule/ca7237170b/>
- **DO** _(Costs trust)_ Request each permission when the user first uses the feature that needs it.
  <https://www.bitcoinsv.design/guide/rule/5d5c53b7cd/>
- **DON'T** _(Costs trust)_ Bundle every permission into one approval screen during onboarding.
  <https://www.bitcoinsv.design/guide/rule/09052402ed/>
- **DO** Warn the user and ask for approval again when an app's domain or certificate changes unexpectedly.
  <https://www.bitcoinsv.design/guide/rule/c497ac76cc/>
- **DO** Publish an exposure statement for your app: the wallet methods you call, the protocols and baskets you use, whether you request the identity key or Passes, what wallet data you keep, and whether agents can act through your app.
  <https://www.bitcoinsv.design/guide/rule/64d59112cd/>
- **DO** If you build a wallet, publish one for the wallet too: what is allowed automatically, how apps are kept apart, where data is stored, what a full backup contains, and whether users can move funds without your service.
  <https://www.bitcoinsv.design/guide/rule/924f375af5/>

### Permissions and allowances

https://www.bitcoinsv.design/guide/patterns/permissions-and-allowances/

- **DON'T** _(Costs trust)_ Preselect broad permissions, describe a permission as less than it is, or show a refused prompt again until the user gives in. All three teach people to tap Allow without reading.
  <https://www.bitcoinsv.design/guide/rule/a4593d9103/>
- **DO** _(Costs trust)_ Show the app's name from its manifest beside its verified domain in every prompt, and the domain alone when the app has no manifest.
  <https://www.bitcoinsv.design/guide/rule/2dc3c0d133/>
- **DO** Write the description for each permission your app declares as what the user gets from it: "To save your reading position", not "Protocol access".
  <https://www.bitcoinsv.design/guide/rule/0c8131ca43/>
- **DO** Let the user approve some items in a grouped prompt and decline others, and let the app carry on with what was approved.
  <https://www.bitcoinsv.design/guide/rule/3a68bd2cb5/>
- **DON'T** _(Costs money)_ Show an amount taken from the app's description text. Show the amount from the request itself, and warn if the two disagree.
  <https://www.bitcoinsv.design/guide/rule/b50f273390/>
- **DO** Show a waiting state in the app that tells the user their wallet is asking them something, and keep it until the wallet answers.
  <https://www.bitcoinsv.design/guide/rule/a72759d455/>
- **DON'T** _(Costs trust)_ Cancel a wallet request because the user has not answered yet. A timeout turns a user who was reading into an error.
  <https://www.bitcoinsv.design/guide/rule/5be139d90a/>
- **DO** Set an allowance to expire by default, and make a lasting allowance an explicit choice the user picks.
  <https://www.bitcoinsv.design/guide/rule/11b1c8630c/>
- **DO** _(Costs trust)_ Cap an allowance per payment, per hour and per day as well as per month, where the wallet supports it, and show every cap in the same prompt.
  <https://www.bitcoinsv.design/guide/rule/7b093f1075/>
- **DO** _(Costs trust)_ Ask the user again when an amount is unusually high, the recipient is new, the payment pattern changes, an allowance that has ended would start again, or the app asks for a new protocol, basket, Pass field, the identity key or key linkage.
  <https://www.bitcoinsv.design/guide/rule/aad955fa0f/>
- **DO** Show the date a monthly allowance starts again beside what is left of it: "1,200 of 5,000 sats left, resets 1 December".
  <https://www.bitcoinsv.design/guide/rule/493751c5a9/>
- **DO** After a refusal, say in one sentence what the app cannot do without the permission, and keep everything else working.
  <https://www.bitcoinsv.design/guide/rule/e205b2169b/>
- **DO** Ask again only when the user next uses the feature that needs the permission, not on the next screen.
  <https://www.bitcoinsv.design/guide/rule/8232bd84ee/>
- **DO** _(Costs trust)_ Make a revoke take effect at once, and say what stops working: "The Satoshi Vision can no longer charge you. It will ask again when you next open an article."
  <https://www.bitcoinsv.design/guide/rule/2ed9e55238/>
- **DO** _(Costs trust)_ Ask for key linkage fresh each time, name who receives it and what they learn, and keep a local record of what was revealed to whom.
  <https://www.bitcoinsv.design/guide/rule/59118a881e/>
- **DON'T** _(Costs money)_ Let an AI agent approve key linkage, share a Pass, or widen its own permissions.
  <https://www.bitcoinsv.design/guide/rule/be5632560c/>

### Signing in

https://www.bitcoinsv.design/guide/patterns/signing-in/

- **DO** Use one button for a first visit and a return visit. There is no separate sign-up, because there is no account to create.
  <https://www.bitcoinsv.design/guide/rule/63de192726/>
- **DON'T** _(Costs trust)_ Ask for an email address or a password as part of signing in. If you need an email for receipts, ask for it afterwards, as its own optional step.
  <https://www.bitcoinsv.design/guide/rule/6cb55dd598/>
- **DO** _(Costs trust)_ Sign users in with a key derived for your app. If your database leaks, the leaked keys can't be matched to the same person's activity elsewhere.
  <https://www.bitcoinsv.design/guide/rule/8f450792bc/>
- **DON'T** _(Costs trust)_ Use the root identity key as the account ID for a social network, game, shop or payment service. One breach then becomes a cross-app tracking event.
  <https://www.bitcoinsv.design/guide/rule/99b4b29b25/>
- **DON'T** _(Costs trust)_ Request the wallet's root identity key without a reason you can state in the prompt. Approving a sign-in or a payment must never include it.
  <https://www.bitcoinsv.design/guide/rule/3763695367/>
- **DO** Recognise a returning user without a wallet prompt where the wallet already holds your app's permission.
  <https://www.bitcoinsv.design/guide/rule/d081585700/>
- **DON'T** Show a public key as the user's name. Use the name they gave you, or a plain label such as "Your account".
  <https://www.bitcoinsv.design/guide/rule/dfd139ee15/>
- **DO** Tell people before their first sign-in that the account belongs to their wallet: "Restore this wallet and your account comes back with it. A different wallet is a new account."
  <https://www.bitcoinsv.design/guide/rule/f319bd8f6a/>
- **DO** _(Costs trust)_ Say on sign-out that the app is still connected in the wallet, and where to disconnect it: "Signed out. Pixel Arcade is still listed in your wallet. Remove it there to stop it asking."
  <https://www.bitcoinsv.design/guide/rule/db6818a134/>
- **DON'T** _(Costs trust)_ Call sign-out "Disconnect wallet". It does not touch the wallet's permissions, and the user will think it did.
  <https://www.bitcoinsv.design/guide/rule/f2c89e599b/>
- **DO** Ask for the narrowest field that answers the question: "over 18", not a date of birth.
  <https://www.bitcoinsv.design/guide/rule/cc199d3d88/>
- **DO** Say which Pass issuers you accept, and offer another way to qualify where the law allows.
  <https://www.bitcoinsv.design/guide/rule/783536be60/>
- **DON'T** Make a Pass a condition of signing in when only one feature needs it. Ask at that feature.
  <https://www.bitcoinsv.design/guide/rule/664c4e5f5a/>
- **DO** After the first sign-in, say in one line what your app received and what it cannot see: "Pixel Arcade can recognise you next time. It can't see your balance or your other apps."
  <https://www.bitcoinsv.design/guide/rule/4692ae01e3/>

### Amounts and units

https://www.bitcoinsv.design/guide/patterns/amounts-and-units/

- **DO** Default to satoshis, not BSV, for the bitcoin figure. Everyday amounts are hundreds or thousands of satoshis, and the decimal form is unreadable at that scale.
  <https://www.bitcoinsv.design/guide/rule/7109c0692f/>
- **DO** Write "sats" or "satoshis" in words, and group digits in threes: 12,500 sats.
  <https://www.bitcoinsv.design/guide/rule/cb0ea7723f/>
- **DON'T** _(Costs money)_ Show long decimal BSV amounts in a consumer interface. "0.00012500 BSV" asks the reader to count zeros, and they will get it wrong.
  <https://www.bitcoinsv.design/guide/rule/5fe9c5b068/>
- **DON'T** Adopt a satoshi glyph. None renders reliably, none is in common fonts, and your users have not seen any of them.
  <https://www.bitcoinsv.design/guide/rule/0259e17026/>
- **DO** _(Costs trust)_ Use Bitcoin SV or BSV on screen: "Send BSV", "Your BSV balance", "Bitcoin SV address". Use one of the two consistently within a screen.
  <https://www.bitcoinsv.design/guide/rule/4e724b402c/>
- **DO** Prefer "Bitcoin SV" where there is room and the reader may be new to it, "BSV" where space is tight or the term repeats in a list.
  <https://www.bitcoinsv.design/guide/rule/3c14de2099/>
- **DON'T** _(Costs trust)_ Write "bitcoin" alone on a screen where somebody is about to move money. Used precisely it is an umbrella covering several chains, so it is the one word that cannot tell a user which network they are on. See Bitcoin.
  <https://www.bitcoinsv.design/guide/rule/ff7e7b18ab/>
- **DO** Lead with local currency for anything a person chooses to buy, with the satoshi amount beside it: "£12.00 (24,000 sats)".
  <https://www.bitcoinsv.design/guide/rule/3efb93cfc2/>
- **DO** Lead with satoshis for figures software decides or enforces, such as allowance limits, what is left of an allowance and agent budgets, with local currency beside them.
  <https://www.bitcoinsv.design/guide/rule/4db298dc64/>
- **DO** Let the two be swapped in one tap, and remember the choice.
  <https://www.bitcoinsv.design/guide/rule/ee876b1dbf/>
- **DO** _(Costs trust)_ Say when a converted figure is an estimate, and roughly how fresh the rate is. A price that silently drifts is worse than one labelled approximate.
  <https://www.bitcoinsv.design/guide/rule/ab0796fbfa/>
- **DO** Use tabular figures (tabular-nums in CSS) everywhere a figure appears, so digits line up in a column and a changing balance does not shift the layout.
  <https://www.bitcoinsv.design/guide/rule/052b376429/>
- **DO** Format for the reader's locale. 1,200 and 1.200 and 1 200 are the same number to three different people and three different numbers to one of them.
  <https://www.bitcoinsv.design/guide/rule/a50eb4bb1f/>
- **DO** _(Costs trust)_ Keep one bitcoin unit per screen. Mixing "0.0001 BSV" and "10,000 sats" in one view asks the user to do arithmetic to compare two things you wrote.
  <https://www.bitcoinsv.design/guide/rule/19ba942704/>
- **DON'T** _(Costs trust)_ Abbreviate amounts in a financial context. "12.5k sats" saves four characters and introduces a rounding question.
  <https://www.bitcoinsv.design/guide/rule/e8d6661969/>
- **DON'T** _(Costs trust)_ Shorten a number with an ellipsis, ever. Reformat it or let it wrap.
  <https://www.bitcoinsv.design/guide/rule/28ab6b7ed7/>
- **DO** Leave the fee off the review screen and put it in the transaction details. If it is shown, show it in local currency: "Fee: less than 1p".
  <https://www.bitcoinsv.design/guide/rule/848ac6bb53/>
- **DO** Show the individual amount where it happens and the aggregate where the user is deciding something. "About 1p (20 sats)" on the article, "940 sats (about 47p) today" in the allowance summary.
  <https://www.bitcoinsv.design/guide/rule/fb1efa5b2d/>
- **DO** Round aggregates to a sensible precision in local currency. "About 24p today" is more useful than "£0.2384".
  <https://www.bitcoinsv.design/guide/rule/62d7f58727/>
- **DO** Make sure an amount reads correctly aloud. A screen reader should say "twelve thousand five hundred satoshis", which means the unit needs to be text rather than an image or an unlabelled glyph.
  <https://www.bitcoinsv.design/guide/rule/3873d5026d/>
- **DO** Never rely on colour alone to show direction. Pair the colour with a sign or a word.
  <https://www.bitcoinsv.design/guide/rule/8d1e3f0487/>

### Charging per use

https://www.bitcoinsv.design/guide/patterns/charging-per-use/

- **DO** _(Costs trust)_ Show the running total against the allowance wherever the spending is happening, not only in a settings screen.
  <https://www.bitcoinsv.design/guide/rule/758fae5e4a/>
- **DO** _(Costs trust)_ Put a stop control next to that total. One action, no confirmation, effective immediately.
  <https://www.bitcoinsv.design/guide/rule/780419e009/>
- **DON'T** _(Costs trust)_ Renew an allowance that has ended without asking the user again. A limit that starts again each month within a live grant is normal, provided the reset date is shown beside what is left.
  <https://www.bitcoinsv.design/guide/rule/4399f2f0dc/>
- **DO** Put the cost on the thing: "about 1p (20 sats)" on the article link, "5 sats per request" on the endpoint.
  <https://www.bitcoinsv.design/guide/rule/2b56360d79/>
- **DO** Lead with local currency for anything a person chooses to buy, and with satoshis for anything software decides, with the other figure beside it. "About 1p" means something to a reader; "20 sats" means something to a developer.
  <https://www.bitcoinsv.design/guide/rule/953f6e5714/>
- **DON'T** Round a per-use price up to something tidy because the real number looks odd. The real number is the product's best argument.
  <https://www.bitcoinsv.design/guide/rule/c438b741e1/>
- **DO** Group by what the user was doing, not by transaction. "The Satoshi Vision, 14 articles, about 14p (280 sats)" is one row they understand.
  <https://www.bitcoinsv.design/guide/rule/9f5e2cbddf/>
- **DO** Let that row open into the individual payments, for the person who wants them and the accountant who needs them.
  <https://www.bitcoinsv.design/guide/rule/c9e64e1560/>
- **DO** Lead with the period total. "About 24p today" answers the question they actually have.
  <https://www.bitcoinsv.design/guide/rule/c3d6ec0f9a/>
- **DON'T** Show a notification per payment. The first one is informative, the fortieth is why the feature gets switched off.
  <https://www.bitcoinsv.design/guide/rule/e84ab93e7c/>
- **DO** Show the rate and the elapsed cost together, and update at a pace a person can read. A figure changing ten times a second is not information.
  <https://www.bitcoinsv.design/guide/rule/fbbf1fb8c9/>
- **DO** _(Costs trust)_ Make stopping obvious and instantaneous, and confirm that it stopped. "Stopped. You spent 340 sats." closes the loop.
  <https://www.bitcoinsv.design/guide/rule/0b795249b1/>
- **DO** _(Costs trust)_ Offer a ceiling before starting, not only an allowance. "Stop at 5,000 sats" is a different and more reassuring promise.
  <https://www.bitcoinsv.design/guide/rule/c46631d9e7/>
- **DO** Decide what happens when one payment in a hundred fails: retry, skip, or stop. Then tell the user which, once, rather than reporting each one.
  <https://www.bitcoinsv.design/guide/rule/e1b5b1016a/>
- **DO** _(Costs trust)_ Fail towards not charging. A user who got something free will forgive you; one charged twice will not.
  <https://www.bitcoinsv.design/guide/rule/41ccf96223/>

### Wrong-network payments

https://www.bitcoinsv.design/guide/patterns/wrong-network-payments/

- **DO** _(Costs money)_ Make the handle the default and the address the fallback. Every payment that uses a handle is a payment that cannot go to the wrong network.
  <https://www.bitcoinsv.design/guide/rule/98fc09f14d/>
- **DO** _(Costs money)_ Put the network name next to the address field, always, not only on error. "BSV address" is three words and it is the whole defence.
  <https://www.bitcoinsv.design/guide/rule/fea05e6af6/>
- **DO** _(Costs money)_ Warn on every pasted address rather than trying to detect a bad one. You cannot detect it, and a warning that only fires sometimes teaches people it means something specific.
  <https://www.bitcoinsv.design/guide/rule/7b6afde89f/>
- **DON'T** _(Costs money)_ Use "bitcoin address" as the field label. That is the word that cannot distinguish the networks, on the screen where the distinction is the whole point.
  <https://www.bitcoinsv.design/guide/rule/e92e4f5284/>
- **DO** _(Costs money)_ Put the network on the confirmation, beside the recipient, in the same weight as the amount.
  <https://www.bitcoinsv.design/guide/rule/e7486b509a/>
- **DO** _(Costs money)_ Say plainly what cannot be undone, before the button: "Sent to the wrong network, this usually cannot be recovered."
  <https://www.bitcoinsv.design/guide/rule/94b4f84162/>
- **DO** _(Costs money)_ Offer a test payment for a first-time address above a threshold you choose, and ask the user to check with the recipient that it arrived. It costs a fraction of a penny and it is the only defence that proves the address is right.
  <https://www.bitcoinsv.design/guide/rule/ea9599e1da/>
- **DO** _(Costs trust)_ Say what happened in plain words: which network it went to, that the money is not lost from the chain but is out of reach from here, and what recovery would require.
  <https://www.bitcoinsv.design/guide/rule/6221629f1c/>
- **DO** Give them the transaction reference and the output, so somebody technical can help.
  <https://www.bitcoinsv.design/guide/rule/dc1f50e8b3/>
- **DON'T** Say "transaction failed". It did not fail. It succeeded somewhere else, and telling somebody it failed sends them looking for a refund that is not coming.
  <https://www.bitcoinsv.design/guide/rule/c1d8c3eddf/>
- **DON'T** _(Costs trust)_ Promise recovery you cannot deliver. If it needs the other party's cooperation, say that is what it needs.
  <https://www.bitcoinsv.design/guide/rule/d3b1447e05/>
- **DO** _(Costs money)_ Make the network selection impossible to leave at a default, and restate the chosen network on the confirmation.
  <https://www.bitcoinsv.design/guide/rule/278b3b2795/>
- **DO** Treat a first withdrawal to a new address as a different flow from a repeat one.
  <https://www.bitcoinsv.design/guide/rule/6e0e8f799c/>

### Errors and failed payments

https://www.bitcoinsv.design/guide/patterns/errors-and-failed-payments/

- **DO** _(Costs trust)_ Say whether money moved in every message that follows a payment attempt, including when the answer is that nothing left the wallet.
  <https://www.bitcoinsv.design/guide/rule/10b3023998/>
- **DO** End every error with one thing the user can do, as a button where there is one.
  <https://www.bitcoinsv.design/guide/rule/0e448050b8/>
- **DO** Put the error code and technical detail in an expandable details area with a copy button, so support can ask for it.
  <https://www.bitcoinsv.design/guide/rule/fd58b25cc9/>
- **DO** Keep what the user entered. Return them to where they were with the amount, recipient and note still filled in.
  <https://www.bitcoinsv.design/guide/rule/987ac15fa3/>
- **DON'T** Write "Something went wrong" on its own. If you truly do not know what happened, say what you do know and whether money moved.
  <https://www.bitcoinsv.design/guide/rule/29c4f5d4cc/>
- **DO** Explain a failure in the app when it is about the app's task, such as an article not unlocking, and in the wallet when it is about the user's money or permissions.
  <https://www.bitcoinsv.design/guide/rule/cf11c641f7/>
- **DON'T** _(Costs money)_ Offer "Try again" on a payment until you know the first attempt did not go out.
  <https://www.bitcoinsv.design/guide/rule/24ccdc3485/>
- **DO** _(Costs money)_ Tell the user once when their wallet is retrying for them: "Your wallet will keep trying to send this. You don't need to pay again."
  <https://www.bitcoinsv.design/guide/rule/2a72388be3/>
- **DON'T** Show a refusal or an unanswered wallet prompt in an error style. Both are the user's choice, and red tells them they did something wrong.
  <https://www.bitcoinsv.design/guide/rule/0199a519d1/>

### Letting an agent spend

https://www.bitcoinsv.design/guide/patterns/letting-an-agent-spend/

- **DO** _(Costs money)_ Fund an agent by deliberate top-up, as a human action. A standing instruction to refill is the thing that turns a bounded loss into an unbounded one.
  <https://www.bitcoinsv.design/guide/rule/a96515e0c0/>
- **DON'T** _(Costs money)_ Hand an agent the user's identity key or their Passes. It can have its own identity and act as itself; it should never be able to prove it is the person.
  <https://www.bitcoinsv.design/guide/rule/a4ece91f55/>
- **DO** Show all four on one screen, as current values rather than settings. "412 of 5,000 sats, 18 payments today, 3 services, 22 days left" is a status, and a settings form is not.
  <https://www.bitcoinsv.design/guide/rule/ae1053b72e/>
- **DO** _(Costs money)_ Enforce limits outside the agent, in the wallet or the service holding its keys. A limit the agent checks itself is a limit an injected instruction can argue with.
  <https://www.bitcoinsv.design/guide/rule/63a9fc8258/>
- **DO** _(Costs trust)_ Require a human for anything outside the scope: a new payee, a larger amount, a wider permission. Send the person a notification for it, rather than adding it to a list they have to check.
  <https://www.bitcoinsv.design/guide/rule/8f8a59fa96/>
- **DO** Group by purpose, not by payment. "Research assistant: 6 sources, 240 sats" is reviewable; forty rows are not.
  <https://www.bitcoinsv.design/guide/rule/5199ba4b4f/>
- **DO** _(Costs trust)_ Record what each payment was for at the moment it happens. Intent cannot be reconstructed afterwards.
  <https://www.bitcoinsv.design/guide/rule/e68f2cc069/>
- **DO** _(Costs trust)_ Surface the unusual rather than the complete. A payee it has never paid, or a payment larger than its usual, belongs at the top; the routine belongs in a total.
  <https://www.bitcoinsv.design/guide/rule/03963e9df4/>
- **DON'T** _(Costs trust)_ Report agent spending only in a log. A log is for after somebody already suspects something.
  <https://www.bitcoinsv.design/guide/rule/74988614f8/>
- **DO** _(Costs trust)_ Put one control that stops everything, visible wherever the agent is, with no confirmation step. Confirmations are for actions you might regret, and stopping is not one of them.
  <https://www.bitcoinsv.design/guide/rule/d715b16a24/>
- **DO** Say what stopping means: no further payments, work in progress abandoned, funds stay where they are. A user who is not sure what the button does will not press it.
  <https://www.bitcoinsv.design/guide/rule/e430eb4b01/>
- **DO** _(Costs trust)_ Name the agent and its purpose wherever its spending appears. "Example Assistant, buying search results" is a thing a person can consent to; "automated payments" is not.
  <https://www.bitcoinsv.design/guide/rule/155356ce9f/>
- **DO** Report on a human schedule. A daily summary a person reads beats a real-time feed nobody watches.
  <https://www.bitcoinsv.design/guide/rule/4c5769140c/>

### Holding tokens

https://www.bitcoinsv.design/guide/patterns/holding-tokens/

- **DON'T** _(Costs trust)_ Ask for broad wallet access in order to read a token balance. Ask for the basket. An app that wants everything in order to show one number is the reason permission screens get ignored.
  <https://www.bitcoinsv.design/guide/rule/468c1a74fb/>
- **DO** _(Costs trust)_ Show provenance as a short human sentence before a trade or a transfer: "Issued by Example Studio, 3 owners since, unbroken." The full chain belongs behind that line, not in front of it.
  <https://www.bitcoinsv.design/guide/rule/3d6d023dfe/>
- **DO** _(Costs trust)_ Resolve the real-or-fake question for the user rather than printing an ID and hoping. Match against issuers they already trust, and say plainly when you cannot.
  <https://www.bitcoinsv.design/guide/rule/032bc32a78/>
- **DON'T** _(Costs trust)_ Show a token's picture at the size of a decision without the provenance beside it. The picture is the part that is trivial to fake.
  <https://www.bitcoinsv.design/guide/rule/3ad9441a9c/>
- **DO** _(Costs trust)_ Say what is being written on chain, that it cannot be edited later, and what it costs. The cost is a fraction of a penny, which is worth saying out loud because people expect otherwise.
  <https://www.bitcoinsv.design/guide/rule/19b03c2390/>
- **DO** _(Costs money)_ Treat the supply decision as final in the interface, because it is. A field labelled "Supply" with no warning is a trap.
  <https://www.bitcoinsv.design/guide/rule/d20dfe7b12/>
- **DO** _(Costs trust)_ Name the issuer wherever the balance appears, not only at acquisition. "120 GBP, issued by Example Trust" is the honest form.
  <https://www.bitcoinsv.design/guide/rule/df5ae6683e/>
- **DON'T** _(Costs trust)_ Draw a stablecoin balance in the same type as a BSV balance with no distinction. One is a bearer asset and the other is a claim on a company.
  <https://www.bitcoinsv.design/guide/rule/ab34f1e402/>
- **DO** Choose by what you need enforced on chain rather than by what is popular. A loyalty point and a regulated instrument are not the same design problem, and the stricter family exists for the second.
  <https://www.bitcoinsv.design/guide/rule/88096862ab/>

### Storing data on chain

https://www.bitcoinsv.design/guide/patterns/storing-data-on-chain/

- **DO** _(Costs trust)_ Say "permanent and public" in the consent step, in those words, before anything is written.
  <https://www.bitcoinsv.design/guide/rule/f3791442cf/>
- **DO** _(Costs trust)_ Show exactly what will be written. If it is a hash, say that the document stays on your server and only a fingerprint goes out.
  <https://www.bitcoinsv.design/guide/rule/5ec4966080/>
- **DON'T** _(Costs money)_ Write anything identifying a person without an explicit, specific consent for that write. "Agreed to the terms" is not consent to publish somebody's name forever.
  <https://www.bitcoinsv.design/guide/rule/d18ac5c2f8/>
- **DON'T** _(Costs trust)_ Offer a delete button for on-chain data. You can stop displaying it. That is not the same thing and the difference is the whole point.
  <https://www.bitcoinsv.design/guide/rule/e608a8eef7/>
- **DO** _(Costs trust)_ Default to the hash. Publishing is the irreversible option and should be the deliberate one.
  <https://www.bitcoinsv.design/guide/rule/f21b5fcb40/>
- **DO** Treat the overlay as a dependency the user should know exists, the way you would treat any other service. See Interoperability.
  <https://www.bitcoinsv.design/guide/rule/3b81bf9bb5/>
- **DO** _(Costs trust)_ Make sure the data can still be verified without your overlay. The point of putting it on chain was independence from you.
  <https://www.bitcoinsv.design/guide/rule/7162ccb4f6/>
- **DO** Show progress honestly for anything large, and say what happens if it stops halfway. A partially written file is a real state, not a theoretical one.
  <https://www.bitcoinsv.design/guide/rule/335014706c/>
- **DON'T** Put a large file on chain because you can. Cost is not the constraint; permanence is, and so is the user's understanding of it.
  <https://www.bitcoinsv.design/guide/rule/11cb102c91/>
- **DO** Say "anchored in block 951,204" alongside the human date. The block is the fact; the date is the convenience.
  <https://www.bitcoinsv.design/guide/rule/fec32573be/>

### Pay-per-use reader

https://www.bitcoinsv.design/guide/pay-per-use-reader/

- **DO** Read each screen's reasoning before borrowing it. The prices and limits fit a news site charging about 1p an article and will be wrong for a product charging a hundred times that.
  <https://www.bitcoinsv.design/guide/rule/0939ceecc0/>

### First visit and connecting

https://www.bitcoinsv.design/guide/pay-per-use-reader/first-visit/

- **DO** Mark free articles as plainly as paid ones on the front page, so the absence of a price is never mistaken for a missing label.
  <https://www.bitcoinsv.design/guide/rule/6021bc871a/>
- **DON'T** Put a connect prompt, a sign-in button or a wallet logo on the front page. Nothing there costs money, so nothing there needs a wallet.
  <https://www.bitcoinsv.design/guide/rule/d271628011/>
- **DO** Show enough of a paid article before the price for the reader to judge it: at least the headline, the standfirst and the opening paragraphs.
  <https://www.bitcoinsv.design/guide/rule/bfc87fd11b/>
- **DO** _(Costs trust)_ Name the price, in satoshis and local currency, on the same panel as the connect button. The reader should know what the first tap costs before the wallet opens.
  <https://www.bitcoinsv.design/guide/rule/49340e32ba/>
- **DO** _(Costs trust)_ Ask for a key made for this site only at connection, and nothing else: no identity key, no Pass, no spending grant.
  <https://www.bitcoinsv.design/guide/rule/d0c330a5ba/>
- **DON'T** Treat "Not now" as an error. Keep the reader on the article they chose, with the free paragraphs still showing.
  <https://www.bitcoinsv.design/guide/rule/4addaa532c/>
- **DO** _(Costs money)_ Name the article being bought on the wallet's payment sheet, so the reader can see that the thing she tapped is the thing she is paying for.
  <https://www.bitcoinsv.design/guide/rule/dc76c094e7/>
- **DO** Open the rest of the article in place the moment the wallet reports the payment accepted, at the paragraph where the free part ended.
  <https://www.bitcoinsv.design/guide/rule/b1c3558127/>
- **DON'T** Show the allowance offer before the reader has finished her first paid article, or on any free article.
  <https://www.bitcoinsv.design/guide/rule/a6aa7562f5/>
- **DO** Treat "No thanks" as final for the visit. The reader goes on paying per article with a wallet prompt each time, and the card does not return until her next visit.
  <https://www.bitcoinsv.design/guide/rule/a65df43c2e/>
- **DO** _(Costs trust)_ Give the allowance an end date in the request itself, and show that date on the wallet's sheet. When it ends, ask again and show what the last one was spent on.
  <https://www.bitcoinsv.design/guide/rule/7bf718fae1/>

### Reading and the meter

https://www.bitcoinsv.design/guide/pay-per-use-reader/reading/

- **DO** Show what the article just cost and what is left of today's allowance on the article itself, above the headline, every time the allowance pays for one.
  <https://www.bitcoinsv.design/guide/rule/ab4b564bd6/>
- **DO** Mark articles the reader has already bought as read, without a price, so she never wonders whether opening one again will charge her.
  <https://www.bitcoinsv.design/guide/rule/3d6603a269/>
- **DON'T** _(Costs money)_ Charge for an article the reader has already bought, whether she returns to it on the same day or a month later.
  <https://www.bitcoinsv.design/guide/rule/aa6089c9cb/>
- **DO** List what today's spending bought by article title, with the total first in local currency and the remaining allowance beneath it.
  <https://www.bitcoinsv.design/guide/rule/152e39fc89/>
- **DO** _(Costs money)_ Stop charging the moment the reader taps Stop, before any confirmation or animation, and say how much she spent today.
  <https://www.bitcoinsv.design/guide/rule/2981555d83/>
- **DO** _(Costs trust)_ Say on the stopped state that the allowance still exists in the wallet, and where to remove it.
  <https://www.bitcoinsv.design/guide/rule/3cbfd2bd9e/>
- **DO** Explain a used-up allowance on the article the reader was trying to open, with the free paragraphs still showing, and offer a one-time payment for that article.
  <https://www.bitcoinsv.design/guide/rule/56fe52035b/>
- **DON'T** Raise the limit for the reader, or suggest a larger figure as the default. A new limit is a new request that she types or chooses.
  <https://www.bitcoinsv.design/guide/rule/f4449e6daa/>
- **DON'T** _(Costs money)_ Show Try again on an article while the wallet reports its payment as still being sent.
  <https://www.bitcoinsv.design/guide/rule/08826b6288/>

### Receipts, refunds and leaving

https://www.bitcoinsv.design/guide/pay-per-use-reader/receipts-and-leaving/

- **DO** Describe each payment request with the article's title, short enough to read in one line of a wallet's activity list.
  <https://www.bitcoinsv.design/guide/rule/214f7fdb04/>
- **DO** Let the reader reach every article she has paid for from its receipt, so a receipt doubles as her reading history.
  <https://www.bitcoinsv.design/guide/rule/c2d019f36d/>
- **DO** Put a way to report a faulty article next to each receipt line, not on a separate support page.
  <https://www.bitcoinsv.design/guide/rule/1e0ace6556/>
- **DO** Name the article in the refund's note, so the incoming payment in the reader's wallet explains itself without a visit to the app.
  <https://www.bitcoinsv.design/guide/rule/9b7facd737/>
- **DON'T** _(Costs trust)_ Describe a refund in the app as a payment being reversed or cancelled. Say "We've sent you 20 sats back".
  <https://www.bitcoinsv.design/guide/rule/fc4fae7aaf/>
- **DO** Show the price-change notice to every reader with an active allowance before the new price applies, with the date it takes effect.
  <https://www.bitcoinsv.design/guide/rule/2e3dc44697/>
- **DO** _(Costs trust)_ After a revocation, keep every article the reader already paid for readable once she connects the same wallet again, with no new payment.
  <https://www.bitcoinsv.design/guide/rule/db9aa2e469/>
- **DON'T** Ask for the allowance again in the same panel that tells the reader she is no longer connected. Reconnecting and granting an allowance are two decisions, made at two moments.
  <https://www.bitcoinsv.design/guide/rule/c9932e2e3f/>

### Connected web app

https://www.bitcoinsv.design/guide/connected-web-app/

- **DO** Write down, before drawing any screen, the three things a ticketing site needs from the wallet (a key for this site, one Pass field for age-restricted gigs, one basket for tickets) and treat any request beyond them as a design change that needs a reason.
  <https://www.bitcoinsv.design/guide/rule/1f58a1e7e8/>
- **DON'T** Add an account system "for later" alongside the wallet sign-in. Two ways to be the same person on one site is how people end up with two half-accounts and a support ticket.
  <https://www.bitcoinsv.design/guide/rule/b59e8d08df/>
- **DO** Publish the site's exposure statement where the sign-in button is, as a link, so somebody like Ilse can read what the site asks for before she connects. See Disclose what you use.
  <https://www.bitcoinsv.design/guide/rule/d3d5f245c6/>

### Signing in

https://www.bitcoinsv.design/guide/connected-web-app/signing-in/

- **DO** Let people browse every gig, date and price without connecting. Connecting is for buying and for seeing tickets already bought, not for looking.
  <https://www.bitcoinsv.design/guide/rule/501ad97435/>
- **DON'T** Name a wallet brand on the site's connect button or its explanation. The site works with any compatible wallet, and naming one tells everyone else they are in the wrong place.
  <https://www.bitcoinsv.design/guide/rule/fdd2325a75/>
- **DO** _(Costs trust)_ Ask only for the sign-in key at this step. Payment, the age check and the ticket basket each wait for the screen where Anna first needs them.
  <https://www.bitcoinsv.design/guide/rule/cf71fe8ba0/>
- **DON'T** Treat "Not now" at this prompt as a failure. Put the Connect wallet button back, keep the gig page as it was, and say nothing louder than the button.
  <https://www.bitcoinsv.design/guide/rule/0b0087e7a0/>
- **DO** Show the "what we can and can't see" line once, after the first sign-in only, on the page Anna was already on rather than a separate welcome screen.
  <https://www.bitcoinsv.design/guide/rule/847135ad94/>
- **DON'T** _(Costs trust)_ Ask for a name or email straight after sign-in to make the header friendlier. "Your account" is enough until Anna chooses to add something.
  <https://www.bitcoinsv.design/guide/rule/d243cfb658/>
- **DO** Try a silent sign-in on load when the site has seen this browser before, and fall back to the Connect wallet button only if the wallet does not answer without a prompt.
  <https://www.bitcoinsv.design/guide/rule/00403c452b/>
- **DO** Under the connect button, say in one line that the account follows the wallet, not the device: "Use the same wallet on any device to see your tickets. A different wallet starts a new account."
  <https://www.bitcoinsv.design/guide/rule/064c521df1/>
- **DON'T** _(Costs trust)_ Offer to "find" Anna's account when a different wallet connects. The site cannot tell it is her, and guessing from anything else would link identities she kept apart.
  <https://www.bitcoinsv.design/guide/rule/43d25db81b/>

### Proving an age

https://www.bitcoinsv.design/guide/connected-web-app/proving-an-age/

- **DO** Show the age step only for gigs that have an age limit, and name the venue's rule as the reason: "The Corner Room is over 18 only", not "Verification required".
  <https://www.bitcoinsv.design/guide/rule/7a94fafeb1/>
- **DO** _(Costs trust)_ List on the site, before the wallet prompt opens, the one thing the site will receive and the things it will not, in the same words the wallet is about to use.
  <https://www.bitcoinsv.design/guide/rule/3d0644d70d/>
- **DON'T** _(Costs trust)_ Ask for a date of birth and work out the age on the site. The site then holds a fact it never needed, and the wallet's field-level choice is wasted.
  <https://www.bitcoinsv.design/guide/rule/d0624dea5c/>
- **DO** Request the field with Example Tickets named as the verifier, and if the venue itself will receive the answer, name the venue in the request too, so the wallet's "Sent to" line is true.
  <https://www.bitcoinsv.design/guide/rule/669d27169b/>
- **DO** _(Costs trust)_ Ask for the same single field, "over 18", at every age-restricted checkout, and never widen a later request because an earlier one was granted.
  <https://www.bitcoinsv.design/guide/rule/64fb68ab22/>
- **DO** Name the issuers the site accepts, and who chose them, on the screen that tells somebody they have no suitable Pass.
  <https://www.bitcoinsv.design/guide/rule/dc48748723/>
- **DO** Offer a way to buy that does not depend on a Pass where the venue allows one, so missing a Pass costs Anna a step at the door rather than the ticket.
  <https://www.bitcoinsv.design/guide/rule/4e5ed02371/>
- **DON'T** Send Anna to an issuer and empty her basket behind her. Keep the gig and the ticket she chose waiting for when she comes back.
  <https://www.bitcoinsv.design/guide/rule/3efdf45a21/>
- **DO** Word a refusal as Anna's decision and its one consequence for this gig, and leave every other part of the site, including other gigs, working as before.
  <https://www.bitcoinsv.design/guide/rule/655554b800/>
- **DON'T** Reopen the wallet's Pass prompt automatically after a refusal, or on the next page load. The next request waits for Anna to press Ask my wallet again.
  <https://www.bitcoinsv.design/guide/rule/5f77011557/>

### Buying a ticket

https://www.bitcoinsv.design/guide/connected-web-app/buying-a-ticket/

- **DO** _(Costs money)_ Show on the review screen the same sats amount the wallet's prompt will show, and if the rate moves before Anna presses the button, update the figure on this screen first rather than letting the wallet show a different number.
  <https://www.bitcoinsv.design/guide/rule/cef01aa4a6/>
- **DO** Name who receives the money and who the ticket is for in one line. Anna is paying the ticket site, for a venue, and both names belong on the screen.
  <https://www.bitcoinsv.design/guide/rule/28f49068d4/>
- **DO** Say on the review screen what Anna can do with the ticket afterwards, give it away or not, refund it or not, before she pays rather than in the terms.
  <https://www.bitcoinsv.design/guide/rule/239b48c214/>
- **DON'T** _(Costs money)_ Add a booking fee or any other charge after the review screen. If the product charges one, it is part of the price shown here.
  <https://www.bitcoinsv.design/guide/rule/9d65fbb29c/>
- **DO** Ask for the tickets basket in the first purchase's prompt, as a separate item Anna can decline, and never at sign-in.
  <https://www.bitcoinsv.design/guide/rule/b0b03659e4/>
- **DON'T** _(Costs trust)_ Ask for a spending allowance "to make the next purchase faster". A site people pay a few times a year should ask each time.
  <https://www.bitcoinsv.design/guide/rule/6d94573c75/>
- **DO** Tell Anna where the ticket is, in her wallet, on the confirmation, so she does not wait for an email that is not coming.
  <https://www.bitcoinsv.design/guide/rule/c47043659b/>
- **DO** Write the gig name, venue, date and what the holder may do with the ticket into the token when it is issued, so any wallet can show it without asking the site.
  <https://www.bitcoinsv.design/guide/rule/7d58d12ea1/>
- **DON'T** Let a picture of the ticket be enough to get in. The picture is the part anybody can copy; the door has to check that the person in front of it holds the ticket now.
  <https://www.bitcoinsv.design/guide/rule/ef68ada499/>

### Coming back and leaving

https://www.bitcoinsv.design/guide/connected-web-app/coming-back-and-leaving/

- **DO** Label the site's own control Sign out, and put the one-line pointer to the wallet directly beneath it, so the two actions are read together.
  <https://www.bitcoinsv.design/guide/rule/46eee4d8f2/>
- **DON'T** _(Costs trust)_ Put a "Disconnect" button on the site that only clears the session. Anna would believe the site lost its access when the wallet still lists it.
  <https://www.bitcoinsv.design/guide/rule/c0d587e4e7/>
- **DO** Say on sign-out that it applies to this device only, and that the ticket is unaffected, in one line on the page she lands on.
  <https://www.bitcoinsv.design/guide/rule/bb801914c7/>
- **DON'T** Sign Anna straight back in on the next page load after she pressed Sign out. Wait until she presses Connect wallet again on this device.
  <https://www.bitcoinsv.design/guide/rule/29a3bc70a8/>
- **DO** Treat a sign-in that suddenly prompts again as a returning user whose wallet was cleared or who removed the site, and show the ordinary connect flow without asking why.
  <https://www.bitcoinsv.design/guide/rule/e5fa26e020/>
- **DO** _(Costs trust)_ Store the result of an age check, the gig and the date, and never the Pass or any field beyond the one asked for, and say so on the site's data page.
  <https://www.bitcoinsv.design/guide/rule/174de490e2/>
- **DO** _(Costs money)_ Make a ticket valid at the door from the token alone, so it still works after Anna deletes her data or removes the site from her wallet.
  <https://www.bitcoinsv.design/guide/rule/4740a3dd92/>
- **DON'T** _(Costs trust)_ Keep anything about Anna that this page does not list. If the site starts storing something new, the page changes the same day.
  <https://www.bitcoinsv.design/guide/rule/4bcb851c13/>

### Agent with a budget

https://www.bitcoinsv.design/guide/agent-with-a-budget/

- **DO** Take the split between the assistant and the wallet that holds its keys before you take any screen. Every rule in this section assumes the limits sit in the wallet and not in the assistant's instructions.
  <https://www.bitcoinsv.design/guide/rule/7261906de0/>
- **DON'T** Copy the example numbers as defaults. The budget, rate and expiry here suit one research task, and your product's tasks will need their own.
  <https://www.bitcoinsv.design/guide/rule/fb104d46be/>

### Setting it up

https://www.bitcoinsv.design/guide/agent-with-a-budget/setting-it-up/

- **DO** Say on Scout's first screen, in one line, that the worst case is the amount Anna sends it. "Scout can't spend more than you give it" is the reassurance the whole design rests on.
  <https://www.bitcoinsv.design/guide/rule/b17d517e89/>
- **DON'T** _(Costs trust)_ Offer to connect Scout to Bitcoin SV Wallet with a spending permission as a quicker alternative. Two routes to the same task make the safer one look like the slow one.
  <https://www.bitcoinsv.design/guide/rule/0b18fa39bf/>
- **DO** Show the services row as named services with their prices, never as a field where Anna types an address or a domain.
  <https://www.bitcoinsv.design/guide/rule/600ee0cdee/>
- **DO** Translate the budget into what it buys for this task: "10,000 sats is about 2,000 data requests, or 500 articles." The number only means something beside its use.
  <https://www.bitcoinsv.design/guide/rule/b46e69a9e3/>
- **DON'T** Offer "no end date" as an option on this screen. A delegation with no end is the one nobody comes back to review.
  <https://www.bitcoinsv.design/guide/rule/aca3d05001/>
- **DO** Request exactly the budget Anna set. If she changes the amount in Bitcoin SV Wallet, show the new figure as Scout's budget on the next screen rather than holding on to the old one.
  <https://www.bitcoinsv.design/guide/rule/645df8240b/>
- **DON'T** _(Costs trust)_ Ask Anna to switch on a low-balance refill during funding. Topping up is a separate decision each time, made when she can see what the last budget bought.
  <https://www.bitcoinsv.design/guide/rule/e0a63a7226/>
- **DO** List on the review what will come to Anna for approval: "a new service", "anything over 100 sats", "going over 3,000 sats in a day". The approvals are part of the deal, not a surprise later.
  <https://www.bitcoinsv.design/guide/rule/1ef33c2502/>
- **DO** Name on the review the one device where approvals will arrive, and accept approvals only there.
  <https://www.bitcoinsv.design/guide/rule/0a318cffc3/>
- **DO** Say when and where the daily summary will arrive, and let Anna change the time on this screen.
  <https://www.bitcoinsv.design/guide/rule/850d2dd497/>
- **DO** Disable Start Scout until the top-up has arrived, and say so beside the button: "Waiting for 10,000 sats from Bitcoin SV Wallet".
  <https://www.bitcoinsv.design/guide/rule/3b3d4d7f93/>
- **DON'T** Move the status strip into a settings page once setup is done. Anna checks on Scout from where its work is, and that is where the total and the pause belong.
  <https://www.bitcoinsv.design/guide/rule/d2d9f88b88/>

### While it works

https://www.bitcoinsv.design/guide/agent-with-a-budget/while-it-works/

- **DO** Show each purchase in the task view beside the step of the task it served, so "4 articles" reads as part of the research rather than a separate bill.
  <https://www.bitcoinsv.design/guide/rule/9e1c785b81/>
- **DON'T** Notify Anna's phone for payments inside the limits. She is not watching on purpose, and a buzz per article would teach her to silence Scout entirely.
  <https://www.bitcoinsv.design/guide/rule/ec2a6e2139/>
- **DO** _(Costs money)_ Show the amount and the payee from the payment Scout's wallet refused, and Scout's explanation separately, labelled as Scout's. If the explanation names a different amount, show both and say they disagree.
  <https://www.bitcoinsv.design/guide/rule/fa105418c9/>
- **DO** Name every limit the request breaks: "New service" and "Over 100 sats a payment". Anna is deciding whether the limits were wrong or the request is.
  <https://www.bitcoinsv.design/guide/rule/1c366db638/>
- **DON'T** _(Costs money)_ Put "Always allow" or "Add to Scout's services" on the approval screen. Widening Scout's scope from a notification is how one odd request becomes a standing permission.
  <https://www.bitcoinsv.design/guide/rule/44db19b4c1/>
- **DON'T** _(Costs money)_ Let the assistant approve its own request, or accept an approval from anywhere other than Anna's own device.
  <https://www.bitcoinsv.design/guide/rule/54786d4a9a/>
- **DO** Show what the budget bought on the same screen that says it is spent. Anna decides whether to top up by judging the last budget, not by looking at a zero.
  <https://www.bitcoinsv.design/guide/rule/e1780d0bae/>
- **DO** Offer to finish the task with what Scout has already bought, as an equal choice beside topping up.
  <https://www.bitcoinsv.design/guide/rule/ce0f51aa97/>
- **DO** _(Costs money)_ Refuse a payment above the price shown on the limits screen, even when it is inside the per-payment limit, and send it to Anna like any other request outside scope.
  <https://www.bitcoinsv.design/guide/rule/23eeedf9ef/>
- **DO** _(Costs trust)_ Say plainly when a service kept the money: "Example Data was paid 15 sats and sent nothing back." Whether money moved is the first thing the errors pattern asks every failure to answer.
  <https://www.bitcoinsv.design/guide/rule/62372051f5/>
- **DO** _(Costs money)_ Cap paid retries to one service at a fixed number per task, show that number on the limits screen, and stop using the service when it is reached. Each retry is another payment, and a loop of small failures is how an agent spends its budget on nothing.
  <https://www.bitcoinsv.design/guide/rule/5b82904b28/>

### Reviewing what it did

https://www.bitcoinsv.design/guide/agent-with-a-budget/reviewing-what-it-did/

- **DO** Put refused payments, approvals Anna gave, and any service that kept money without delivering at the top of the daily summary, above the total.
  <https://www.bitcoinsv.design/guide/rule/ab3f4fb4d8/>
- **DO** Say "Nothing unusual today" when that is true. A summary that only ever lists problems leaves Anna unsure whether a quiet one means no problems or a missing section.
  <https://www.bitcoinsv.design/guide/rule/5c690eddfa/>
- **DON'T** Send a summary on a day Scout spent nothing and nothing changed. A daily message with no news is the fastest way to have the useful ones ignored.
  <https://www.bitcoinsv.design/guide/rule/e5e2608c48/>
- **DO** Mark every payment in the trail with the task it served. A payment that belongs to no task is itself something to flag.
  <https://www.bitcoinsv.design/guide/rule/8bcab9ebae/>
- **DO** Show refused payments in the trail beside the ones that went through, marked "Refused, nothing sent". What Scout tried to buy is part of what it did.
  <https://www.bitcoinsv.design/guide/rule/4615a804a2/>
- **DO** _(Costs trust)_ Record Scout's reason with each payment at the moment it is made, and keep it unchangeable. A reason written afterwards is a story, not a record.
  <https://www.bitcoinsv.design/guide/rule/aa39be0fe6/>
- **DON'T** _(Costs trust)_ Present Scout's note in the same style as the amount and payee. The amount and payee come from the payment; the note comes from the agent, and the screen should show the difference.
  <https://www.bitcoinsv.design/guide/rule/d9a50748d3/>
- **DO** Put Pause Scout on any payment Anna has flagged, so she can stop it from the place she noticed the problem.
  <https://www.bitcoinsv.design/guide/rule/1bdb8b66ac/>
- **DON'T** _(Costs trust)_ Offer "Get a refund" or "Dispute" on an agent payment. Scout cannot reverse a payment, and a button that implies it can will be pressed and will fail.
  <https://www.bitcoinsv.design/guide/rule/eabf7ac795/>

### Stopping it

https://www.bitcoinsv.design/guide/agent-with-a-budget/stopping-it/

- **DO** _(Costs trust)_ Show the exact time spending stopped, and whether a payment was already on its way at that moment: "The last payment, 20 sats to The Satoshi Vision at 14:32, went through before you paused."
  <https://www.bitcoinsv.design/guide/rule/e088a098bd/>
- **DO** _(Costs money)_ Make pausing take effect in Scout's wallet, not in the assistant. Spending stops even if the assistant is still running or has not noticed.
  <https://www.bitcoinsv.design/guide/rule/35dd3d1ba8/>
- **DON'T** Ask "Are you sure?" before pausing. Pausing costs nothing and can be undone; a question in front of it only slows down the person who is worried.
  <https://www.bitcoinsv.design/guide/rule/9a51765140/>
- **DO** Say how far the task got and what was already bought, so Anna can decide between resuming, finishing with what there is, and ending.
  <https://www.bitcoinsv.design/guide/rule/3b20dc3c25/>
- **DO** Say what happened to any approval that was waiting: still waiting while paused, cancelled when revoked.
  <https://www.bitcoinsv.design/guide/rule/724639a2fc/>
- **DON'T** _(Costs trust)_ Let Scout's stop message argue for resuming. "I was nearly there" turns a safety control into a negotiation with the thing being stopped.
  <https://www.bitcoinsv.design/guide/rule/f20efb8ac0/>
- **DO** _(Costs trust)_ Say on the revoke screen that the money left in Scout's wallet stays there until Anna sends it back, and show the amount.
  <https://www.bitcoinsv.design/guide/rule/c7dc404e84/>
- **DON'T** Bundle revoking with deleting Scout's activity. Anna may end the job precisely because she wants to look at what happened.
  <https://www.bitcoinsv.design/guide/rule/6ab983417a/>
- **DO** _(Costs money)_ Offer only the wallet that funded Scout as the destination for what is left. A payee chosen at the end of a delegation is a payee nobody vetted.
  <https://www.bitcoinsv.design/guide/rule/1b0b0bbfed/>
- **DO** Close the job with the three numbers Anna will want to reconcile: what she sent, what Scout spent, and what came back.
  <https://www.bitcoinsv.design/guide/rule/65cc5a0d71/>

### Payments

https://www.bitcoinsv.design/guide/how-it-works/payments/

- **DO** Show "Paid" or "Received" as soon as the recipient's wallet replies "accepted". Do not wait for the payment to be mined.
  <https://www.bitcoinsv.design/guide/rule/e3a51dbe82/>
- **DO** Don't show derived payment addresses in the main interface. Show the person, handle or app the payment relates to. Keep raw transaction details in an advanced view.
  <https://www.bitcoinsv.design/guide/rule/b81a18d899/>
- **DO** _(Costs trust)_ Always show the user what they're paying for, and the running total against their allowance. Small, frequent payments add up, and users should never be surprised by them.
  <https://www.bitcoinsv.design/guide/rule/2cc79b8eeb/>

### Nodes and verification

https://www.bitcoinsv.design/guide/how-it-works/nodes/

- **DO** Let a wallet point at a different service provider, and ideally more than one at a time. A wallet welded to one company's endpoint has that company's lifespan.
  <https://www.bitcoinsv.design/guide/rule/52e3b3918c/>
- **DON'T** _(Costs trust)_ Trust a single service's word that a payment is confirmed. The merkle proof is the evidence; verify it against headers rather than displaying whatever the API returned.
  <https://www.bitcoinsv.design/guide/rule/a093cf784f/>
- **DO** Put the services a wallet uses in an advanced settings screen, with what each one is for in one line. Users who care should be able to see and change them.
  <https://www.bitcoinsv.design/guide/rule/ff8678503a/>
- **DON'T** Put verification in front of ordinary users. Nobody should have to understand merkle proofs to be paid.
  <https://www.bitcoinsv.design/guide/rule/1b4fab8a30/>
- **DO** Keep headers synced quietly in the background and never make it a user-facing task. If headers are stale, say what that means for the user ("can't confirm payments from the last 3 days") rather than showing a sync percentage they can do nothing about.
  <https://www.bitcoinsv.design/guide/rule/77fd527bde/>

### Legacy compatibility

https://www.bitcoinsv.design/guide/how-it-works/legacy-compatibility/

- **DO** _(Costs money)_ Show the network on every receive screen that shows a plain address, and warn on send when an address is pasted rather than picked.
  <https://www.bitcoinsv.design/guide/rule/282a044b2d/>
- **DO** _(Costs money)_ When an import of recovery words finds nothing, check the other derivation path before telling the user the wallet is empty.
  <https://www.bitcoinsv.design/guide/rule/cce4fe671e/>
- **DO** _(Costs trust)_ Move funds out of a seed-only wallet by sending them, not by importing its words.
  <https://www.bitcoinsv.design/guide/rule/074187441b/>
- **DO** Pick the payment method automatically, in this order: peer-to-peer, then address-only Paymail, then a plain address.
  <https://www.bitcoinsv.design/guide/rule/dbec310886/>
- **DON'T** Ask the user to choose a payment protocol.
  <https://www.bitcoinsv.design/guide/rule/dd37e63209/>
- **DO** _(Costs trust)_ Every consumer wallet should still be able to send to a plain address. It's the user's guaranteed exit if anything else in the stack fails. Label it clearly, for example Send to external wallet, and make sure it works without any vendor service.
  <https://www.bitcoinsv.design/guide/rule/24346e61e5/>
