080e85c872ca

fix Codex AZTEC_ROUNDTRIP_FAILED — reduce CHUNK_SIZE 1024→800 (was over 1386-char Aztec ceiling); unify overlay header with settings redesign (v3.6.28)

time
2026-05-19 17:18 UTC · 5 months ago
machine
koh2
parent
3cf91c205c62
6 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/styles/popup.css+29 −12src/popup/views/CodexGenerateView.tsx+1 −1src/shared/codex-types.ts+7 −8
manifest.firefox.json+1 −1
@@ -2,7 +2,7 @@22   "_comment_audio_capture": "Firefox does not honor the Chrome 'audioCapture' optional_permission — getUserMedia in WebExtensions is gated solely by the runtime permission prompt. Microphone access for chirp pairing works from the popup under the existing '<all_urls>' host permission; no manifest entry is required or accepted here.",33   "manifest_version": 3,44   "name": "Peach",5-  "version": "3.6.27",5+  "version": "3.6.28",66   "description": "Zero-knowledge password manager",77   "browser_specific_settings": {88     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "3.6.27",4+  "version": "3.6.28",55   "description": "Zero-knowledge password manager",66   "action": {77     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "3.6.27",3+  "version": "3.6.28",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/popup/styles/popup.css+29 −12
@@ -1068,22 +1068,43 @@10681068 10691069 /* Overlay shared header */10701070 .peach-overlay-header {1071-  padding: 10px 12px;1071+  padding: 10px 12px 8px;10721072   display: flex;10731073   align-items: center;1074-  gap: 8px;1075-  border-bottom: 1px solid var(--peach-t3);1074+  gap: 10px;10761075   flex-shrink: 0;10771076 }1077+/* Back button — circular pill matching the settings stack masthead (.stk-back) */1078+.peach-overlay-header .peach-btn--ghost.peach-icon-btn {1079+  width: 28px;1080+  height: 28px;1081+  flex: 0 0 28px;1082+  border-radius: 999px;1083+  border: 1px solid var(--peach-border);1084+  background: color-mix(in srgb, var(--peach-t0) 4%, transparent);1085+  color: var(--peach-t1);1086+  padding: 0;1087+}1088+.peach-overlay-header .peach-btn--ghost.peach-icon-btn:hover {1089+  color: var(--peach-t0);1090+  border-color: color-mix(in srgb, var(--peach-accent) 34%, transparent);1091+  background: color-mix(in srgb, var(--peach-accent) 10%, transparent);1092+}10781093 .peach-overlay-title {1079-  font-family: "IBM Plex Mono", monospace;1080-  font-size: 0.5625rem;1081-  text-transform: uppercase;1082-  letter-spacing: 0.18em;1083-  color: var(--peach-t2);1094+  font-family: var(--font-display);1095+  font-style: italic;1096+  font-weight: 400;1097+  font-size: 20px;1098+  line-height: 1;1099+  color: var(--peach-t0);10841100   flex: 1;10851101   text-align: center;10861102 }1103+/* Balances the 28px back button so the title stays visually centred */1104+.peach-overlay-spacer {1105+  width: 28px;1106+  flex: 0 0 28px;1107+}10871108 10881109 .peach-overlay-card {10891110   background: var(--peach-s1);@@ -4071,10 +4092,6 @@40714092   letter-spacing: 0.06em;40724093   min-width: 44px;40734094   text-align: center;4074-}4075-4076-.peach-overlay-spacer {4077-  width: 32px;40784095 }40794096 40804097 .peach-inline-action {

view file

src/popup/views/CodexGenerateView.tsx+1 −1
@@ -217,7 +217,7 @@217217       case "RECONSTRUCTION_VERIFY_CODE_MISMATCH":218218       case "RECONSTRUCTION_FINGERPRINT_MISMATCH":219219       case "RECONSTRUCTION_COUNT_MISMATCH":220-        return "a self-check failed while building the Codex. nothing was saved. please try again.";220+        return `a self-check failed while building the Codex (${code}). nothing was saved. please try again.`;221221       default:222222         return message || "Codex generation failed.";223223     }

view file

src/shared/codex-types.ts+7 −8
@@ -154,19 +154,18 @@154154 /**155155  * Bytes of binary data per chunk. Each chunk becomes one Aztec code.156156  *157- * Sized for scan reliability over page-count: a 1024-byte chunk produces a158- * ~1450-char envelope and a ~115-module Aztec symbol, which at the printed159- * CODE_SIZE=80pt yields ~0.24mm modules — the proven density that decodes160- * reliably from cheap laser prints, old phone cameras, and folded paper.161- * The empirical bwip-js ceiling at eclevel=25 is ~1386 bytes, but pushing162- * close to that shrinks per-module physical size and erodes margin in the163- * print→scan loop. This is a disaster-recovery surface; reliability wins.157+ * The envelope JSON is: base64url(chunkBytes) + ~100 chars of metadata.158+ * base64url expands by 4/3: 800 bytes → 1068 chars → ~1168-char envelope.159+ * The empirical bwip-js/ZXing ceiling at eclevel=25 is ~1386 chars; staying160+ * ~200 chars under gives reliable headroom across cheap printers, camera161+ * angles, and ZXing decode variance. The original 1024-byte value produced162+ * ~1468-char envelopes — over the ceiling, causing AZTEC_ROUNDTRIP_FAILED.164163  *165164  * Old Codexes printed with a different chunk size still restore — the166165  * erasure decoder derives shard size from the scanned chunks, not from167166  * this constant.168167  */169-export const CHUNK_SIZE = 1024;168+export const CHUNK_SIZE = 800;170169 171170 /** Floor on parity shards: a Codex must always survive losing at least 2 codes. */172171 export const CODEX_MIN_PARITY_SHARDS = 2;

view file