v4.4.0 — book-genre visual baselines + exercises auto-collection + /exercises route
[4.4.0] — 2026-05-25
Minor release. Polish closure of v4.3.0 deferred items. No new consumer issues since v4.3.0 ship — this release closes internal backlog before the next consumer-feedback cycle begins. All additive; consumers upgrade by bumping version with zero config changes.
Added
fixture-book-genrevisual regression fixture — 5 routes × 4 viewport widths = 20 new baseline PNGs at AE=0. Exercises all 6 v4.3.0 book-genre components (<Tip>,<TipsCard>,<Exercise>,<Practice>,<Solution>,<ExerciseSolutions>) plus both/tipsand/exercisesauto-routes. Closes the visual-coverage gap deferred from v4.3.0 to keep velocity.<ExerciseSolutions auto />mode — new optional boolean prop on the v4.3.0 component. Whenautois true, the component readssrc/data/exercises.json(emitted bybook-scaffold build-exercises), scopes by the current chapter viaAstro.url.pathname(matching the/chapters/<slug>/route pattern auto-injected since v4.3.0 #69), and auto-renders a list of exercise problem statements with placeholder solution lines (_Add your solution here._). Defaultauto: falsepreserves v4.3.0 manual-<Solution>behavior — no regression for existing consumers. Graceful skip + clear hint message when exercises.json is missing or the chapter URL pattern doesn't match.book-scaffold build-exercisesscript — sister to v4.3.0'sbuild-tips. Scans chapter MDX (honoringloader.baseoverrides viareadChaptersBasefrom v4.1.2) for<Exercise id="X">body</Exercise>instances via 2-branch regex (single + double quote portability, no backreference — same v4.1.2 cross-runtime lesson). Emitssrc/data/exercises.jsonkeyed by chapter slug. Run onprebuild. Wired into thebin/book-scaffolddispatcher./exercisesauto-route — opt-in viaroutes.exercises: trueindefineBookConfig(defaultfalseper profile, mirroringroutes.tips). Newpages/exercises.astroreadssrc/data/exercises.jsonand renders an index grouped by chapter with/chapters/<slug>/#exercise-<id>deep links + per-exercise problem-text previews (first 120 chars). Auto-injected viabookScaffoldIntegration(ROUTE_REGISTRY.exercisesentry).RouteToggles.exercises: booleanadded toprofile-kit.ts(defaultfalsefor all 5 built-in profiles — academic / tools / minimal / course-notes / research-portfolio).- 9 new build-exercises extractor tests (
tests/build-exercises.test.mjs) — mirror the v4.3.0 build-tips test suite: double-quoted / single-quoted / multiple / whitespace normalization / full body preserved / no-id skip / empty-id skip / empty source / no-Exercise source.
Changed
ExerciseSolutions.astronow branches onautoprop. Manual mode (no prop) renders the slot content exactly as v4.3.0 (regression-safe). Auto mode renders the auto-generated section.bin/book-scaffold.mjsregisters the newbuild-exercisessub-command + updates help text.
Migration
None. Pure additive minor release.
Out of scope / next sessions
- MDX AST-based solution-slot extraction (
<Fragment slot="solution">...</Fragment>inside<Exercise>) — v4.4.0 auto-collection captures problem text only, not solutions. Full solution-slot extraction would require MDX AST traversal at build time. Defer until a consumer asks; file a request if you'd like it in v4.5.0. - #15 Multibook routing, #16 AnkiCard + extract-cards CLI — still no consumer signal; deferred.
Release policy
- D12 lock-step preserved:
@brandon_m_behring/create-book@4.4.0ships alongside. - Pre-publish smoke gate (v3.6.5) ran end-to-end against academic before publish.
- 215 unit tests pass (206 existing + 9 new build-exercises).
- 96 visual baselines at AE=0 (76 existing + 20 new fixture-book-genre).
- Feedback loop: file friction at https://github.com/brandon-behring/book-scaffold-astro/issues with the
consumer:<workspace>label. If you'd like<Fragment slot="solution">extraction for auto-rendered actual solutions, file a v4.5.0 request.