feat(reading): update text styles for readability and consistency#7
Merged
Merged
Conversation
This was referenced May 8, 2026
Simplemart17
added a commit
that referenced
this pull request
May 15, 2026
…742) - P1/P5/P7 migration drift Case 10 updated for CASE pattern + NEW Case 13 (CEFR validation) + Case 9 regex broadened (Story 12-12 M1 variable-name-agnostic) - P8/P10 hook test Case 6 strengthened (title + subtitle assertions) + NEW Case 14 deferred-resolve mountedRef test (manually-resolvable Promise + unmount before resolve) - P11 screen drift NEW Case 8 supabase-import NEGATIVE guard (defends against re-introducing direct supabase import for unrelated reasons) - P13 pgTAP test #7 order-independence (DELETE-before-seed + MAX expectation pin)
Simplemart17
added a commit
that referenced
this pull request
May 16, 2026
… from Story 13-8) Epic 13 closed. 8 of 8 stories shipped: - 13-1 transcript render-storm fix - 13-2 home query fan-out reduction - 13-3 session-feedback aggregate RPC - 13-4 streaming mock-test generation - 13-5 history modal FlatList virtualization - 13-6 Sentry sampling + perf-conservative SDK flags - 13-7 className/style resolution on hot animated rows - 13-8 prompt-truncation perf verification Delivery metrics: - +252 net Jest cases (1607 → 1859) - 65 round-1 review patches across 7 reviewed stories (13-8 review pending) - 0 production incidents - All 4 quality gates green on every story merge - Peak round-1 patch count: 13 (Story 13-3) — under the Epic 12 retro's 15-patch threshold for round-2 auto-trigger Significant discovery (load-bearing finding of the epic): Story 13-8's calibration cycle surfaced that Story 11-7's "25× reduction on user-derived tail" claim was empirically 6.7× — overstated by ~4×. The 25× was computed against user-item content only; reality includes ~1,318 chars of <USER_FACTS>/<USER_WEAK_AREAS> wrapper text per Story 9-4. Still a meaningful ~85% reduction in user-derived bytes per session, but the marketing was wrong. MIN_REDUCTION_RATIO pinned at 5× at CI level. What went well: - Single-chokepoint refactor + delete-don't-alias patterns applied consistently in 6 of 8 stories - Drift detector + comment-stripped source + scoped JSX/function-body extraction became a project-wide idiom - Range-based assertions over exact-value (Story 13-7 P3 → Story 13-8 calibration) replaced over-tight failure mode - Audit accuracy: every Epic 13 story closed its stated audit finding - Verification-as-deliverable pattern (13-8) surfaced a real discrepancy What didn't go well: - 0 of 3 Epic 13 ACs verified empirically on device (all architectural proxies). Device profiling needed before Epic 16 ships. - Story 11-7's claim sat for 4 epics without a CI pin — endemic CLAUDE.md "perf claim drift" pattern - 8 of 9 Epic 12 action items remained open at Epic 13 close — same pattern from Epic 10 retro. Action items aren't getting done. - CLAUDE.md grew to ~80KB; compression sweep is preventive maintenance 9 action items filed: 1. Correct Story 11-7 CLAUDE.md paragraph (25× → 6.7×) 2. Sweep CLAUDE.md for unverified numerical claims (continues Epic 12 AI #9) 3. Device profiling pass before Epic 16 (iPhone 11 + Pixel 4a + 4G-throttled networks; pin the 3 Epic 13 ACs) 4. bmad workflow: action-item accountability (block next-epic on prior AI status, or formally drop) 5. Tune adversarial review prompts to reduce noise (Story 13-4 had 30+ rejects) 6. Codify "Bounded-budget cap pattern" as CLAUDE.md subsection (carry-over from Epic 12 AI #1) 7. Shared test utils (MinimalTestInstance + react-native-reanimated mock + findAllNodes/flattenStyle helpers duplicated in 3 files) 8. Carry forward Epic 12 AIs #5, #6, #7 unchanged 9. Compress mature CLAUDE.md paragraphs (Stories 9-X / 10-X) Epic 14 (UI/UX Consistency) plan sound. No plan revision required. Operator decision required on 14.1 language strategy before Epic 14 kickoff. Sprint-status updated: epic-13-retrospective optional → done.
This was referenced May 16, 2026
Simplemart17
added a commit
that referenced
this pull request
May 16, 2026
… migrations (#103) * feat(epic-14-3): icon system replacement — Feather wrapper + 33 emoji migrations Closes audit roadmap line 272 (icon system replacement) architecturally. - NEW src/components/common/Icon.tsx (~90 LOC) wraps @expo/vector-icons.Feather (already transitive via Expo SDK 55 — zero install cost). Exports Icon (React.memo'd) + IconProps + IconName typed union (22 members) + decorative-of-text a11y default (importantForAccessibility="no" when accessibilityLabel omitted, per Story 14-2 R1-H1 lesson). - Extended SkillCard + ListItemCard with iconNode?: React.ReactNode slot (overrides iconEmoji when present); TodayPlanItem with iconName?: IconName prop (precedence over iconEmoji). Legacy iconEmoji props preserved for content-emoji surfaces. - 33 chrome/status/decoration emoji REPLACED across 11 source files: - CHROME (8): login + signup + forgot-password (mail/lock/user/key), home ConversationCard mic, conversation CONVERSATION_MODES companion mode (discriminated-union typed-icon-or-emoji). - SKILL/SECTION (16): mock-test SECTIONS + production + results SECTION_LABELS, practice PRACTICE_SKILLS (8 emoji → typed IconName) + Vocabulary featured, vocabulary hero, use-daily-briefing icon maps. - STATUS (4): vocabulary celebration + caught-up, sessionId strengths, PasswordStrengthIndicator checklist met state. - DECORATION (Q3 + Q4): profile streak 🔥 → zap; forgot-password hero 🔑 → key at 52px. - 18 LEARNING CONTENT emoji PRESERVED (Story 14-1 chrome/content rule): 12 conversation TOPIC_EMOJIS + 6 onboarding goal emoji + 2 milestone celebration emoji not in inventory. - 5 operator decisions resolved per spec recommendations: Q1 Feather / Q2 preserve onboarding / Q3 zap / Q4 key / Q5 activity (Feather lacks Brain pictogram — semantic-adjacent EKG icon). - NEW src/components/common/__tests__/icon-replacement-source-drift.test.ts (18 cases) — per Story 12-2 P12 + 13-2 P11 + 13-7 R1-P4 + 14-2 R1-M7 lessons: Icon.tsx structural pins + SkillCard/ListItemCard iconNode + 11 per-screen paired POSITIVE/NEGATIVE pins + TOPIC_EMOJIS content-boundary defense. - NEW src/components/common/__tests__/icon.test.tsx (5 cases) — runtime smoke via react-test-renderer + shared test utilities (Epic 13 retro AI #7). findFeatherProps helper disambiguates via name + size duo. - 0 new packages / migrations / Edge Function changes / CI workflow changes — load-bearing scope discipline. Cross-story invariants verified clean: 9-3 Sentry allowlist / 9-4 prompt-injection N/A / 11-1 tool-call N/A / 11-2 reconnect N/A / 12-1 RealtimeOrchestrator orthogonal / 12-6 transcript cap orthogonal / 13-1 transcript render-storm orthogonal / 13-7 frozen-static-style N/A (Icon is thin wrapper; no className+style merge) / 14-1 chrome rule preserved (drift detector pins both axes) / 14-2 SkillCard+ListItemCard iconEmoji API preserved; iconNode is additive. +23 net Jest cases (1917 → 1940; exceeds spec target +12-18 by 5-11). All 4 quality gates green (type-check 0 / lint 0 / prettier clean / jest 99 suites / 1940 cases). * fix(epic-14-3): review-round-1 patches (HIGH × 3 + MED × 3) Adversarial 3-layer review (Blind Hunter + Edge Case Hunter + Acceptance Auditor APPROVE_WITH_NOTES) converged on a load-bearing iOS a11y regression + drift completeness gaps + a TodayPlanItem lying-contract. P1 (HIGH) — iOS a11y regression on Icon decorative default: Pre-R1 only `importantForAccessibility="no"` (Android-only). On iOS VoiceOver still focused icons beside labeled TextInputs (auth-surface mail/lock/user icons). Fixed by adding `accessible={false}` + `accessibilityElementsHidden={true}` for cross-platform parity. Mirrors Story 14-2 PasswordStrengthIndicator pattern. P2 (HIGH) — TodayPlanItem lying-contract: Both `iconName?` + `iconEmoji?` were optional with JSDoc-only "one of" invariant; pre-R1 render silently produced empty tinted circles when both missing. Fixed with 3-arm conditional + "?" placeholder fallback (textTertiary color) — visible signal instead of silent. P3 (HIGH) — drift NEGATIVE-pin completeness: signup.tsx only had 👤 negative-pinned (missed ✉️ + 🔒); use-daily-briefing.ts only had 📚 + 🎯 negative-pinned (missed 🎧 📖 ✍️ 💬 📝 from emojiMap). TypeScript catches via interface but belt-and-suspenders pin discipline (Story 13-2 P11) was incomplete. Extended both. P4 (MED) — PasswordStrengthIndicator vertical-jitter: New `<View width={14}>` wrapper had no fixed height; Icon (12pt) and `·` Text (caption line-height ~16-18pt) caused row-height jiggle on each keystroke. Added `height: 18`. P5 (MED) — TodayPlanItem icon contrast: Icon at `color={iconColor}` (100% saturation) on `skillTint(iconColor, 0.12)` background reduces WCAG AA contrast on light tints. Changed to `Colors.textPrimary` (navy) — high contrast on all tints. P6 (MED) — home/index.tsx raw-glyph drift pin: Pre-R1 only pinned JS escape form `🎙️`. Added raw 4-byte UTF-8 `🎙️` form too. Plus 3 LOW polish: - TOPIC_EMOJIS drift regex format-tolerant (accepts \uXXXX escape OR literal accented char — defensive against future format passes) - Completion Notes Q5 wording corrected (3 sites → 2 sites; TCF Canada has no Grammar section in mock-test/index.tsx) - CLAUDE.md file count corrected (17 → 22) Deferred (4): SkillCard.emoji-empty-string API smell (cosmetic); IconName maintenance burden doc; conversation-mode pill asymmetry (defensible per Q1); sessionId Strengths/Improvements arrow asymmetry (filed for chore/14-3-followup). Rejected as noise (10+): AC inventory count drift / findFeatherProps predicate non-uniqueness / Mock-leaks-name-as-Text-children / React.memo over-rerender (self-withdrawn) / 18px visual size shift / pre-existing legacy-section blank rendering. +1 net round-1 Jest case (1940 → 1941; new Case 6 in icon.test.tsx verifies decorative flags NOT set when accessibilityLabel provided). All 4 quality gates green.
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.