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
↓ peach-browser-080e85c8.tar.gzatlas at this save
files changed6 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 −8manifest.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": {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",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": {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 {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 }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;