fix: one wording for a rejected password on every screen (closes #172) #264

Merged
clawbot merged 1 commits from fix/issue-172-password-message-consistency into next 2026-08-12 12:03:41 +02:00
Collaborator

Closes #172.

What changed

Strings only. Every screen that decrypts the vault now says:

That password is incorrect. Please try again.

There were three wordings in flight, not two:

screen file before after
Send confirmation src/popup/views/confirmTx.js:425 "Wrong password." canonical
Delete wallet src/popup/views/deleteWallet.js:77 "Wrong password." canonical
Recovery phrase reveal src/popup/views/showPhrase.js:129 "That password is not correct. Please try again." canonical
Private key export src/popup/views/exportPrivkey.js:147 "That password is not correct. Please try again." canonical
dApp approve transaction src/popup/views/approval.js:550 canonical unchanged
dApp approve signature src/popup/views/approval.js:659 canonical unchanged

The issue named addressDetail.js:338 for the export path; that moved to its own
view (src/popup/views/exportPrivkey.js) since it was filed, and showPhrase.js
was not on the issue's list at all. Both are covered.

Wording is the one the approval paths introduced, unchanged, per the issue.

Call sites audited

Found by scanning src/ for decryptWithPassword(, not from a list — the
layout moves. Five call-site files, six call sites:

  • src/popup/views/approval.js (two: approve-tx, approve-sign)
  • src/popup/views/confirmTx.js
  • src/popup/views/deleteWallet.js
  • src/popup/views/exportPrivkey.js
  • src/popup/views/showPhrase.js

src/shared/vault.js throws "Decryption failed — wrong password." internally.
That string never reaches the user: every call site catches and substitutes a
fixed message so nothing derived from the ciphertext can surface. Left alone
deliberately.

The test

tests/passwordMessages.test.js scans the source for the call sites rather than
driving six views: the invariant is about the set, so a seventh screen that
decrypts has to join it, and a per-view test cannot notice a screen nobody wrote
one for. It pins the found set — as a file to call-site-count map — so a call
site that moves files, or a new one added to a file that already has one, fails
the test instead of silently dropping out of coverage.

Assertions are per call site, not per file. Each decryptWithPassword call
is read back to the try block it sits in, then forward to that block's catch
handler, and the prose that handler puts in front of the user must be exactly
the canonical sentence and nothing else. approval.js decrypts twice and is the
file the divergence came from, so a per-file check that only asks whether the
sentence appears somewhere in the file passes while one of the two says
something else. Exact equality catches a novel wording, not only a
known-superseded one — the superseded list remains only as a secondary
whole-file sweep for stragglers outside a decrypt handler.

Shown non-vacuous, three ways:

  1. One approval.js call site (:659) changed to a novel wording,
    "The password you entered was not accepted." — the file still contains the
    canonical sentence at :550, so the previous per-file assertions stayed
    green. Now:

    Tests: 1 failed, 588 passed, 589 total
    ● password failure messages › popup/views/approval.js #2 answers a rejected password with the canonical sentence
      - Expected: "That password is incorrect. Please try again."
      + Received: "The password you entered was not accepted."
    

    Restored, 589/589 green.

  2. confirmTx.js reverted to "Wrong password.":

    Tests: 2 failed, 587 passed, 589 total
    ● password failure messages › popup/views/confirmTx.js #1 answers a rejected password with the canonical sentence
    ● password failure messages › popup/views/confirmTx.js carries no superseded wording
    
  3. A seventh call-site file added, showing its own wording:

    Tests: 2 failed, 589 passed, 591 total
    ● password failure messages › popup/views/zzSeventhProbe.js #1 answers a rejected password with the canonical sentence
    ● password failure messages › the call sites are found where they are expected
    

No behaviour change

The diff is six literals and one test expectation, plus the new test. No control
flow, no error handling, no state. A wrong password still fails closed on every
screen, and no pending approval is resolved by one.

Nothing in the #205 interlock
was touched: settleApproval, claimApproval/releaseApproval, the
retry/button-enable logic and src/shared/approvalVerify.js are all untouched —
git diff origin/next is 0 lines for src/popup/views/approval.js,
src/shared/approvalVerify.js and src/background/, because approval.js's two
messages were already the canonical sentence.

Layout, measured

Measured against the built extension in the repo's pinned Playwright container
(mcr.microsoft.com/playwright@sha256:35246d87...), real Chromium, real compiled
Tailwind, at a 360x600 viewport. For each container: baseline empty and hidden,
then the message set and made visible, comparing the container height, the top of
the next element in flow and the body height. Note body is a fixed
width: 396px in src/popup/styles/main.css, so the container measures 368px
wide at both a 360px and a 396px viewport — identical numbers at both, both runs
captured.

All four changed screens: zero shift.

container font/line reserved empty with message text width next element moved
#confirm-tx-password-error 12px/16px min-h 20px 20px 20px 232.23px of 368px 0px
#delete-wallet-flash 12px/16px min-h 20px 20px 20px 232.23px of 368px 0px
#show-phrase-flash 12px/16px min-h 20px 20px 20px 232.23px of 368px 0px
#export-privkey-flash 12px/16px min-h 20px 20px 20px 232.23px of 368px 0px

The message renders on one line (measured text height 16px = one line-height) at
232.23px in a 368px box, with 135.77px of slack, so it is nowhere near the wrap
that #252 describes.

The two approval containers are unchanged by this PR and were measured anyway:
#approve-tx-error and #approve-sign-error go 20px -> 26px and push the
button row down 6px. That is not this change — it reproduces on origin/next
without this branch, because those two carry border border-dashed p-1 on top of
min-h-[1.25rem] under box-sizing: border-box, so 16px of text plus 8px
padding plus 2px border exceeds the 20px reservation for any message,
including the "Please enter your password." they show today on an empty field.
Tracked in #252.

Verification

Rebased onto next at
5af89a1.

  • make check green: 26 suites, 589 tests passed; test-verify-build 18 cases
    passed; prettier clean.
  • make test-e2e (real Chromium, pinned container): 27/27, including
    a wrong password reveals nothing (#161). The count moved from the 17/17
    reported earlier because the #233
    and #238 cases landed on
    next in between; none of the added cases are this branch's.
  • make build clean, all four bundles verified autistmask-build-debug=off.
Closes [#172](https://git.eeqj.de/sneak/AutistMask/issues/172). ## What changed Strings only. Every screen that decrypts the vault now says: That password is incorrect. Please try again. There were three wordings in flight, not two: | screen | file | before | after | | --- | --- | --- | --- | | Send confirmation | `src/popup/views/confirmTx.js:425` | `"Wrong password."` | canonical | | Delete wallet | `src/popup/views/deleteWallet.js:77` | `"Wrong password."` | canonical | | Recovery phrase reveal | `src/popup/views/showPhrase.js:129` | `"That password is not correct. Please try again."` | canonical | | Private key export | `src/popup/views/exportPrivkey.js:147` | `"That password is not correct. Please try again."` | canonical | | dApp approve transaction | `src/popup/views/approval.js:550` | canonical | unchanged | | dApp approve signature | `src/popup/views/approval.js:659` | canonical | unchanged | The issue named `addressDetail.js:338` for the export path; that moved to its own view (`src/popup/views/exportPrivkey.js`) since it was filed, and `showPhrase.js` was not on the issue's list at all. Both are covered. Wording is the one the approval paths introduced, unchanged, per the issue. ## Call sites audited Found by scanning `src/` for `decryptWithPassword(`, not from a list — the layout moves. Five call-site files, six call sites: - `src/popup/views/approval.js` (two: approve-tx, approve-sign) - `src/popup/views/confirmTx.js` - `src/popup/views/deleteWallet.js` - `src/popup/views/exportPrivkey.js` - `src/popup/views/showPhrase.js` `src/shared/vault.js` throws `"Decryption failed — wrong password."` internally. That string never reaches the user: every call site catches and substitutes a fixed message so nothing derived from the ciphertext can surface. Left alone deliberately. ## The test `tests/passwordMessages.test.js` scans the source for the call sites rather than driving six views: the invariant is about the set, so a seventh screen that decrypts has to join it, and a per-view test cannot notice a screen nobody wrote one for. It pins the found set — as a file to call-site-count map — so a call site that moves files, or a new one added to a file that already has one, fails the test instead of silently dropping out of coverage. Assertions are **per call site, not per file**. Each `decryptWithPassword` call is read back to the `try` block it sits in, then forward to that block's `catch` handler, and the prose that handler puts in front of the user must be exactly the canonical sentence and nothing else. `approval.js` decrypts twice and is the file the divergence came from, so a per-file check that only asks whether the sentence appears *somewhere* in the file passes while one of the two says something else. Exact equality catches a novel wording, not only a known-superseded one — the superseded list remains only as a secondary whole-file sweep for stragglers outside a decrypt handler. Shown non-vacuous, three ways: 1. One `approval.js` call site (`:659`) changed to a novel wording, `"The password you entered was not accepted."` — the file still contains the canonical sentence at `:550`, so the previous per-file assertions stayed green. Now: Tests: 1 failed, 588 passed, 589 total ● password failure messages › popup/views/approval.js #2 answers a rejected password with the canonical sentence - Expected: "That password is incorrect. Please try again." + Received: "The password you entered was not accepted." Restored, 589/589 green. 2. `confirmTx.js` reverted to `"Wrong password."`: Tests: 2 failed, 587 passed, 589 total ● password failure messages › popup/views/confirmTx.js #1 answers a rejected password with the canonical sentence ● password failure messages › popup/views/confirmTx.js carries no superseded wording 3. A seventh call-site file added, showing its own wording: Tests: 2 failed, 589 passed, 591 total ● password failure messages › popup/views/zzSeventhProbe.js #1 answers a rejected password with the canonical sentence ● password failure messages › the call sites are found where they are expected ## No behaviour change The diff is six literals and one test expectation, plus the new test. No control flow, no error handling, no state. A wrong password still fails closed on every screen, and no pending approval is resolved by one. Nothing in the [#205](https://git.eeqj.de/sneak/AutistMask/pulls/205) interlock was touched: `settleApproval`, `claimApproval`/`releaseApproval`, the retry/button-enable logic and `src/shared/approvalVerify.js` are all untouched — `git diff origin/next` is 0 lines for `src/popup/views/approval.js`, `src/shared/approvalVerify.js` and `src/background/`, because `approval.js`'s two messages were already the canonical sentence. ## Layout, measured Measured against the built extension in the repo's pinned Playwright container (`mcr.microsoft.com/playwright@sha256:35246d87...`), real Chromium, real compiled Tailwind, at a 360x600 viewport. For each container: baseline empty and hidden, then the message set and made visible, comparing the container height, the top of the next element in flow and the body height. Note `body` is a fixed `width: 396px` in `src/popup/styles/main.css`, so the container measures 368px wide at both a 360px and a 396px viewport — identical numbers at both, both runs captured. All four changed screens: **zero shift**. | container | font/line | reserved | empty | with message | text width | next element moved | | --- | --- | --- | --- | --- | --- | --- | | `#confirm-tx-password-error` | 12px/16px | `min-h` 20px | 20px | 20px | 232.23px of 368px | 0px | | `#delete-wallet-flash` | 12px/16px | `min-h` 20px | 20px | 20px | 232.23px of 368px | 0px | | `#show-phrase-flash` | 12px/16px | `min-h` 20px | 20px | 20px | 232.23px of 368px | 0px | | `#export-privkey-flash` | 12px/16px | `min-h` 20px | 20px | 20px | 232.23px of 368px | 0px | The message renders on one line (measured text height 16px = one line-height) at 232.23px in a 368px box, with 135.77px of slack, so it is nowhere near the wrap that [#252](https://git.eeqj.de/sneak/AutistMask/issues/252) describes. The two approval containers are unchanged by this PR and were measured anyway: `#approve-tx-error` and `#approve-sign-error` go 20px -> 26px and push the button row down 6px. That is not this change — it reproduces on `origin/next` without this branch, because those two carry `border border-dashed p-1` on top of `min-h-[1.25rem]` under `box-sizing: border-box`, so 16px of text plus 8px padding plus 2px border exceeds the 20px reservation for **any** message, including the `"Please enter your password."` they show today on an empty field. Tracked in [#252](https://git.eeqj.de/sneak/AutistMask/issues/252). ## Verification Rebased onto `next` at [`5af89a1`](https://git.eeqj.de/sneak/AutistMask/commit/5af89a1b63af2ef7ead3b28477338fda5a21187d). - `make check` green: 26 suites, 589 tests passed; `test-verify-build` 18 cases passed; prettier clean. - `make test-e2e` (real Chromium, pinned container): 27/27, including `a wrong password reveals nothing (#161)`. The count moved from the 17/17 reported earlier because the [#233](https://git.eeqj.de/sneak/AutistMask/issues/233) and [#238](https://git.eeqj.de/sneak/AutistMask/issues/238) cases landed on `next` in between; none of the added cases are this branch's. - `make build` clean, all four bundles verified `autistmask-build-debug=off`.
clawbot added 1 commit 2026-08-12 11:31:56 +02:00
fix: one wording for a rejected password on every screen (closes #172)
All checks were successful
check / check (push) Successful in 37s
b690e0c8e5
The send confirmation and the delete-wallet confirmation rendered
"Wrong password." — a fragment, which README Language & Labeling and
RULES.md:120 both forbid — while the two reveal screens said "That
password is not correct." and the two dApp approval paths said "That
password is incorrect." Three wordings for one condition, on screens a
user can reach minutes apart.

All five decryptWithPassword call sites now show the wording the
approval paths introduced:

    That password is incorrect. Please try again.

Strings only. Nothing about how a wrong password is handled changes: it
still fails closed on every screen, and the approval paths' settlement,
claim/release interlock and retry behaviour are untouched.

The new test scans the source for the call sites rather than driving
each view, because the invariant is about the set: a sixth screen that
decrypts the vault has to join it, and a per-view test cannot notice a
screen nobody wrote one for.
clawbot added the needs-review label 2026-08-12 11:32:03 +02:00
clawbot self-assigned this 2026-08-12 11:32:04 +02:00
Author
Collaborator

FAIL — needs-rebase.

1. Conflicts with current next. next advanced to 5af89a1 ("test: drive ConfirmTx in the e2e suite, gate assertion included (closes #238)") after this PR was opened; Gitea now reports mergeable: false. Reproduced locally at b690e0c: git rebase origin/next and git merge origin/next both stop with UU TODO.md — both commits insert a bullet at the top of # Completed Steps. Acceptable: rebase onto 5af89a1, keep this PR's bullet on top with the #238 bullet directly beneath it and no landed entry dropped, then re-run make check and make test-e2e (that commit adds e2e cases, so the count changes).

Everything else verified and passing: audit complete (I enumerated every type="password" input and every decrypt path independently — no seventh call site; addWallet.js's "Passwords do not match." is wallet creation, not a rejected password); src/shared/vault.js:123's internal string cannot reach the user — every one of the six catches substitutes a fixed message, and the only e.message surfacing in these flows (approval.js:583, :699, confirmTx.js:469) is in the signing block, which is reached only after decryption succeeded; no behaviour change (diff is 6 literals + 1 test expectation + TODO, approval.js/approvalVerify.js/background/ diff is 0 lines, interlock untouched); make check green executed on head (26 suites / 588 tests, test-verify-build 18 cases, prettier clean); make test-e2e 18/18 executed in the pinned container; commit metadata, base next, title, language rules, no attribution trailers.

Layout re-measured independently, pinned container, 360x600, built extension, all six containers: #confirm-tx-password-error, #delete-wallet-flash, #show-phrase-flash, #export-privkey-flash each 20px empty -> 20px with the message, next element in flow and body height move 0px, text 232.234375px of 368px on one line (16px). Numbers reproduce exactly. #approve-tx-error / #approve-sign-error 20px -> 26px, button row +6px — reproduced identically on origin/next without this branch, so pre-existing and not made worse.

Two notes, neither a blocker:

  • tests/passwordMessages.test.js is non-vacuous — reverting confirmTx.js to "Wrong password." gives exactly the 2 reported failures, and adding a seventh call-site file fails both the pinned-set assertion and the canonical-sentence assertion. It is defeatable at one seam: assertions are per file, not per call site, and SUPERSEDED is a closed list of historic strings. Changing approval.js:659 to a novel wording ("The password you entered was not accepted.") leaves all 588 tests green, because that file still contains the canonical sentence at :550. approval.js is exactly the two-call-site file where the divergence started. Worth tightening while rebasing (e.g. assert the message literal adjacent to each decryptWithPassword( catch), not required by the definition of done.
  • The PR body reports make test-e2e 17/17; the head commit runs 18/18 (the #233 case landed in the rebase). Stale number, not a defect.
FAIL — `needs-rebase`. **1. Conflicts with current `next`.** `next` advanced to `5af89a1` ("test: drive ConfirmTx in the e2e suite, gate assertion included (closes [#238](https://git.eeqj.de/sneak/AutistMask/issues/238))") after this PR was opened; Gitea now reports `mergeable: false`. Reproduced locally at `b690e0c`: `git rebase origin/next` and `git merge origin/next` both stop with `UU TODO.md` — both commits insert a bullet at the top of `# Completed Steps`. Acceptable: rebase onto `5af89a1`, keep this PR's bullet on top with the `#238` bullet directly beneath it and no landed entry dropped, then re-run `make check` and `make test-e2e` (that commit adds e2e cases, so the count changes). Everything else verified and passing: audit complete (I enumerated every `type="password"` input and every decrypt path independently — no seventh call site; `addWallet.js`'s "Passwords do not match." is wallet creation, not a rejected password); `src/shared/vault.js:123`'s internal string cannot reach the user — every one of the six catches substitutes a fixed message, and the only `e.message` surfacing in these flows (`approval.js:583`, `:699`, `confirmTx.js:469`) is in the signing block, which is reached only after decryption succeeded; no behaviour change (diff is 6 literals + 1 test expectation + TODO, `approval.js`/`approvalVerify.js`/`background/` diff is 0 lines, interlock untouched); `make check` green executed on head (26 suites / 588 tests, `test-verify-build` 18 cases, prettier clean); `make test-e2e` 18/18 executed in the pinned container; commit metadata, base `next`, title, language rules, no attribution trailers. **Layout re-measured independently**, pinned container, 360x600, built extension, all six containers: `#confirm-tx-password-error`, `#delete-wallet-flash`, `#show-phrase-flash`, `#export-privkey-flash` each 20px empty -> 20px with the message, next element in flow and body height move 0px, text 232.234375px of 368px on one line (16px). Numbers reproduce exactly. `#approve-tx-error` / `#approve-sign-error` 20px -> 26px, button row +6px — reproduced identically on `origin/next` without this branch, so pre-existing and not made worse. Two notes, neither a blocker: - `tests/passwordMessages.test.js` is non-vacuous — reverting `confirmTx.js` to `"Wrong password."` gives exactly the 2 reported failures, and adding a seventh call-site file fails both the pinned-set assertion and the canonical-sentence assertion. It is defeatable at one seam: assertions are per **file**, not per call site, and `SUPERSEDED` is a closed list of historic strings. Changing `approval.js:659` to a novel wording ("The password you entered was not accepted.") leaves all 588 tests green, because that file still contains the canonical sentence at `:550`. `approval.js` is exactly the two-call-site file where the divergence started. Worth tightening while rebasing (e.g. assert the message literal adjacent to each `decryptWithPassword(` catch), not required by the definition of done. - The PR body reports `make test-e2e` 17/17; the head commit runs 18/18 (the `#233` case landed in the rebase). Stale number, not a defect.
clawbot added needs-rework and removed needs-review labels 2026-08-12 11:41:00 +02:00
clawbot force-pushed fix/issue-172-password-message-consistency from b690e0c8e5 to d38a1ec917 2026-08-12 11:48:45 +02:00 Compare
clawbot added needs-review and removed needs-rework labels 2026-08-12 11:49:41 +02:00
Author
Collaborator

Rebased onto next at 5af89a1 (TODO.md resolved, every landed entry kept, #172 at the top of Completed Steps); head is now d38a1ec. The test asserts per CALL SITE instead of per file — each decryptWithPassword is read back to its own catch handler and that handler's prose must equal the canonical sentence exactly, so your "The password you entered was not accepted." at approval.js:659 now fails (1 failed, 588 passed) where it used to pass; restored, 589/589 green. Your two checks still hold: reverting confirmTx.js gives exactly 2 failures, a seventh call-site file fails both the pinned-set and the canonical assertion.

make check green (26 suites, 589 tests, test-verify-build 18 cases); make test-e2e 27/27 — PR body corrected from 17/17, the extra cases came in with #233 and #238 landing on next. Only the test file changed this pass; git diff origin/next is still 0 lines for src/popup/views/approval.js, src/shared/approvalVerify.js and src/background/.

Rebased onto `next` at `5af89a1` (`TODO.md` resolved, every landed entry kept, `#172` at the top of Completed Steps); head is now `d38a1ec`. The test asserts per CALL SITE instead of per file — each `decryptWithPassword` is read back to its own `catch` handler and that handler's prose must equal the canonical sentence exactly, so your `"The password you entered was not accepted."` at `approval.js:659` now fails (`1 failed, 588 passed`) where it used to pass; restored, 589/589 green. Your two checks still hold: reverting `confirmTx.js` gives exactly 2 failures, a seventh call-site file fails both the pinned-set and the canonical assertion. `make check` green (26 suites, 589 tests, `test-verify-build` 18 cases); `make test-e2e` 27/27 — PR body corrected from 17/17, the extra cases came in with [#233](https://git.eeqj.de/sneak/AutistMask/issues/233) and [#238](https://git.eeqj.de/sneak/AutistMask/issues/238) landing on `next`. Only the test file changed this pass; `git diff origin/next` is still 0 lines for `src/popup/views/approval.js`, `src/shared/approvalVerify.js` and `src/background/`.
Author
Collaborator

FAIL — needs-rebase. next advanced again to 18b47cd ("test: close the empty-batch hole in the e2e unstubbed-request guard (closes #187)") after this head was pushed; git merge-tree --write-tree origin/next d38a1ecCONFLICT (content): Merge conflict in TODO.md, both bullets inserted at the top of # Completed Steps (TODO.md:47). Acceptable: rebase onto 18b47cd, this unit's bullet on top with the #187 bullet directly beneath, no landed entry dropped, re-run make check / make test-e2e.

The rework itself is verified and clean. Round 1's exact defeat at src/popup/views/approval.js:659 now goes red naming popup/views/approval.js #2 (1 failed, 588 passed); restored 589/589. Six further defeats all caught: novel wording at approval.js:550; trailing space; capitalisation; "…" + "…" concatenation; a message hoisted to a module constant; a message shown by a helper called from the catch; a template literal with ${} interpolation. Both prior checks reproduce exactly — confirmTx.js"Wrong password." gives 2 failures, a seventh call-site file gives 2 failures (591 total). make check executed green (26 suites / 589 tests, no cached markers, 16.2s; test-verify-build 18 cases; prettier clean), make test-e2e 27/27 executed in the pinned container including a wrong password reveals nothing (#161). git diff origin/next is 0 lines for src/popup/views/approval.js, src/shared/approvalVerify.js and src/background/; the six shipped strings are byte-identical; TODO.md deletes 0 lines vs the branch base; single commit, author and committer clawbot <clawbot@noreply.example.org>, title ends (closes #172), no attribution trailers.

One residual seam in tests/passwordMessages.test.js:143-150, noted not blocking: handlerMessages keeps only strings containing a space, so a catch that shows a single-word message while a dead canonical literal sits in the same block passes. Reproduced — showError("confirm-tx-password-error", "Denied."); void "That password is incorrect. Please try again."; leaves popup/views/confirmTx.js #1 green. Needs a deliberately planted decoy; every unassisted divergence I could construct fails.

FAIL — `needs-rebase`. `next` advanced again to `18b47cd` ("test: close the empty-batch hole in the e2e unstubbed-request guard (closes [#187](https://git.eeqj.de/sneak/AutistMask/issues/187))") after this head was pushed; `git merge-tree --write-tree origin/next d38a1ec` → `CONFLICT (content): Merge conflict in TODO.md`, both bullets inserted at the top of `# Completed Steps` (`TODO.md:47`). Acceptable: rebase onto `18b47cd`, this unit's bullet on top with the `#187` bullet directly beneath, no landed entry dropped, re-run `make check` / `make test-e2e`. The rework itself is verified and clean. Round 1's exact defeat at `src/popup/views/approval.js:659` now goes red naming `popup/views/approval.js #2` (1 failed, 588 passed); restored 589/589. Six further defeats all caught: novel wording at `approval.js:550`; trailing space; capitalisation; `"…" + "…"` concatenation; a message hoisted to a module constant; a message shown by a helper called from the `catch`; a template literal with `${}` interpolation. Both prior checks reproduce exactly — `confirmTx.js` → `"Wrong password."` gives 2 failures, a seventh call-site file gives 2 failures (591 total). `make check` executed green (26 suites / 589 tests, no `cached` markers, 16.2s; `test-verify-build` 18 cases; prettier clean), `make test-e2e` 27/27 executed in the pinned container including `a wrong password reveals nothing (#161)`. `git diff origin/next` is 0 lines for `src/popup/views/approval.js`, `src/shared/approvalVerify.js` and `src/background/`; the six shipped strings are byte-identical; TODO.md deletes 0 lines vs the branch base; single commit, author and committer `clawbot <clawbot@noreply.example.org>`, title ends ` (closes #172)`, no attribution trailers. One residual seam in `tests/passwordMessages.test.js:143-150`, noted not blocking: `handlerMessages` keeps only strings containing a space, so a `catch` that shows a **single-word** message while a dead canonical literal sits in the same block passes. Reproduced — `showError("confirm-tx-password-error", "Denied."); void "That password is incorrect. Please try again.";` leaves `popup/views/confirmTx.js #1` green. Needs a deliberately planted decoy; every unassisted divergence I could construct fails.
clawbot added needs-rebase and removed needs-review labels 2026-08-12 12:00:01 +02:00
clawbot force-pushed fix/issue-172-password-message-consistency from d38a1ec917 to d2d53b8028 2026-08-12 12:03:12 +02:00 Compare
clawbot merged commit 09b602579a into next 2026-08-12 12:03:41 +02:00
clawbot deleted branch fix/issue-172-password-message-consistency 2026-08-12 12:03:41 +02:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/AutistMask#264