aboutsummaryrefslogtreecommitdiff
path: root/docs/SETTINGS_SPIKE.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/SETTINGS_SPIKE.md')
-rw-r--r--docs/SETTINGS_SPIKE.md20
1 files changed, 19 insertions, 1 deletions
diff --git a/docs/SETTINGS_SPIKE.md b/docs/SETTINGS_SPIKE.md
index a3e2328..a6eb736 100644
--- a/docs/SETTINGS_SPIKE.md
+++ b/docs/SETTINGS_SPIKE.md
@@ -69,7 +69,7 @@ Run on 2026-10-21 by the project owner with the Store beta of Settings Spike on
| A. Longest single field that arrives complete | 8000 characters, the longest string tested |
| A. What happens above that (refused / error / cut to N) | Not tested: no string longer than 8000 was tried |
| B. Largest total across the eight fields | 64,000 characters (8 fields of 8000) saved and arrived complete |
-| C. Characters that didn't arrive or blocked saving | The phone **refused to save** the `special` string. An `otpauth://` URI with `&`, `?`, `=`, `:` and `@` saved and arrived. Which of `< > \ " { } %`, the accented letters, `€` or the emoji blocks saving is not known yet: see the follow-up below |
+| C. Characters that didn't arrive or blocked saving | The phone **refused to save** the `special` string. An `otpauth://` URI with `&`, `?`, `=`, `:` and `@` saved and arrived. The follow-up below split it: only the backslash `\` is refused; every other group and an Aegis export without backslashes save |
| D. Status written by the watch visible on the phone (yes/no) | Yes: the phone shows the "seen ... change #N" line and its number goes up |
| D. Password field empty after the watch cleared it (yes/no) | Yes |
| E. Changes arrive while the app is open (yes/no) | Yes |
@@ -83,6 +83,24 @@ Run on 2026-10-21 by the project owner with the Store beta of Settings Spike on
The `special` string mixes many characters, so its failure doesn't say which one the phone rejects. The test-string page now has eight short strings, one per character group (`C1` percent, `C2` angle brackets, `C3` backslash, `C4` double quote, `C5` braces, `C6` accented letters and `€`, `C7` emoji, `C8` a JSON fragment), and `aegis-json`, a complete fake unencrypted Aegis export with one entry. Paste each into Text 2 and save; note which ones the phone refuses. Regenerate the page with `python3 spike/settings/test-strings/make_test_strings.py`.
+Results (2026-10-27, Android, the same phone and watch as above):
+
+| String | Characters | Saved and arrived |
+| --- | --- | --- |
+| C1 | `%` | Yes |
+| C2 | `< >` | Yes |
+| C3 | `\` | **No: the phone refused to save it** |
+| C4 | `"` | Yes |
+| C5 | `{ }` | Yes |
+| C6 | `ä ö ü ß €` | Yes |
+| C7 | emoji | Yes |
+| C8 | a JSON fragment | Yes |
+| aegis-json | a complete fake unencrypted Aegis export | Yes |
+
+The backslash alone blocks saving, which explains the `special` string. Aegis JSON can be pasted as long as it contains no `\`, so the import design (README 11) stays as it is: `otpauth://` links and unencrypted Aegis exports. The owner also imported a real Aegis export on the Forerunner 70 the same day.
+
+Aegis on Android writes JSON with Android's `org.json`, which escapes `/` as `\/`. A `/` appears in entry icons (base64 data and `"image\/png"`) and sometimes in a name or issuer; a `"` in a name is written as `\"`. Such an export is refused by the phone. Workarounds, in the user guide: replace every `\/` with `/` in a text editor (the JSON stays valid), remove the entry icons in Aegis before exporting, or paste `otpauth://` links instead. Test C3 is accepted as a known limitation; no fix is planned.
+
This decides whether Aegis JSON can be pasted into the import fields at all (it needs `"`, `{`, `}` and sometimes `\`). If the phone refuses those characters, Aegis import goes back to the design table: the fallback is pasting `otpauth://` URIs, which are confirmed to work.
### What the results change