Skip to content

Course landing: critique fixes - end-cap, brand type, canon, decision diet, link rows - #416

Merged
pftg merged 9 commits into
masterfrom
course-landing-critique-fixes
Jul 31, 2026
Merged

Course landing: critique fixes - end-cap, brand type, canon, decision diet, link rows#416
pftg merged 9 commits into
masterfrom
course-landing-critique-fixes

Conversation

@pftg

@pftg pftg commented Jul 31, 2026

Copy link
Copy Markdown
Member

Summary

All 8 findings from the 2026-07-31 dual-agent design critique (baseline 25/36), one branch.

# Finding Fix
P1 Peak-end sales footer contradicts "free / no sign-up / no sales" Course-owned end-cap above the global footer: promise line + Start Lesson 1.1 + copy-share-link (reuses the existing module-end button pattern, GA4-instrumented). Global footer untouched.
P1 CTA contrast + off-brand color No code change needed - CTAs already compute ruby rgb(204,52,45) on white, measured 5.12:1 (AA pass). See the finding-correction note below.
P1 No brand display type (100% Roboto) Space Grotesk on h1.course-title + section H2s, loaded only on this template (Caveat precedent). Weight 700, not 800 - 700 is the family's heaviest cut.
P1 Wrong tenure claim Both "since 2005" instances -> "since 2011" (canon); the rescue-ICP anchor dropped from the mistakes line. Ratcheted so it cannot regress.
P2 ~7 competing next-actions before Module 1 Hero's 2 CTAs + one tertiary syllabus anchor + one secondary line folding How-it-works/FAQ. No reader pathway removed.
P2 ~10 undifferentiated links per module footer Labeled stacked rows (chosen over <details>, which would hide templates from returning readers), applied identically to all 5 module cards, line-height 1.9 for mobile taps.
P3 Pre-commit anxiety spikes Founder OS paragraph leads with decision-log value; "investors fund" removed, raise survives once as a trailing aside. "300 cold strangers" out of the Module 1 summary.
minor Chips wrap 3+1 on mobile 2+2 at 390px.

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.png artwork, not markup - dating it out needs a cover-pipeline pass.

Gates

🤖 Generated with Claude Code

https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX

pftg and others added 8 commits July 31, 2026 14:00
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
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@pftg, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 19 seconds

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 48f0dd0c-7677-469e-b1bd-c900dca1f9e9

📥 Commits

Reviewing files that changed from the base of the PR and between 7952a13 and 2e2af79.

⛔ Files ignored due to path filters (1)
  • test/fixtures/screenshots/macos/mobile/course/landing.png is excluded by !**/*.png
📒 Files selected for processing (4)
  • content/course/tech-for-non-technical-founders-2026/_index.md
  • data/course_banned_strings.yaml
  • layouts/course/list.html
  • themes/beaver/assets/css/pages/course-list.css

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

…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
@pftg
pftg merged commit fa055c7 into master Jul 31, 2026
4 of 5 checks passed
@pftg
pftg deleted the course-landing-critique-fixes branch July 31, 2026 13:10
pftg added a commit that referenced this pull request Aug 1, 2026
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>
pftg added a commit that referenced this pull request Aug 1, 2026
…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>
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