Skip to content

Fix the iOS app's open bugs before TestFlight - #234

Merged
cmicpace merged 7 commits into
mainfrom
claude/ios-bug-pass-f3bdb6
Nov 6, 2026
Merged

cmicpace merged 7 commits into
mainfrom
claude/ios-bug-pass-f3bdb6

Conversation

@cmicpace

@cmicpace cmicpace commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator

Six open bugs from the 2026-11-04 iOS bug hunt (plans/ios-app-bugs.md, open items 2, 3, 4, 5, 8, and 9), fixed before TestFlight testers hit them on their first lesson. One commit each; the hunt's fixed table has them as rows 15 to 20.

Open item Fix Commit
2. HTML visuals slow to appear The next screen's HTML visuals are measured at the widths they'll be laid out at (a question's visual, option cards, order items, a hotspot's parts), and a frame fades in once it has loaded 38de93e
3. Marked answer under the tray After a check (or Why?), the lowest marked answer scrolls up 12 points clear of the grown tray aa4f555
4. Raw offline error Requests time out after 15 seconds; a lesson, Explore, and the test lessons say "Couldn't reach learn.ninja…" (a new string in every locale) with Try again 44ed0b6
5. VoiceOver misses the mark Answer controls and hotspot parts carry "correct", "not right", or "partly right" as their accessibility value 3a035b4
8. No shadow-xs in Tailwind 3 The web's shadow-xs is in the theme; control surfaces, mark tints, and pressed buttons are solid fills, so Metro's shadow advice is gone fafc9e5
9. Order kata layout shifts Visual items are one width in the pool and in their slot, and every card, slot, and space is as tall as the tallest item f73e2a4

Each visible fix was checked on the iPhone 18 Pro simulator against a local server; screenshots are in plans/ios-app-bugs-{visuals,tray,offline,order}.png. VoiceOver wasn't heard on the simulator, and the shadow itself is too faint to see on dark. New tests cover the layout widths, the visuals measured ahead, the marked-answer scroll, the mark words, and the request timeout. npm run check is green.

🤖 Generated with Claude Code

cmicpace and others added 7 commits November 6, 2026 13:42
A placed visual item was about 20 points taller than an empty slot (its
padding around the visual against a fixed min-h-16), so everything below
moved as items were placed, and the pool's dashed spaces shrank to that
min-h-16 once their item left. Each visual is now laid out at one width
wherever it sits (half the column, orderItemWidth), and every card, open
slot, and dashed space is as tall as the tallest item. Tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…S app

Only a concept's visual was measured while the screen before was read, so
option cards and order items opened at 240 points and jumped to their
height, and a hotspot waited on its parts. The player now measures every
HTML visual on the next screen at the width it'll be laid out at
(visuals-ahead.ts, from the screens' own classes in visual-widths.ts): a
question's visual, each option card at the widths it can take, order items,
and a hotspot's parts. A card's panel waits for its layout instead of
measuring at the column's width first. The WebView still takes a second or
more to draw, so a frame now fades in once its document has loaded instead
of popping in over an empty window. Tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After a check the tray grows to show the feedback, and on a long question
(map vs forEach's scenario) it covered the marked answer. Marked controls
now register with the player (answer-marks.ts), and 250 ms after a check,
or after Why? opens, the lowest of them scrolls up clear of the tray, never
past its own top, as the web's phone layout does. An option card now takes
its mark through Control too, coloring only its border. Tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mark badge is hidden from accessibility and nothing took its place, so
VoiceOver read a checked option the same as before the check. Every answer
control (option rows and cards, chips, sort and order items), and an HTML
hotspot's parts, now carry the mark in words as their accessibility value,
which VoiceOver reads right after the label: "correct", "not right", or
"partly right", the player's own screen-reader words from player-core, in
the player's language. Tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the server out of reach a lesson said only that it didn't load, the
lesson and home requests had no timeout (a server that never answered left
a spinner up), and the test lessons on the signed-out home just vanished.
The API fetch now gives up after 15 seconds, body and all, and turns a
request that fails to reach the server into an OfflineError; the visuals'
stylesheet and the test lesson list take the same timeout. A lesson, the
Explore feed, and the test lessons then say "Couldn't reach learn.ninja.
Check your connection and try again." (a new player string, in every
locale) with Try again. Tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ills

shadow-xs is Tailwind 4's; Tailwind 3 has none, so every card and control
drew no shadow. It's now in the app's theme as the web's (1 pixel down, 2
of blur, 5% black). A shadow needs a solid fill for iOS to work out its
shape, and React Native kept advising "cannot calculate shadow
efficiently": a control's surface and its pressed shade are now the input
tint laid over the page (solid), a mark's 10% tint is mixed into the page's
color, the clear states (a used word, a settled pair, a rewound option, a
blank's gap) drop the shadow by style, and a filled button shows its press
by fading instead of with a translucent fill. No advice in Metro through a
lesson.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Open items 2, 3, 4, 5, 8, and 9 are rows 15 to 20 of the fixed table, each
with its commit and, where the fix shows, its simulator screenshot; their
places in the open list say where they went, so nothing is renumbered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
learn.ninja Ready Ready Preview Nov 6, 2026 1:14pm UTC

Request Review

@cmicpace
cmicpace merged commit c02fdbc into main Nov 6, 2026
6 checks passed
@cmicpace
cmicpace deleted the claude/ios-bug-pass-f3bdb6 branch November 6, 2026 13:27

This branch was successfully deployed

1 active deployment
Preview — 73111044 Deployed Nov 6, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant