Skip to content

feat(reading): update text styles for readability and consistency#7

Merged
Simplemart17 merged 1 commit into
mainfrom
feature/1-3-practice-exercises-verification
Mar 26, 2026
Merged

feat(reading): update text styles for readability and consistency#7
Simplemart17 merged 1 commit into
mainfrom
feature/1-3-practice-exercises-verification

Conversation

@Simplemart17

Copy link
Copy Markdown
Owner

No description provided.

@Simplemart17 Simplemart17 merged commit 895ecc3 into main Mar 26, 2026
1 check failed
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.
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.
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