From d1bc895e5eb81492221ae3473c8eeb0f77162606 Mon Sep 17 00:00:00 2001 From: Keysat Date: Tue, 16 Jun 2026 16:04:12 -0500 Subject: [PATCH] Log Safari first-tap login bug as a known bug with diagnosis 1.2.0:2's retryOnTransportError does not fix the mobile-Safari first-login failure (reproduced on 1.2.0:5: first tap errors, second works). Record the diagnosis and the gating next step (capture the first request's error code: -1005 -> client delayed retry; 502/503 -> Node keep-alive tuning) so a future session resumes from here. Correct the now-stale Current state line. --- AGENTS.md | 2 +- ROADMAP.md | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index baa0f67..e98f726 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -111,7 +111,7 @@ Latest version is **1.2.0:5** — **Gear replaces RPE as the cardio effort field **Confirmed on-box (2026-06-16, via `start-cli`):** box runs `1.2.0:5`; entrypoint logged `adding missing column SetLog.gear` and (earlier boot) `SetLog.watts`, each once; app launches `as nextjs` with no permission errors (clears the 1.2.0:3 / long-standing 1.1.0:9 non-root check). App DB shows an Assault Bike set saved with `gear=1` and no `rpe` — Gear select renders + persists for cardio, RPE for strength. Recent prior ships (1.2.0 line): **1.2.0:3** P3 hardening (login timing oracle + `exerciseId` ownership); **1.2.0:2** iOS Safari login first-tap retry; **1.2.0:1** Next 15 / React 19 upgrade. -**Pending on-box check (only one left):** the **1.2.0:2** Safari first-tap proof — log in from Safari on iPhone/iPad and confirm the *first* Sign In tap works (client-side; not visible in server logs). If it still occasionally fails, grab the Web Inspector error: `-1005` confirms the retry path is right; anything else points at a proxy↔container keep-alive mismatch. +**No on-box checks pending.** Known bug (tracked in `ROADMAP.md` → Known bugs): the **1.2.0:2** Safari first-tap retry did NOT fix the mobile-Safari first-login failure — reproduced on 1.2.0:5, first tap shows "An unexpected error occurred", second tap works. Diagnosis captured; the fix is gated on one data point — the first failed request's error code from Safari Web Inspector (`-1005` → client delayed-retry; `502`/`503` → Node keep-alive tuning). Working: workout logging, programs (manual + AI), multi-user, curated library, full AI subsystem (5 providers, multi-config, background generation, history detail, cost/duration, Ollama auto-detect, infinite-scroll exercise history). diff --git a/ROADMAP.md b/ROADMAP.md index 3323a28..ee7aa21 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,6 +2,14 @@ Longer-term backlog. Near-term state + next steps live in `AGENTS.md` → Current state. +## Known bugs + +- **Mobile-Safari first-login-tap fails ("An unexpected error occurred"); second tap works.** Reproduced on iPhone/iPad Safari against 1.2.0:5 (desktop Safari untested — user declined). The first Sign In tap fails, a second manual tap succeeds. **1.2.0:2's `retryOnTransportError` does NOT fix it.** Diagnosis so far: `LoginForm` only surfaces that error when *both* the initial action call and its in-tap retry throw, so the immediate retry isn't escaping the bad connection — only a fresh user-initiated tap does. Box app logs show no server-side error/500/reset around the attempt, so it's a transport-layer failure, not an app bug. + - **Gating data (do this first):** capture the first failed request's error in Safari Web Inspector (iOS→Mac, Network/Console tab). The code picks the fix: + - `-1005` "The network connection was lost" → client-side stale keep-alive socket. Fix = a *delayed* retry (let Safari tear down the dead socket before retrying), not the current instant one. + - `502`/`503` → StartOS-proxy↔Node keep-alive mismatch (Node closing idle conns the proxy reuses). Fix = raise Node `keepAliveTimeout`/`headersTimeout` server-side; a client retry only masks it. + - Files: `lib/retryAction.ts`, `app/auth/login/LoginForm.tsx`, `app/auth/signup/SignupForm.tsx`. + ## AI quality - Tiered prompt formatting (also the immediate next step): JSON-Schema output enforcement via Ollama `format` and OpenAI `response_format`; pipe-separated library rows; XML-tagged prompt sections; Ollama-only few-shot example; stable prefix first for prompt-cache hits.