d1bc895e5e
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.
4.4 KiB
4.4 KiB
ROADMAP — Proof of Work
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
retryOnTransportErrordoes NOT fix it. Diagnosis so far:LoginFormonly 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 NodekeepAliveTimeout/headersTimeoutserver-side; a client retry only masks it.
- Files:
lib/retryAction.ts,app/auth/login/LoginForm.tsx,app/auth/signup/SignupForm.tsx.
- 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:
AI quality
- Tiered prompt formatting (also the immediate next step): JSON-Schema output enforcement via Ollama
formatand OpenAIresponse_format; pipe-separated library rows; XML-tagged prompt sections; Ollama-only few-shot example; stable prefix first for prompt-cache hits. - Keep
MODEL_MENU/PRICEScurrent as providers ship new models.
Security & hardening (from 2026-06-13 full-eval; full detail + file:line in EVALUATION.md)
- Still open — verify on the box: whether the StartOS proxy forwards real client IPs to the app. The rate limiter now keys on the rightmost (trusted-proxy)
X-Forwarded-Forentry; if the proxy instead makes every client look like one IP, the per-IP cap collapses to a single global bucket. Confirm with live headers. - P3 hardening batch (remaining): CSP
unsafe-evalvs comment,/api/healthinfo disclosure, rate-limit map leak, configurable/shorter sessions (currently 30-day), no text max-length. Also unify the 3rd JSON-parse pattern inprograms/[id]/days/[dayId]/start(try{json}catch{→{}}).
Done in 1.2.0:1–:3: Next 14→15 / React 18→19 bump (1.2.0:1, closed RSC DoS / WS-upgrade SSRF / App Router XSS + middleware-bypass CVEs); iOS-Safari login first-tap retry (1.2.0:2); login timing oracle closed + exerciseId ownership enforced on all workout-write & program routes (1.2.0:3).
Done in 1.1.0:9 (P2 batch): input-validation 500s → 400 (lib/http.ts readJsonBody + explicit guards); POST /api/auth rate-limited; XFF anti-spoof; container drops root via su-exec.
Packaging / distribution
- Diagnose and fix the
publish.shStep-3 registry-register silent no-op. - Build for
arm/ additional arches once StartOS 0.4 supports them on the host. - Consider submission to the Start9 community registry (use the start9-spec-checker agent first). Blockers found 2026-06-13: non-SPDX
"Proprietary"license, missinginstructions.md, 404packageRepo/upstreamRepoURLs, stale "0.3.5 data snapshot" install alert + long description; plus warnings (PNG vs SVG icon, migration-era README, no.github/workflows, genericdocsUrls, Node 20 vs 22).
Product
- Adherence tracking: compare logged workouts against the planned
ProgramDay(theprogramDayIdlink already exists). - Per-user export/import polish and scheduled backups.
- CSV export↔import round-trip: export writes
setX-prefixed headers (setCalories/setWatts/setNotes) the importer doesn't read (it expectscalories/watts/notes), so the app's own CSV export silently drops those on re-import (calories long-standing; watts since 1.2.0:4). Fix by aligning export header names with the parser, or adding the prefixed names asknownColumnsaliases. (JSON account export/import round-trips fine.) - Charts/progress views over history (the data and 1RM estimates already exist).
Hygiene
- Delete the legacy
start9/0.4/workout-log_x86_64.s9pkbuild artifact; drop unusedbcryptjsfromstart9/0.4/package.json. - Revisit
workout-planner/scratch dir — remove if truly unused.