Course landing: critique fixes - end-cap, brand type, canon, decision diet, link rows - #416
Conversation
Promise line (free, no sign-up) + Start Lesson 1.1 CTA (hero component) + copy-share-link button reusing the module-end pattern from course-prev-next.html, wired to the same GA4 data-course-event hooks. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
… H2s Font loaded via Google Fonts link in the course list template only (precedent: conditional Caveat load in baseof.html). Space Grotesk tops out at weight 700, so 700 stands in for the requested 800. Tight letter-spacing: -0.03em H1, -0.02em H2. Body text untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
Line 50 drops the rescue-project anchor (off-ICP for course surfaces) and line 216 fixes the dev-shop founding year. Canon: JetThoughts founded 2011; tenure is always 'since 2011'. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
… one secondary line Pre-Module-1 choices reduced to the hero's 2 CTAs + 'See the full syllabus' anchor. How This Course Works + FAQ fold into one secondary line (both still linked - no pathway removed); duplicate Lesson 1.1 and Quickstart intro links dropped (both live in the hero CTAs). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
Pattern chosen: labeled rows (Templates / Optional reference / See it in action, comma-separated links) over a <details> disclosure - keeps templates visible for returning readers, zero interaction cost. Applied identically to all five module cards; line-height 1.9 for mobile tap spacing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
Founder OS paragraph now leads with the decision-log value; the raise mention survives once as a trailing aside without the 'evidence pack investors fund' framing. Module 1 summary drops the 300-stranger threshold - the number lives in the lessons where the reader acts on it (og_description keeps its copy: social metadata, not a module summary). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
…ts in code flex-basis 50% on the first two chips at <=480px turns the lopsided 3+1 wrap into a 2+2 grid, all chips single-line at 390px. The 'Free - 2026' year badge lives only inside the cover.png artwork (binary), not in the template or markdown - nothing to derive or drop in code. Updates the macOS mobile course/landing baseline - intentional visual change covering this branch's end-cap, Space Grotesk, resource rows, and chip-wrap work (Linux baseline refresh happens at PR-prep bin/dtest). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
…n fix cannot regress Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
|
Warning Review limit reached
Next review available in: 19 seconds Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Screenshot diffs detected
|
…ck to 377 The Space Grotesk block re-declared the selector instead of extending the existing one, pushing the lint ratchet to 378 and failing Unit Tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
Synthesis of the 40.xx research corpus into 5 sequenced waves (W1 landing L2->L3 before Aug 14 — UNBLOCKED, L1 merged as #416; W2 format fix per 40.22; W3 V3-A style call; W4 post-Aug-14 V3-B + media P1; W5 completion mechanics). No new ideation — corpus already triangulated; L2 is the one fresh critic pass. TASK-TRACKER items 10-13 reference the plan for cold-session pickup. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ier (#425) * feat(devx): smoke test tier (~50s) + drop orphan bin/smoke Profiling (TESTOPTS=--verbose) found one test is 44% of the suite: test_codeblock_language_styles = 98.8s+97.2s ≈ 196s, looping 8 code-fence sections through multi-capture stable screenshots (and it trips a snap_diff Default-reporter bug on any diff). New smoke tier - the leanest gate that still catches a broken build: - Rakefile: SMOKE_TESTS + test:smoke (17 curated basics+bummers; excludes the _sections sweeps and the codeblock elephant) - bin/test: --smoke flag, reusing the build + restore-on-green wrapper; bin/dtest --smoke passes through to the container - Measured: host 50.5s green (17/17), Docker 41.6s (~18% faster) with 1 known-stale linux mermaid baseline. vs test:critical ~300s -> ~6x faster. Removed bin/smoke: zero callers repo-wide, and its name now collided with the smoke tier while it actually ran the FULL dtest (build+lint+dtest). Anyone who wants it back: `bun run test:build && bun run lint && bin/dtest`. Deferred as a written spike (docs/workflows/test-speed-research-todo.md): kill the codeblock elephant, process-sharding, Docker-vs-host, direct-visit. Thread parallelism is out (Capybara.threadsafe=false + shared driver global). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * install rulfo * perf(devx): 3.7x faster visual suites - skip_area selector waits were the real elephant Instrumented probe findings (attempt-level timing inside StableScreenshoter): the stable loop exits in 2 attempts x 0.6s; the missing ~10s per screenshot was skip_area CSS resolution - the gem runs `all(selector, visible: true)` per selector and Capybara waits default_max_wait_time (5s) for every selector with zero visible matches. `%w[picture img]` on the image-less codeblock fixture = 10.05s per screenshot x 13 screenshots = the 196s "elephant" (44% of the suite). Direct measurement: all('picture') 5.01s, all('img') 5.03s, wait:0 0.00s; same screenshot with mask 11.33s, without 1.30s. Fix at the single choke point (assert_screenshot): - pin final_options[:wait] ||= Capybara.default_max_wait_time (stability loop needs a real deadline; the gem rejects stability_time_limit > wait), then wrap assert_matches_screenshot in Capybara.using_wait_time(0). Matching selectors still resolve instantly; missing ones stop burning 5s each. - document.fonts.ready wait before capture - kills the font-swap race the suite otherwise masks with skip_areas / 0.03 tolerances / stability retries. - drop the 8 stability_time_limit: 1 overrides in blog_special (measured no-ops after the fix). Measured, all green with ZERO baseline drift (restore-on-green clean x2): - blog_special file: 247s -> 34.9s (7x) - bin/test critical: 301s -> 81s (3.7x), reproducible across 2 runs - bin/dtest critical: ~6-7min -> 46s; still red ONLY on the 9 known emulation-drift linux baselines (identical diff levels 6.93/12.3/..., green on CI-native amd64 - do not re-record locally) Research doc updated: O1 done (real root cause), O2 sharding deferred (81s serial makes it not worth the coordination), O3 confirmed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * perf(site): self-host Caveat + Space Grotesk + mermaid.js - no third-party requests Mermaid pages fetched Caveat from Google Fonts (css2, display=swap) and mermaid.min.js from cdn.jsdelivr.net; vibe-code-rescue fetched Space Grotesk. Every prod visit paid 2 preconnects + css fetch + font fetch + CDN js fetch; every TEST run paid the same third-party round trips (non-hermetic visuals, network variance = flake, amplified under Docker emulation). Now served same-origin: - themes/beaver/static/fonts/: the exact Google woff2 binaries (Caveat v23 4 subsets covering wght 400-700 variable; Space Grotesk v22 3 subsets) - static/css/fonts-{caveat,space-grotesk}.css: Google's css2 output verbatim with local URLs - identical unicode-range behavior - static/js/vendor/mermaid-11.15.0.min.js: sha384 verified IDENTICAL to the SRI pin the CDN tag carried - baseof.html / vibe-code-rescue.html: preload latin woff2 + local refs; preconnects deleted Visual gate: 2 macOS mermaid baselines updated intentionally - with the font now deterministically ready at mermaid.run(), the SVG measures ~8% more compact (structure/legibility/colors unchanged; evaluated side by side). Linux mermaid baselines need a CI workflow_dispatch update-baselines run after merge (never re-record locally - Apple-Silicon emulation drift). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(devx): OKF + research log - skip_area root cause, self-hosted fonts, hugo metrics Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: update screenshot baselines [ci skip] * ci: run smoke tier on PRs to cut CI time (was test:critical) PR screenshot runs now execute test:smoke (17 basics+bummers, ~30s on CI) instead of test:critical (34). Combined with the skip_area fix in this branch (critical CI test exec 263s -> ~46s), PR CI test execution drops to ~30s; setup (setup-hugo ~83s) now dominates. Full suite stays on workflow_dispatch; local bin/qtest --changed + bin/test remain the developer's fuller gates. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs(claude): default to /ponytail:ponytail ultra + clarify test tiers Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ci: revert PR runs back to test:critical (per Paul) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(devx): paste-ready snap_diff upstream bug reports (reporter TypeError + skip_area wait) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(devx): drift-overview workflow for removing skip_area/tolerance masks Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(okf): test-gates caveats - skip_area zero-match wait + self-hosted fonts/mermaid Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(claude): onboard via /okf:okf, run /okf:okf maintain before every commit Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(devx): reject 'bin/test --smoke <file>' instead of silently ignoring --smoke CodeRabbit PR #425: --smoke + a file arg fell through to the file path and ran only that file, dropping the smoke tier. Guard fails fast (exit 2) before build. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(okf): maintain - dtest drift verified (7 deterministic codeblocks), log newest-first - test-gates: caveat that local dtest is red ONLY on 7 mobile-codeblock screenshots (deterministic amd64-emulation antialiasing, verified x3 byte-identical, green on CI); mermaid now green post self-hosting. - log.md: moved the 2026-08-01 entries to the top (newest-first per OKF §7), added this session's follow-ups (drift run, CI back to critical, --smoke guard, snap_diff upstream doc). - fixed a bundle-relative link that pointed outside .okf/. Bundle validates conformant (soft warnings only: house-style date suffixes). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(okf): adopt OKF v0.2 - provenance/trust/lifecycle fields - root index: okf_version 0.1 -> 0.2 + conventions note for generated/verified/ status/stale_after and the actor convention. - test-gates: migrated to v0.2 trust fields (status: stable; generated + verified by claude/fable-5 - caveats empirically verified this session). Dropped bare timestamp. - 34 other concepts stay v0.1-style (conformant under v0.2), migrate as touched - no back-stamped provenance. Bundle validates conformant. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(okf): v0.1->v0.2 field migration via validator --migrate 29 concepts: legacy timestamp -> generated { by: process:okf-migrate, at } (honest process actor, dates preserved); one # Citations folded into sources. No external URLs dropped. Remaining # Citations (12) migrate as touched. Bundle validates conformant against the v0.2 checker. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: move test-speed + snap-diff docs out of workflows into 20-29-testing-qa Johnny Decimal: both are visual/screenshot-suite docs, not cross-cutting pipelines. workflows/ was being used as a catch-all. - test-speed-research-todo.md -> 20-29-testing-qa/screenshot-testing/20.10-visual-suite-speed-research-reference.md - snap-diff-upstream-issues.md -> .../20.11-snap-diff-upstream-issues-reference.md Updated the OKF references. CLAUDE.md new-doc-locations rule rewritten to route tech docs into the JD numbered areas and reserve docs/workflows/ for cross-cutting pipelines only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(2605): schedule course v2-format fix (item 10) + store 40.22 audit research Phase 1-2 mechanical audit found 11/25 lessons deviating from the v2 scaffold + 2 length flags. Full findings in 40.22; TASK-TRACKER item 10 schedules the option-C fix (format + deep canon/voice/ICP audit) for its own session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(claude): fix two stale Critical-Files/reference pointers - enhanced-meta-tags.html is a root-level override (layouts/), not the theme copy - visual-regression reference -> 20-29-testing-qa/screenshot-testing tutorial (docs/visual_testing_delegation_workflows.md no longer exists) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(claude): dedup the Blog Pipeline bloat (-1371 words) — pointers over duplication The Blog Post Pipeline section duplicated the voice guide (banned patterns), blog-pipeline.md (slop/cross-post/dev.to/erb), the 10.05 research doc (cognitive-load), and visual-scroll-gate.md. Collapsed the duplicated detail to named+pointered BLOCKING gates; kept the unique+critical bits inline (the 4-criteria new-media gate, the banned-pattern regression-sweep grep). All 12 gates still enforced. CLAUDE.md 4715->3344 words; Behavioral Constraints -40%. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: declutter docs/ root per Johnny Decimal - 38 files moved, refs updated - 60.NN -> 60-69-project-management/ (60.01 dedup: newer 573-line root version replaces the stale 175-line area copy), 25.NN -> 20-29-testing-qa/, 90/92.NN -> 90-99-content-strategy/ - 2025 CSS-consolidation campaign set (CSS_*, bem, legacy-cleanup, prototype-*) -> projects/2509-css-migration/70-79-archives/2025-css-consolidation/ - every repo-wide reference rewritten to the new paths (zero dangling) - docs/README.md: JD structure map added, consistent with CLAUDE.md routing - root: 66 -> 28 loose files; bin/hugo-build green Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(2605): course improvement wave plan 20.15 + board items 11-13 Synthesis of the 40.xx research corpus into 5 sequenced waves (W1 landing L2->L3 before Aug 14 — UNBLOCKED, L1 merged as #416; W2 format fix per 40.22; W3 V3-A style call; W4 post-Aug-14 V3-B + media P1; W5 completion mechanics). No new ideation — corpus already triangulated; L2 is the one fresh critic pass. TASK-TRACKER items 10-13 reference the plan for cold-session pickup. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(claude): qmd is the md-search tool (collection jt-site) - claude-context stays for code Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(2605): 40.23 four-persona review synthesis + wave-plan deltas on the board 4 independent personas (pedagogy / Sam-ICP / UX / content), findings tagged NEW vs KNOWN vs the prior corpus. 6 convergent findings (>=2 lenses) mapped to waves; divergent list carries Paul's 3 open decisions (long-wait bridges, kit-inside-L3 resequencing, investor-framing). Binding no-touch list added to W2. Nothing edited in course content - review only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(2605): Paul's 3 decisions recorded - bridges approved, kit-in-L3 approved, pack framing kept Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary
All 8 findings from the 2026-07-31 dual-agent design critique (baseline 25/36), one branch.
rgb(204,52,45)on white, measured 5.12:1 (AA pass). See the finding-correction note below.h1.course-title+ section H2s, loaded only on this template (Caveat precedent). Weight 700, not 800 - 700 is the family's heaviest cut.<details>, which would hide templates from returning readers), applied identically to all 5 module cards, line-height 1.9 for mobile taps.Finding correction (worth reading)
The critique attributed the detector's 3.4:1 white-on-#1a8cff failure to the course CTAs. It is not them. Verified in-browser: the failing element is the global footer's "we're hiring" badge (
b.special, 13.33px bold white on #1a8cff) - a real sitewide WCAG AA failure, since bold text only qualifies for the relaxed 3:1 threshold at 18.66px+. Deliberately NOT fixed here: it is sitewide chrome, churns ~50 baselines on both platforms, and would collide with the in-flight visual-CI work (#412/#413/#414). Scheduled separately with the measurement.Also spun out: the "Free · 2026" chip is baked into
cover.pngartwork, not markup - dating it out needs a cover-pipeline pass.Gates
bin/hugo-build+bin/qtest --changedgreen per commit; 8 course validators pass.bin/test34/34 andbin/dtest34/34, zero failures. The dtest run rewrote 22 unrelatedlinux/baselines (blog index, codeblocks - pages this branch never touches); that is pinned-stack render drift from chore(devx): R2 Phase A - Linux script portability, qtest repairs, doc truth pass #412/ci(visual): R2 Phase B - screenshot tests on the pinned rendering stack + report-only PR gate #413, so those were restored rather than committed here. The one intentional baseline (macOS mobile course landing) is committed.🤖 Generated with Claude Code
https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX