Finish Genesis rollout: enable chapters 31–50, update navigation and service worker cache#1
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3742e6132c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <span class="qnav-book-meta"><span class="qnav-ch-count">31 live</span><span class="qnav-book-chev">▼</span></span> | ||
| </button> | ||
| <div class="qnav-ch-grid"><a href="Genesis_1.html" class="qnav-ch-btn live">Ch 1</a><a href="Genesis_2.html" class="qnav-ch-btn live">Ch 2</a><a href="Genesis_3.html" class="qnav-ch-btn live">Ch 3</a><a href="Genesis_4.html" class="qnav-ch-btn live">Ch 4</a><a href="Genesis_5.html" class="qnav-ch-btn live">Ch 5</a><a href="Genesis_6.html" class="qnav-ch-btn live">Ch 6</a><a href="Genesis_7.html" class="qnav-ch-btn live">Ch 7</a><a href="Genesis_8.html" class="qnav-ch-btn live">Ch 8</a><a href="Genesis_9.html" class="qnav-ch-btn live">Ch 9</a><a href="Genesis_10.html" class="qnav-ch-btn live">Ch 10</a><a href="Genesis_11.html" class="qnav-ch-btn live">Ch 11</a><a href="Genesis_12.html" class="qnav-ch-btn live">Ch 12</a><a href="Genesis_13.html" class="qnav-ch-btn live">Ch 13</a><a href="Genesis_14.html" class="qnav-ch-btn live">Ch 14</a><a href="Genesis_15.html" class="qnav-ch-btn live">Ch 15</a><a href="Genesis_16.html" class="qnav-ch-btn live">Ch 16</a><a href="Genesis_17.html" class="qnav-ch-btn live">Ch 17</a><a href="Genesis_18.html" class="qnav-ch-btn live">Ch 18</a><a href="Genesis_19.html" class="qnav-ch-btn live">Ch 19</a><a href="Genesis_20.html" class="qnav-ch-btn live">Ch 20</a><a href="Genesis_21.html" class="qnav-ch-btn live">Ch 21</a><a href="Genesis_22.html" class="qnav-ch-btn live">Ch 22</a><a href="Genesis_23.html" class="qnav-ch-btn live">Ch 23</a><a href="Genesis_24.html" class="qnav-ch-btn live">Ch 24</a><a href="Genesis_25.html" class="qnav-ch-btn live">Ch 25</a><a href="Genesis_26.html" class="qnav-ch-btn live">Ch 26</a><a href="Genesis_27.html" class="qnav-ch-btn live">Ch 27</a><a href="Genesis_28.html" class="qnav-ch-btn live">Ch 28</a><a href="Genesis_29.html" class="qnav-ch-btn live">Ch 29</a><a href="Genesis_30.html" class="qnav-ch-btn live">Ch 30</a><a href="Genesis_31.html" class="qnav-ch-btn live current">Ch 31</a><span class="qnav-ch-btn coming">Ch 32</span><span class="qnav-ch-btn coming">Ch 33</span><span class="qnav-ch-btn coming">Ch 34</span><span class="qnav-ch-btn coming">Ch 35</span><span class="qnav-ch-btn coming">Ch 36</span><span class="qnav-ch-btn coming">Ch 37</span><span class="qnav-ch-btn coming">Ch 38</span><span class="qnav-ch-btn coming">Ch 39</span><span class="qnav-ch-btn coming">Ch 40</span><span class="qnav-ch-btn coming">Ch 41</span><span class="qnav-ch-btn coming">Ch 42</span><span class="qnav-ch-btn coming">Ch 43</span><span class="qnav-ch-btn coming">Ch 44</span><span class="qnav-ch-btn coming">Ch 45</span><span class="qnav-ch-btn coming">Ch 46</span><span class="qnav-ch-btn coming">Ch 47</span><span class="qnav-ch-btn coming">Ch 48</span><span class="qnav-ch-btn coming">Ch 49</span><span class="qnav-ch-btn coming">Ch 50</span></div> | ||
| <div class="qnav-ch-grid"><a href="Genesis_1.html" class="qnav-ch-btn live">Ch 1</a><a href="Genesis_2.html" class="qnav-ch-btn live">Ch 2</a><a href="Genesis_3.html" class="qnav-ch-btn live">Ch 3</a><a href="Genesis_4.html" class="qnav-ch-btn live">Ch 4</a><a href="Genesis_5.html" class="qnav-ch-btn live">Ch 5</a><a href="Genesis_6.html" class="qnav-ch-btn live">Ch 6</a><a href="Genesis_7.html" class="qnav-ch-btn live">Ch 7</a><a href="Genesis_8.html" class="qnav-ch-btn live">Ch 8</a><a href="Genesis_9.html" class="qnav-ch-btn live">Ch 9</a><a href="Genesis_10.html" class="qnav-ch-btn live">Ch 10</a><a href="Genesis_11.html" class="qnav-ch-btn live">Ch 11</a><a href="Genesis_12.html" class="qnav-ch-btn live">Ch 12</a><a href="Genesis_13.html" class="qnav-ch-btn live">Ch 13</a><a href="Genesis_14.html" class="qnav-ch-btn live">Ch 14</a><a href="Genesis_15.html" class="qnav-ch-btn live">Ch 15</a><a href="Genesis_16.html" class="qnav-ch-btn live">Ch 16</a><a href="Genesis_17.html" class="qnav-ch-btn live">Ch 17</a><a href="Genesis_18.html" class="qnav-ch-btn live">Ch 18</a><a href="Genesis_19.html" class="qnav-ch-btn live">Ch 19</a><a href="Genesis_20.html" class="qnav-ch-btn live">Ch 20</a><a href="Genesis_21.html" class="qnav-ch-btn live">Ch 21</a><a href="Genesis_22.html" class="qnav-ch-btn live">Ch 22</a><a href="Genesis_23.html" class="qnav-ch-btn live">Ch 23</a><a href="Genesis_24.html" class="qnav-ch-btn live">Ch 24</a><a href="Genesis_25.html" class="qnav-ch-btn live">Ch 25</a><a href="Genesis_26.html" class="qnav-ch-btn live">Ch 26</a><a href="Genesis_27.html" class="qnav-ch-btn live">Ch 27</a><a href="Genesis_28.html" class="qnav-ch-btn live">Ch 28</a><a href="Genesis_29.html" class="qnav-ch-btn live">Ch 29</a><a href="Genesis_30.html" class="qnav-ch-btn live">Ch 30</a><a href="Genesis_31.html" class="qnav-ch-btn live current">Ch 31</a><a href="Genesis_32.html" class="qnav-ch-btn live">Ch 32</a><a href="Genesis_33.html" class="qnav-ch-btn live">Ch 33</a><a href="Genesis_34.html" class="qnav-ch-btn live">Ch 34</a><a href="Genesis_35.html" class="qnav-ch-btn live">Ch 35</a><a href="Genesis_36.html" class="qnav-ch-btn live">Ch 36</a><a href="Genesis_37.html" class="qnav-ch-btn live">Ch 37</a><a href="Genesis_38.html" class="qnav-ch-btn live">Ch 38</a><a href="Genesis_39.html" class="qnav-ch-btn live">Ch 39</a><a href="Genesis_40.html" class="qnav-ch-btn live">Ch 40</a><a href="Genesis_41.html" class="qnav-ch-btn live">Ch 41</a><a href="Genesis_42.html" class="qnav-ch-btn live">Ch 42</a><a href="Genesis_43.html" class="qnav-ch-btn live">Ch 43</a><a href="Genesis_44.html" class="qnav-ch-btn live">Ch 44</a><a href="Genesis_45.html" class="qnav-ch-btn live">Ch 45</a><a href="Genesis_46.html" class="qnav-ch-btn live">Ch 46</a><a href="Genesis_47.html" class="qnav-ch-btn live">Ch 47</a><a href="Genesis_48.html" class="qnav-ch-btn live">Ch 48</a><a href="Genesis_49.html" class="qnav-ch-btn live">Ch 49</a><a href="Genesis_50.html" class="qnav-ch-btn live">Ch 50</a></div> |
There was a problem hiding this comment.
Sync quick-nav live count with newly enabled chapters
This change turns chapters 32–50 into live links in the quick-nav grid, but the quick-nav metadata on these late-Genesis pages still reports only the chapter number as live (e.g., 31 live on Genesis 31), which now contradicts the navigation state and the index-level 50 live rollout. Users opening Genesis 31–49 will see conflicting availability information, so the live-count badge should be updated alongside the link activation.
Useful? React with 👍 / 👎.
Merge pull request #1 from CraigBuckmaster/codex/review-recent-master…
…reenHeader component + 8 screen migrations P1 fixes from UI_UX_AUDIT.md: 1. ErrorBoundary (#2): wraps RootNavigator in App.tsx. Prod crashes now show a styled recovery screen with Retry button instead of white screen. 2. NotesOverlay (#1): rendered in ChapterScreen with notesOverlayOpen state from readerStore. Notes toggle actually opens the overlay now. Added bookName prop for proper display name (was showing raw bookId). 3. Back navigation (#3): new ScreenHeader component replaces 8 separate header implementations. ArrowLeft back button, title, optional subtitle, optional titleColor override, accessibility role/label built in. Screens gaining back buttons: BookmarkListScreen, ReadingHistoryScreen, PlanListScreen, PlanDetailScreen, ScholarBioScreen, WordStudyDetailScreen. Screens migrated to shared component: SettingsScreen, ChapterListScreen. Removed ~50 lines of duplicated header styles. Files: 12 changed, +145/-93
…-push-for-genesis-chapters Finish Genesis rollout: enable chapters 31–50, update navigation and service worker cache
Merge pull request #1 from CraigBuckmaster/codex/review-recent-master…
…reenHeader component + 8 screen migrations P1 fixes from UI_UX_AUDIT.md: 1. ErrorBoundary (#2): wraps RootNavigator in App.tsx. Prod crashes now show a styled recovery screen with Retry button instead of white screen. 2. NotesOverlay (#1): rendered in ChapterScreen with notesOverlayOpen state from readerStore. Notes toggle actually opens the overlay now. Added bookName prop for proper display name (was showing raw bookId). 3. Back navigation (#3): new ScreenHeader component replaces 8 separate header implementations. ArrowLeft back button, title, optional subtitle, optional titleColor override, accessibility role/label built in. Screens gaining back buttons: BookmarkListScreen, ReadingHistoryScreen, PlanListScreen, PlanDetailScreen, ScholarBioScreen, WordStudyDetailScreen. Screens migrated to shared component: SettingsScreen, ChapterListScreen. Removed ~50 lines of duplicated header styles. Files: 12 changed, +145/-93
Add `permissions: contents: read` to follow least-privilege principle for GITHUB_TOKEN, as recommended by actions/missing-workflow-permissions. https://claude.ai/code/session_012iuiZXQvD4jD9oTbQoCZ6z
…ties - Bump vite from ^5.0.0 to ^5.4.19 (resolves 5.4.21) in web/moderation to fix dev server .map file path traversal (Dependabot alert) - Add npm override for @tootallnate/once >=3.0.1 in app to fix Incorrect Control Flow Scoping when AbortSignal is used (Dependabot alert #1, transitive via jest-expo) https://claude.ai/code/session_01TScusWmsWkJPo18VPRSbQi
Blockers: #1 userDatabase.ts v6 migration — add prominent SQL-quoting warning comment explaining why JSON.stringify + single-quoted SQL literal is safe, so future edits don't break it #2 review.ts / userMutations.ts — spaced repetition was pre-creating all 4 interval rows (1/3/7/30d) up front, causing users to see 3 copies of each prompt between day 7 and day 30. Now schedules ONE row at interval 1; completeGuidedReviewItem inserts the next-interval row in the same transaction via new nextIntervalAfter() helper #3 build_sqlite_loaders.py — proof_text_guards loader was silently falling back to guard's own book/chapter on missing suggested_chapter. Now raises ValueError with the offending guard ref. (Note: self-reference itself is valid — it's the UX for 'read in full chapter context' — so equal values are allowed, only missing/malformed values fail) #4 guidedStudy.test.ts — fixture used 'at_a_glance: [...] as any' which disabled TS checking. Replaced with correctly-typed ParsedBookIntro containing a full BookIntroAtAGlance object, so the bookIntro code path in buildConceptChips is now actually exercised #5 userDatabase.ts — new migration v20 adds partial unique index on guided_study_sessions(chapter_id) WHERE status='active' to prevent session leaks from crashes between insert and status flip. Migration dedupes any existing duplicates to the most recently updated row first Nits: #7 types/user.ts — export GUIDED_STUDY_STEPS const; derive GuidedStudyStep type from it; add GUIDED_STUDY_STEP_LABELS map in guidedStudy/types.ts; StudySessionStepper consumes both. Migration SQL CHECK gets a comment pointing at the const as single source of truth #8 plan.ts — CONCEPT_WORDS and genrePrompt refactored; concepts gets TODO(#1584); genrePrompt switched from label.includes(...) substring match to exact Record<label,prompt> lookup (with fallback for unknown genres). Filed #1584 to migrate concepts to content/meta/concepts.json #9 ChapterScreen.tsx + navigation/types.ts — added TODO(#1585) comments around the nav escape hatch. Filed #1585 to track typed CrossTabNavProp #10 StudySessionScreen.tsx — Amicus seed query fields now truncated to 200 chars with ellipsis sentinel so long syntheses don't blow past the peek sheet or Amicus's seed-query limit #12 .gitattributes — added '* text=auto eol=lf' + binary asset list. Normalized CRLF → LF on translations.json and db-manifest.json Deferred (filed/noted separately): #6 EraTimeline RAF cleanup — legit scope creep, but splitting now is more ceremony than benefit for a solo-dev PR. Kept bundled #11 GoldStripeListItem primitive — real refactor opportunity touching 5 components; out of scope for a review-response commit Tracking issues: #1584 (concepts from meta), #1585 (typed CrossTabNavProp)
Motivation
Description
index.htmlto mark all Genesis chapters (1–50) as live and changed the Genesis live badge from25 liveto50 live.genesis/Genesis_31.htmlthroughgenesis/Genesis_49.html) and ensuredGenesis_50.htmlis present in the nav grids./genesis/Genesis_1.html–/genesis/Genesis_50.htmlto theCOREarray inservice-worker.jsto force clients to refresh and precache all chapters.Testing
50live Genesis links inindex.htmland confirmed no remainingchapter-link comingtokens in the index, which succeeded.qnav-ch-btn comingand sampledGenesis_31,Genesis_40, andGenesis_49to confirm those quick-nav menus no longer includecoming, which succeeded.rgchecks for the updated live badge and chapter links and validated the service-workerCORElist now contains entries forGenesis_1–50, which succeeded.ERR_EMPTY_RESPONSE/ERR_FILE_NOT_FOUND), so no visual artifact was produced; all other automated checks passed.Codex Task