chore(css): orphan source removal + PurgeCSS safelist audit - #333
Conversation
Audit of all 148 CSS source files in themes/beaver/assets/css/. Used three-pass verification: direct resources.Get reference scan, @import transitive dependency trace, and full-repo basename grep. 67 files confirmed as orphans (no reference in layouts, no live CSS parent chain): 20 top-level fl-*/bem-*/consolidated files, 22 files in components/, 24 files in utilities/, and 1 in variables/. Protected dirs (critical/, mixins/) untouched per sprint constraints. Build: 1012 pages, identical to baseline. Source size: 4.8M -> 3.1M (1.7MB reduction, 35% smaller). Visual regression: 84 screenshots, 0 failures (bin/dtest). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
📝 WalkthroughWalkthroughThis PR removes approximately 70+ CSS stylesheets from the Beaver theme, narrows PurgeCSS safelist patterns, and deletes master consolidation import files. Changes include elimination of component styles, utilities, accessibility features, and theme-specific CSS without providing replacements. ChangesCSS Stylesheet Consolidation & Cleanup
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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 |
All 399 fl-node-* classes used in site HTML are captured in hugo_stats.json by Hugo's writeStats. The greedy regex was blanket-preserving all fl-node-* rules including unused WordPress node IDs never emitted in Hugo output. homepage: 225KB -> 158KB (-67KB) about-us: 142KB -> 103KB (-39KB) services: 175KB -> 132KB (-43KB) bin/dtest: 84 screenshots, 0 failures Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
All 17 fl-builder-content-* classes captured in hugo_stats.json. Redundant greedy pattern was preserving unused WordPress content builder class variations. homepage: 158KB -> 145KB (-13KB) about-us: 103KB -> 95KB (-8KB) services: 132KB -> 121KB (-11KB) bin/dtest: 84 screenshots, 0 failures Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…elist Only 1 class (technologies-component) uses this prefix, captured in hugo_stats.json. No bundle size change — single class, fully covered by the extractor. bin/dtest: 84 screenshots, 0 failures Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Single class (footer-component) captured by hugo_stats.json extractor. Greedy pattern was redundant. bin/dtest: 84 screenshots, 0 failures Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
postcss.config.js (1)
36-38: ⚡ Quick winExcellent safelist reduction with thorough validation.
The removal of
/^fl-builder-content/,/^fl-node/,/^technologies-component/, and/^footer-component/is well-validated by the three-pass verification and visual regression testing (0 failures across 84 screenshots). The retention of/^fl-col/and/^use-cases/due to JS-driven runtime class usage is the correct decision.Consider documenting the retention rationale.
To improve future maintainability, consider adding an inline comment explaining why
/^fl-col/and/^use-cases/are retained in the greedy safelist.📝 Suggested documentation improvement
greedy: [ + // Retained: JS-driven runtime classes not captured by hugo_stats.json /^swiper-/, /^is-/, /^has-/, /^js-/, /^fl-col/, /^use-cases/ ]🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@postcss.config.js` around lines 36 - 38, Add an inline comment in postcss.config.js next to the greedy safelist entry explaining why the /^fl-col/ and /^use-cases/ patterns are retained (e.g., "retained because these classes are added at runtime via JS and required for layout/interactive features"), so future maintainers understand the rationale; update the array line containing greedy: [ /^swiper-/, /^is-/, /^has-/, /^js-/, /^fl-col/, /^use-cases/ ] to include that brief explanatory comment.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@postcss.config.js`:
- Around line 36-38: Add an inline comment in postcss.config.js next to the
greedy safelist entry explaining why the /^fl-col/ and /^use-cases/ patterns are
retained (e.g., "retained because these classes are added at runtime via JS and
required for layout/interactive features"), so future maintainers understand the
rationale; update the array line containing greedy: [ /^swiper-/, /^is-/,
/^has-/, /^js-/, /^fl-col/, /^use-cases/ ] to include that brief explanatory
comment.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 2ae5f8b7-2765-4044-89ef-1fa6e5cbb69b
📒 Files selected for processing (68)
postcss.config.jsthemes/beaver/assets/css/_consolidated-layouts.cssthemes/beaver/assets/css/accessibility-focus.cssthemes/beaver/assets/css/beaver-grid-layout.cssthemes/beaver/assets/css/bem-404-conversion.cssthemes/beaver/assets/css/bem-home-page-minimal.cssthemes/beaver/assets/css/components/_consolidated-components.cssthemes/beaver/assets/css/components/blocks/c-card.cssthemes/beaver/assets/css/components/blocks/c-nav.cssthemes/beaver/assets/css/components/buttons-migration.cssthemes/beaver/assets/css/components/c-gravity-forms.cssthemes/beaver/assets/css/components/c-infobox.cssthemes/beaver/assets/css/components/c-modal.cssthemes/beaver/assets/css/components/c-navigation.cssthemes/beaver/assets/css/components/c-pagination.cssthemes/beaver/assets/css/components/c-spacer.cssthemes/beaver/assets/css/components/c-testimonial-section.cssthemes/beaver/assets/css/components/c-testimonial-slider.cssthemes/beaver/assets/css/components/cards-migration.cssthemes/beaver/assets/css/components/forms-migration.cssthemes/beaver/assets/css/components/layout-columns.cssthemes/beaver/assets/css/components/layout-foundation.cssthemes/beaver/assets/css/components/layout-rows.cssthemes/beaver/assets/css/components/navigation-migration.cssthemes/beaver/assets/css/components/pp-content-grid.cssthemes/beaver/assets/css/components/pp-list.cssthemes/beaver/assets/css/components/pp-tabs.cssthemes/beaver/assets/css/components/typography.cssthemes/beaver/assets/css/critical.cssthemes/beaver/assets/css/cta-backgrounds.cssthemes/beaver/assets/css/fl-about-layout.cssthemes/beaver/assets/css/fl-careers-layout.cssthemes/beaver/assets/css/fl-clients-alt-bundle.cssthemes/beaver/assets/css/fl-clients-bundle.cssthemes/beaver/assets/css/fl-clients-layout.cssthemes/beaver/assets/css/fl-component-layout.cssthemes/beaver/assets/css/fl-contact-layout.cssthemes/beaver/assets/css/fl-foundation.cssthemes/beaver/assets/css/fl-homepage-layout.cssthemes/beaver/assets/css/fl-services-layout.cssthemes/beaver/assets/css/fl-use-cases-layout.cssthemes/beaver/assets/css/mobile-fixes.cssthemes/beaver/assets/css/utilities.cssthemes/beaver/assets/css/utilities/_consolidated-utilities.cssthemes/beaver/assets/css/utilities/c-spacing.cssthemes/beaver/assets/css/utilities/clearfix.cssthemes/beaver/assets/css/utilities/color-accessibility.cssthemes/beaver/assets/css/utilities/colors.cssthemes/beaver/assets/css/utilities/colors/backgrounds.cssthemes/beaver/assets/css/utilities/components/powerpack/content-grid.cssthemes/beaver/assets/css/utilities/components/powerpack/infobox.cssthemes/beaver/assets/css/utilities/components/powerpack/pp-icon.cssthemes/beaver/assets/css/utilities/components/powerpack/pp-list.cssthemes/beaver/assets/css/utilities/display.cssthemes/beaver/assets/css/utilities/fl-builder-basic.cssthemes/beaver/assets/css/utilities/fl-builder-components.cssthemes/beaver/assets/css/utilities/fl-builder-visibility.cssthemes/beaver/assets/css/utilities/flexbox.cssthemes/beaver/assets/css/utilities/grid/fl-col.cssthemes/beaver/assets/css/utilities/margins.cssthemes/beaver/assets/css/utilities/opacity.cssthemes/beaver/assets/css/utilities/padding.cssthemes/beaver/assets/css/utilities/position.cssthemes/beaver/assets/css/utilities/positioning/center-absolute.cssthemes/beaver/assets/css/utilities/responsive/breakpoints.cssthemes/beaver/assets/css/utilities/responsive/visibility.cssthemes/beaver/assets/css/utilities/typography/text-utilities.cssthemes/beaver/assets/css/variables/colors.css
💤 Files with no reviewable changes (58)
- themes/beaver/assets/css/utilities/components/powerpack/content-grid.css
- themes/beaver/assets/css/components/c-testimonial-section.css
- themes/beaver/assets/css/utilities/positioning/center-absolute.css
- themes/beaver/assets/css/utilities/grid/fl-col.css
- themes/beaver/assets/css/components/typography.css
- themes/beaver/assets/css/cta-backgrounds.css
- themes/beaver/assets/css/utilities/clearfix.css
- themes/beaver/assets/css/utilities/colors/backgrounds.css
- themes/beaver/assets/css/utilities/padding.css
- themes/beaver/assets/css/mobile-fixes.css
- themes/beaver/assets/css/components/layout-rows.css
- themes/beaver/assets/css/components/c-modal.css
- themes/beaver/assets/css/utilities/fl-builder-visibility.css
- themes/beaver/assets/css/components/layout-columns.css
- themes/beaver/assets/css/utilities/components/powerpack/pp-icon.css
- themes/beaver/assets/css/components/navigation-migration.css
- themes/beaver/assets/css/components/c-testimonial-slider.css
- themes/beaver/assets/css/utilities/opacity.css
- themes/beaver/assets/css/utilities/typography/text-utilities.css
- themes/beaver/assets/css/_consolidated-layouts.css
- themes/beaver/assets/css/components/forms-migration.css
- themes/beaver/assets/css/fl-contact-layout.css
- themes/beaver/assets/css/utilities/_consolidated-utilities.css
- themes/beaver/assets/css/variables/colors.css
- themes/beaver/assets/css/components/_consolidated-components.css
- themes/beaver/assets/css/utilities/components/powerpack/pp-list.css
- themes/beaver/assets/css/utilities/responsive/visibility.css
- themes/beaver/assets/css/accessibility-focus.css
- themes/beaver/assets/css/utilities/components/powerpack/infobox.css
- themes/beaver/assets/css/utilities/responsive/breakpoints.css
- themes/beaver/assets/css/components/c-infobox.css
- themes/beaver/assets/css/utilities.css
- themes/beaver/assets/css/utilities/display.css
- themes/beaver/assets/css/fl-foundation.css
- themes/beaver/assets/css/components/c-gravity-forms.css
- themes/beaver/assets/css/utilities/position.css
- themes/beaver/assets/css/utilities/margins.css
- themes/beaver/assets/css/components/c-navigation.css
- themes/beaver/assets/css/fl-clients-bundle.css
- themes/beaver/assets/css/utilities/fl-builder-basic.css
- themes/beaver/assets/css/utilities/colors.css
- themes/beaver/assets/css/components/pp-list.css
- themes/beaver/assets/css/components/pp-tabs.css
- themes/beaver/assets/css/utilities/flexbox.css
- themes/beaver/assets/css/bem-home-page-minimal.css
- themes/beaver/assets/css/components/pp-content-grid.css
- themes/beaver/assets/css/components/c-spacer.css
- themes/beaver/assets/css/components/blocks/c-card.css
- themes/beaver/assets/css/components/cards-migration.css
- themes/beaver/assets/css/components/buttons-migration.css
- themes/beaver/assets/css/bem-404-conversion.css
- themes/beaver/assets/css/components/layout-foundation.css
- themes/beaver/assets/css/utilities/c-spacing.css
- themes/beaver/assets/css/critical.css
- themes/beaver/assets/css/utilities/color-accessibility.css
- themes/beaver/assets/css/utilities/fl-builder-components.css
- themes/beaver/assets/css/components/blocks/c-nav.css
- themes/beaver/assets/css/components/c-pagination.css
… diagrams - lineColor default #453f3f -> #333 (CodeRabbit: diverged from the prompt guidance and every per-diagram init) - validation-tools 'Why use validation tools' tree: merged the Catches capsules into the tool cards (they duplicated the table right below), dropped the volatile '$9 Starter' price hardcoded inside the diagram (de-hardcoding policy) - tree is now 3 rows instead of 5 - 2.3 'full journey': lone-column TD straggle (~1,500px of sparse stacked Step boxes) -> compact 6-node LR anchor strip above the numbered list that carries the detail Gates: build green, test:critical 46/46; visual suites ran green after the lineColor change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
… 18 reference deep-dives, reuse/voice/render audits (#361) * feat(course): in-post visual refresh - mermaid house theme + 4 worst-SVG redesigns Two design critics scored all ~70 in-post visuals (44 SVGs, 22 mermaids). Findings and fixes: Mermaid (systemic - one site-level fix lifts all 22): the bare mermaid.initialize() shipped default hairline edges, floating edge labels, and a cursive-font-to-node-size mismatch. baseof.html now sets the house theme as the global default (Caveat 20px, paper fills, ruby borders, 2.25px edges, chip-backed edge labels, nodeSpacing/rankSpacing /padding) - per-diagram %%init%% directives still win where present. SVGs (the 4 that scored 'genuinely ugly', each rebuilt to the informational-sketch family with lesson-verified facts): - sean-ellis-gauge: was two flat rectangles + stray arrow claiming to be a gauge -> real semicircular meter, amber below / green above the bold 40% line, verdict cards each side - segment-isolation: was a Venn of mutually-exclusive segments with muddy overlaps -> three cohort cards (blended 28% vs B2B 64% / solo 14% / agencies 0%), only the passing card green, 40%-line on each bar - ph-vs-ih: was one shared axis for two DIFFERENT metrics (misleading) -> two independent stat cards, spike vs sustained motifs, lesson takeaway bar - smoke-test-signal: was default-tool boxes with arbitrary colors -> banded 0-20%+ signal meter with the lesson's exact thresholds and the 6% go-line pointer All four alt texts rewritten to describe the new art; gauge footer reworded off the banned cost-anxiety phrasing. Master design prompt for future in-post visuals: .stitch/prompts/course-inpost-visual-prompt.md. Gates: validators 8/8, build, test:critical, bin/test AND bin/dtest green (0 diffs). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): PR #361 review round - lineColor align + 2 owner-flagged diagrams - lineColor default #453f3f -> #333 (CodeRabbit: diverged from the prompt guidance and every per-diagram init) - validation-tools 'Why use validation tools' tree: merged the Catches capsules into the tool cards (they duplicated the table right below), dropped the volatile '$9 Starter' price hardcoded inside the diagram (de-hardcoding policy) - tree is now 3 rows instead of 5 - 2.3 'full journey': lone-column TD straggle (~1,500px of sparse stacked Step boxes) -> compact 6-node LR anchor strip above the numbered list that carries the detail Gates: build green, test:critical 46/46; visual suites ran green after the lineColor change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(workflows): design-quality pass - why defect QA misses taste (2026-07-12 reflection) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): M4 re-review wave - cost canon, 4-week rule unification, cover chip fact Content fixes from the Module 4 re-review (two fixer waves, all verified by re-render): - 4.5 flowchart Bridge node: monthly cost corrected from the $8-15K scoping figure to the Fractional CTO retainer (~$1.6-2.6K / mo at 5 hrs / week). Signal 4's one-off $8-15K scoping cost stays in prose. - Ceiling-signal graduation rule unified to the 4.5 canon (two signals firing for 4+ weeks) across 4.3 rule 12, 4.2 build-phases (2 spots), and the stack walkthrough; walkthrough link repointed to 4.5. - vibe-coding-ceiling-signals: duplicate closing line removed; signals-scoreboard.svg deleted (table + prose carry the content). - hire-track: Basecamp customer count fixed, geography mermaid replaced with a decision table, 5-jobs list to table; cover chip "WHEN After 50 customers" (fabricated threshold - page teaches a signal-based trigger) regenerated to "WHEN Ceiling signals red". - ownership-checklist: 14-day domain-transfer buffer (ICANN 5-day window + registrar 60-day locks); opener reshaped. - sow-reading-guide: stale "Module 5B" reference fixed; opener reshaped. - where-to-hire: opener reshaped, rescue framing dropped. - walkthrough: Lovable paid-plan price replaced with pricing-page pointer. Gates: bin/hugo-build 8/8 validators, bin/rake test:critical 46 runs 0 failures. Bridge node + cover chip verified by own re-render. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): design sprint - worksheet cards, cover differentiation, compact diagrams, reading typography Executes the five approved design decisions plus two mid-sprint owner directives: 1. build-path-decision-worksheet: six monospace ASCII blocks replaced with styled .ws-card HTML worksheet cards (paper slabs, real checkboxes, dashed verdict strips; green = advance, purple = path assignment). Copy verbatim. Template PDFs regenerated. 2. should-you-hire (4.1): decision-matrix.svg removed - it duplicated the adjacent 4-path table ("html table is fine"). 3. Covers differentiated: 4.4 cover was byte-identical to 4.3 (wrong title baked in); rebuilt per design spec as "Build Phases" with a 4-phase motif and Weeks 4-12 / Phases 4 chips. Walkthrough cover rebuilt with per-tool "5 sessions" sub-labels and Pace / Sessions 20 chips. Alt texts updated to match. 4. Mermaid theme: clean-sans variant was shipped and REVERTED the same day - owner rejected it on sight ("typography is not handwritten"), and sans clipped labels worse than cursive. Handwritten family restored; kept the structural wins (Bridge node 5-line split, edge labels with nbsp slack, "Over" label reword, no metric themeCSS on .edgeLabel - it applies after mermaid measures). 5. hire-track: Week-1 onboarding wall-paragraph -> Day 0-28 table; "why these seven questions" bullets -> question-pair table. 6. ai-token-bill: oversized 9-node mermaid loop replaced with invoice-loop.svg - compact hand-drawn house-family card flow (~330px tall vs ~2400px, semantic green/amber, one glance = whole loop). Owner's four complaints (awkward, too big, colors, not handwritten) each addressed. 7. Course reading typography (course pages only, .section-course): body 22.4px/1.7 -> 20px/1.65, callouts 19px, tighter list rhythm. Lesson pages shorten ~14%, more content per screen, H3 landmarks regain contrast. Blog keeps its thoughtbot-anchored scale. Selectors mirror single-post.css specificity (0,3,2) - weaker course overrides silently lose. Gates: bin/hugo-build 8/8, test:critical + bin/test + bin/dtest all green (46 runs, 84 screenshots each). Corrupt blog/post.png baseline from a raced run was restored, not committed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): friday-demo escalation node referenced artifacts the page never names The "2 of 4 or fewer" node said "run the oversight audit: standup + report + spaceship" - three shorthands appearing nowhere on the page (module-internal jargon, cryptic to the course reader). Node now names the real escalation artifacts (Org Chart audit + red-flags checklist) and a sentence under the flowchart links both. Caught by the render sweep; re-rendered - node text sits inside the stadium border. Cursive re-verification of the sweep's other findings: must-have branch labels and outbound stage nodes render complete after the theme revert (the clips were sans-only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): compact-SVG sprint - three over-tall mermaid flowcharts replaced Rolls the invoice-loop treatment (compact hand-drawn house-family SVG) onto the three worst remaining flowcharts, per the deferred sprint: - friday-demo: 9-stadium ~2600px mermaid column -> friday-loop.svg (weekly card row with day chips, Wed-EOD replan side-note, dashed weekly loop, 4-Friday green/red fork; ~310px in-column). Page height drops ~1500px. - github-aws ownership checklist: deep TD audit tree -> ownership-audit-flow.svg (4 numbered check cards, shared amber fix lane aligned per check, recovery clock, cooperate? fork to audit-clean / retain-a-lawyer). No longer duplicates the 12-row table. - outbound: micro-text 6-node LR strip -> stage-cadence.svg (3x2 snake grid with numbered badges + cold/warm/conversion tint legend; labels legible at column width instead of ~10px). All mermaid facts preserved verbatim in artwork + alt text. Built by three parallel swarm designers against the house visual spec; every render re-verified by the coordinator (one wording truncation fixed: "that eve" -> "that evening"). Gates: bin/hugo-build 8/8, bin/rake test:critical 46 runs 0 failures. Content + SVG only - no template/CSS changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): M5 content-canon wave - sample-size math, fabricated tracker tool, merged duplicate anecdote Module 5 review (content critic), 11 adjudicated fixes: - 5.1: the two sample-size callouts contradicted each other (denominator flipped 6 -> 10 -> 6; calibration threshold >=20 vs >=10). Step-5 "Sample-size honesty" box is now the single numeric authority with under-10 bullets scoped to the 4-6 onramp users; top box keeps the reassurance and points forward. - Operating kit: component 6 claimed an "Airtable base from Chapter 5.7" - no lesson introduces Airtable; 5.5/5.7 teach a Google Sheet. Fixed in 5 markdown spots + the visible artwork text in kit-sample-row.svg (re-rendered, fits). - Churn-triage: the R. anecdote was told twice as two different founders with byte-identical numbers; merged into one story, unified 70% retention (was 70/71 drift), added the Mia-style composite disclosure line. - Glosses at first mention for Sam: ICP (5.3 core path), CAC/SMB/MRR (churn-triage). Mermaid "rescue chapters" node renamed (off-ICP framing). Banned slogany flip and "Picture the situation" opener rewritten; "12 interviews" -> canon 10; 5.6 duplicate closing sentence deduplicated. - Ratchet: 5 new signatures incl. path-scoped "Airtable" (legitimate elsewhere as the Concierge-MVP stack example). Verified by coordinator: greps + own re-render of kit-sample-row.svg. Gates: bin/hugo-build 8/8. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): M5 design wave - Caveat webfont root-cause fix, semantic recolors, diagram + template alignment Module 5 design review (scored critic pass), root-cause find first: - The house diagram font was NEVER LOADED: no webfont link, no @font-face, no font files. Every mermaid rendered the platform's generic cursive (Apple Chancery on macOS, varies per visitor) - an identity lottery - and measured label boxes with one font while rendering another, the root cause of the recurring last-character clipping. Fix in baseof.html: load Caveat (gated on features.mermaid), startOnLoad off, render via document.fonts.ready so measurement and render use the same metrics; fallback stack now includes Comic Sans MS to mirror the in-post SVGs. All 23 per-diagram inits aligned. Verified: 5.1 and churn-triage trees now render true Caveat with complete labels. - Bare diamonds -> labeled rects (house rule) in the 5.1 and churn-triage decision trees; both re-rendered, more compact. - Green-for-money recolors (green was never used for actual money): free-vs-paid-pilot paid side, ph-vs-ih winning channel, artifact-trail signed-pilot card (also de-saturated to paper tone), stage-cadence deposit/conversion stages + legend ("Money lands"). - 5.7 cold-email variants: 3 stacked same-form blockquotes -> fenced code blocks (copy-paste affordance, matches 5.6's DPA treatment). - Operating kit: DPA template now the same code-block treatment as 5.6 (content diffed byte-identical); kit mermaid root de-saturated to paper tones. - Artwork text sweep: em-dashes removed from sean-ellis-gauge (x2), segment-isolation, module-pipeline, report-comparison; "JT-rescue founders" rescue framing removed from free-vs-paid-pilot subtitle. Every fixer render re-verified by the coordinator. Kit cover chip-count observation ruled acceptable (motif samples 4 of 6, count stated explicitly three times). Gates: hugo-build 8/8; test:critical + bin/test + bin/dtest all green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): all-pages canon wave - cast/number contradictions, Sam glosses, SVG font-lottery fix Content-canon fixes across 20 pages from the three-critic swarm review (Going Further + M1/M2/reference + M3/chrome/supplementary): - Cast canon: reviewer is Marcos/Priya everywhere (Marcus retired); PR #847 = refund-branch story only; weekly-report/friday-demo admin-search and rate-limiting PRs renumbered (#843/#851) to stop cross-page collisions. - Number contradictions: Lasso research April->March 2025; agency-ai walkaway threshold (two->three failed questions, matching its own scoring rule); FAQ + 5.6 footer deposit no longer "year-one ACV prepaid" (canon: 10-30% credited); fabricated 51% offer-acceptance stat dropped; where-to-hire Tier-2 city lists aligned; M2 walkthrough reply rate 40%->30% (inside 2.4's own band); 2.6 interview length 40->30 min; $62K dollar-anchor collision split ($54K in friday-demo-template); ai-token Devon table ref direction; channel-guide "~10% of cost" overstatement. - Sam glosses at first mention: SOW, MSA, SLA, FTE, PLG, ARPU, MAU, RAG-status, 0day, net revenue retention. - Dead-end refs: validation-tools Step-1/Step-4 labels retargeted to the hypothesis-sprint reference; Module 3 Product Brief links now hit the brief page; template good/bad examples disclose the 1-2-4 section skip. - SVG font-lottery root-cause: 25 SVGs' cursive stacks lacked the 'Comic Sans MS' fallback the exemplars carry - SVG-as-img cannot load webfonts, so they fell to the platform generic cursive. Fallback added; money values recolored green (m1 "6 buyers", m2 "$70-120") per house rule. - Ratchet: 9 new banned strings; they immediately caught 3 extra instances the critics missed. - .okf/ knowledge bundle (OKF v0.1, validated; .gitignore negation added) + CLAUDE.md consumption note; render-verification concept records the _dest/public-dev vs stale public/ trap that produced false missing-asset findings this session. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots clean). Content+SVG only - no template/CSS changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): all-pages design wave - 5-critic review, handwritten conversions, structure upgrades Design fixes from the five-critic swarm review (M1, M2, M3+chrome, misc templates, Going Further), every fixer claim re-verified by own Chrome renders: - Handwritten identity: good-vs-bad-prd + vibe-prd-template-visual + hypothesis-mad-libs + channel-icp-matrix converted from Segoe sans to the Caveat stack (sizes re-tuned for Caveat metrics, no clipping). - Orphan rescue: channel-icp-matrix was embedded on NO page - moved into reference/smoke-test-channel-guide (a 9-min read that had zero diagrams) as its Channel-by-ICP hero. - New visuals: quickstart/minimal-path.svg (pure-text hero fixed), reference sprint-timeline.svg + price-test-flow.svg (pure-text ref heroes), three-questions/daily-weekly-cadence.svg (2.5 screens of unbroken prose broken). - Structure: where-to-hire got the 4-region comparison table its copy promised; sow-reading-guide's 8 clause stacks converted to the Clause-4 Bad/Good table pattern; interview-script got its one visual break; landing Going-further list converted to trigger tables. - Semantics: weekly-report Bad/Good examples now use the bq-bad/bq-good callout variants (they rendered identically red before); agency flowchart 3-4 conditional node green -> amber; salvage verdict labels colored KEEP green / FREEZE amber / REBUILD red; faq module-strip recolored to the per-module pipeline palette (viewBox extended to unclip the caption). - Cast sweep inside artwork the ratchet cannot see: PR #847 -> #843 in both weekly SVGs; Marcus -> Marcos in ownership pages + zones SVG ("Marcus Liu" lead persona and the outreach recipient are distinct characters, left as-is); m1 trail 6.5% aligned with the 1.4 meter's green Promising band. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Content+SVG only - no template/CSS changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): full-course taste re-review wave - premium-bar fixes across all 64 pages Five taste critics re-scored every course page against the new Stitch taste anchor (.stitch/course-taste-design.md - the course design language encoded as a DESIGN.md with explicit anti-pattern bans). All prior-wave fixes verified landed with zero regressions. This wave ships the residuals: - Handwritten identity completed: ownership-zones, airbnb-test, shed-house-skyscraper (the last three sans conceptual diagrams) converted to the Caveat stack; orphaned hallucinated-vs-real.svg wired into slopsquatting's "What slopsquatting is" section. - Wall-pattern regressions fixed: 2.2 rehearsal flow and 2.6 prototype build (tall single-column mermaids) replaced with compact horizontal strips; five-tech-words' bare-gray-diamond refactor flowchart replaced with a real-vs-fake two-lane strip; operating-kit's illegible 6-component tree rebuilt as a legible hub + 6 cards. - New decision-aid visuals for the weakest-scored pages: agency-ai gets the Q1-Q5 pass/fail scorecard it lacked (cloned from hiring-interview-script's model); channel-selection gets a channel-decision strip + its raw fill-in worksheet promoted to the cream ws-card family; validation-tools gets a 3-tools-in-sequence strip breaking its prose back half. - Semantics: churn tree's green navigation nodes -> neutral cream, edge labels trimmed to 2 words; vibe-coding's off-palette blue node -> violet; trail money-climax cards -> mint (m1 Price test, m2 Money answer; taste-e confirmed the red-metric family convention is correct); emoji tics swept (checkmark/cross replaced with Bad/Good conventions and the bq-good variant). - Structure: five-tech-words' 18-row acronym wall regrouped into 3 themed sub-tables; sow Bad/Good headers inked red/green; where-to-hire region facts deduped (stated once, in the table, annualized figures folded in). - Render-verified overflow fixes on fixer output the fixers missed: kit card titles wrapped, refactor webhook label shortened, tools strip card-1 margin, module-strip caption viewBox. - Canon: templated "In April 2025 a security researcher" question carried the wrong Lasso research date on 3 pages - fixed + ratcheted. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Content+SVG only - no template/CSS changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(okf): taste-pass pattern + anchor pointer in review-swarm concept Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): deferred-items + owner-feedback wave - prompt scaffolding, list conversions, body-brand strips Two work streams in one wave, all fixer output re-verified by own renders: OWNER FEEDBACK (docs/projects/2605.../FEEDBACK.md): - 1.2 now hands Sam the actual builder prompt: context-rich Mixo/Carrd template (hypothesis slots, competitor + verbatim-pain slots, page blocks, 3-second acceptance test) plus an optional Perplexity research prompt that harvests real forum wordings; Build-the-page paragraphs split into scannable steps. - Channel guide gains "Write the Ad With AI": one prompt building 2-3 primary-text variants, 2 headlines, an image concept, and a which-first note from the hypothesis + landing copy + customer pains; 1.4 gets the early reassurance line pointing to it. - Scannability sweep: every "**Why:**/**Fix:**" run-on course-wide is now a list; Channel/When-to-pick/Skip-when blocks are lists; bracket blanks ([customer], [problem]...) backticked in 11 files; checkmark/clipboard emoji tics removed (replaced with the Bad/Good + bq-good conventions). - Cover 404 on smoke-test-wire-tracking diagnosed: transient wsrv.nl cache - all image URLs serve 200 now, nothing to fix in the repo. DEFERRED TASTE ITEMS (all 16 handled): - Body-brand strips: stack-boundaries (4.3), build-phases + green-lights gate (4.4), walkthrough-milestones + ws-card pre-flight (walkthrough), hire-track-map (hire reference), find10-journey (replaces the scaled-down 5-node mermaid). - vibe-prd mono wall split into per-section cards with lead-ins; five-tech-words untouched-by-this-wave items were shipped earlier. - how-this-course-works modules color-coded; 1.4 meter/table redundancy trimmed; agency-uses-ai Q1-Q5 numbered; sprint-timeline rows now read 1-2-3/4-5-6; channel-icp cards neutral cream (names carry the color); stop-specifying's cramped node-graph -> priced-out comparison table; restated-title H1s removed from 12 template pages; engineering top callouts merged; pivot hub + paid-pilot sequence + find10 fonts legible; faq General card decollided from M4 red. - 5 template PDFs regenerated from the rebuilt pages. Coordinator render-verification caught and fixed: stack-boundaries "checkout" label crossing the Stripe card (-> "pay"), find10 entry card off-palette blue -> dashed cream + mid-phrase title splits, channel-icp footer banner graze. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Content+SVG+PDF only - no template/CSS changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): M2 Product-Talk enrichment + FEEDBACK items 2b/2c/3c/5a/6/7 Module 2 interview craft, sourced from Teresa Torres' Product Talk (customer-interviews + learning-to-interview-continuously): - 2.1 + interview script teach story excavation (the first answer is always thin; Where were you / What happened right before / What did you do next) and the embrace-silence tip, cited inline + Further reading on both. - 2.2 gains the mock-interviews-with-feedback justification for AI rehearsal; 2.4's outreach teaches Torres' three recruiting barriers with the one added say-how-the-time-is-spent sentence for the templates; 2.5's Further reading points at the interview snapshot as the deeper-practice scoring sheet. Owner FEEDBACK.md items: - 2b: 1.3's Output states the outcome (watch any visit's recording + read the three judging numbers), not the tool list. - 2c/3c: 1.3 and 1.4 are atomic now - the premature pixel paragraph left 1.3; 1.4's pixel step opens with the pixel-vs-GA4 distinction (reports to the ad platform vs reports to you). - 5a: 1.1's quote-finding Fix links the 1.2 Perplexity research prompt. - 6: 2.2 optional status completed - course_sequence gains the 5.1-style core-path branch on 2.1 (Core path -> 2.3, Optional rehearsal -> 2.2); landing card + page orientation already declared it. - 7: 2.3's "write three sentences" now derives explicitly from the 1.1 hypothesis - Customer/Solution rows start from the [customer] and [approach] blanks, Business named as the one genuinely new line. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Content+data only - no template/CSS changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): Lesson terminology canon + FEEDBACK 7a-7c refinements Terminology unification (owner decision, per 30.03 format spec: the numbered core units are micro-LESSONS; "chapters" was the legacy long-form format): - All numbered refs course-wide: "Chapter N.N" / "Ch N.N" -> "Lesson N.N" (markdown prose, orientation callouts, cover alts, SVG artwork). - data/course_sequence.yaml module labels -> "Lesson N.N"; the how-this-course-works label becomes "Overview" (it is the map, not a numbered unit); count prose "20+ chapters" -> "20+ lessons". - lib/course_validators.rb converted into the terminology ratchet: "Lesson N.N" refs validate against the sequence; any numbered "Chapter/Ch N.N" in body or SVG is now a violation. Non-numbered "chapters" (Going Further, continuation, supplementary) intentionally keep the word - that set IS the long-form tier. - An earlier frequency-based sweep toward "Chapter" was reverted after checking the documented decision; .okf/content/course-canon.md now records the terminology rule so it cannot flip again. FEEDBACK.md 7a-7c refinements (2.3 find-10): - The 3.1 forward-reference dropped from the three-sentences napkin note. - The ICP-map prompt's competitor slots now start from the 1.1 [competition] blank (they were captured in Module 1, not new work). - "Read where they're already complaining" opens by distinguishing this pass (collect the named people behind complaints) from 1.2's research prompt (collect phrases for the page) - resolving the M1-vs-M2 quote-hunting confusion. - The [customer]-bullet pain-moment addition in 1.1 was reverted on owner review - the time dimension belongs to [problem]. 5 template PDFs regenerated. Gates: bin/hugo-build green (8 validators incl. the new Lesson ratchet), test:critical 46 runs 0 failures. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): 1.2 quote-harvesting becomes Step 1 - M1 no longer depends on later modules for quotes Owner finding: Module 1 needs verbatim customer quotes (1.1's [problem] Fix, 1.2's value-prop slots) but the harvesting instructions lived later in the course, and 1.2's own research prompt sat AFTER the builder prompt that consumes its output, labeled "Optional." Fix: 1.2 now runs Step 1 (get 2-3 real quotes - the Perplexity research prompt, framed as the expected path since most first-timers have no quotes yet; skippable if you have real ones) then Step 2 (the builder prompt, slots referencing Step 1). Cross-links note the same quotes feed 1.1's [problem] blank and seed Module 2's people-hunting. Downstream "prompt above" references updated to "the Step 2 prompt." Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): artifact-chain audit fixes - phantom email list, prompt slot canon, reuse bridges Two swarm audits (dependency graph over the full spine; inventory of all ~16 copy-paste prompts) found the spine soundly ordered - the 1.2 harvest-before-build fix closed the only instance of its bug class, and the owner's 2.2-persona / 2.3-duplication leads both came back clean (explicit mapping tables + acknowledged-reuse reframes). This wave ships every real defect they did find: Dependency fixes: - The phantom "1.4 smoke-test email list": three lessons (2.4, 5.1, 4.4) consumed a waitlist list no lesson ever told Sam to keep. 1.2's build checklist now locates it (builder's Subscribers tab) and 1.4's handoff names it as an artifact with its downstream consumers. - 1.1's riskiest-assumption flag was produced with ceremony and never reused - 1.4's results reading now closes the loop (did the surprise land on the flagged blank? update the flag for Module 2). - 1.2 Step 1 now says to keep source URLs (2.3 reads those same threads); 5.4's paid-pilot teaser reassures the mechanic arrives in 5.6 before money is due. Prompt-chain canon (progressive elaboration rule, now in .okf canon: "expand, never restart"): - Canonical slot vocabulary applied: [customer] replaces 8 spellings ([TARGET USER], [YOUR ICP], [buyer persona]...); every reused slot names its source lesson (2.6 prototype prompt, 5.2 channel prompt, stripe-price-test button + pricing prompts, hypothesis-sprint research). - Reuse bridges: 2.3's ICP-map prompt seeds from 1.2's sourced complaints and the 30-name list opens with the 1.2 complaint posters as its first rows; 4.4's RLS audit and 4.3's leakage check acknowledge their earlier twins; the three forum-research prompts cross-reference instead of silently re-running. - Outreach template slot casing aligned with 5.4. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): full reuse-vs-duplication wave - one canonical home per artifact, 4 drift contradictions resolved Two reuse auditors covered every remaining page class (11 template pairs; references + Going Further + oversight cluster). References, walkthroughs, quickstart/faq and 5 template pairs came back clean. 20 fixes for the rest: Drift duplications (copies that DISAGREED): - Outreach 3-message sequence differed on all three messages while both pages claimed "verbatim" - template is canonical; 2.4 now excerpts Day 0 byte-for-byte + points for the rest. - Build-path worksheet had 4.1's Q4/Q5 swapped AND a narrower senior-engineer branch - renumbered + reconciled to the lesson. - friday-demo-template vs weekly-dev-report had the same two PRs with reversed review status - aligned to the weekly report as canon. - churn-triage called its 40% retention cut "Sean Ellis's must-have threshold" while its own prose put must-have retention at 60-80% - relabeled with an explicit don't-conflate note (survey 40% stays 5.1's). - Also: PRD page-count cells, date-range-picker days, kit's misdescribed 5.7 cold script, Mom-Test Q4 wording, glossary pixel pointer (1.3->1.4), phantom "four-question script" pointer, "email-gated" kit description, Mia 2%-vs-4% illustration. Silent duplications collapsed to canonical home + pointer: - Full DPA contract was hosted byte-identical on BOTH 5.6 and the operating kit - 5.6's #dpa-template anchor is canonical, kit keeps its sector-fill delta. - hire-track reference re-hosted sow-reading-guide's 8-clause table with no link - now points, keeps the $78K framing. - agency follow-up post re-cloned the 5-Question Script's rubric (with realized drift in the token-cost composition) - table cut, pointer in, seat-vs-API composition reconciled across all three tellings, slopsquatting citations unified on the chapter's sources. - friday-demo-template parentage repointed from a section that does not exist to the Friday Demo Rule lesson. - Slopsquatting cover alt described artwork that never existed (a gem-name package box) - rewritten to describe the actual cover. 5 template PDFs regenerated. Gates: bin/hugo-build green (8 validators), test:critical 46 runs 0 failures (84 screenshots). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * adds feedback * feat(course): M2 compression migration - six lessons to micro-lesson form, depth moved to four new reference companions Migrates Module 2 (never migrated to the 30.03 micro-lesson spec; 1,652-5,124 body words) down to exemplar-parity lengths (1,265-2,038, vs migrated 1.4 exemplar at 1,258 on the same basis). Depth MOVED, not deleted: - 2.1 Mom Test 2,986->1,452; per-question pass/fail walkthroughs, interview-flow mermaid, good-vs-bad SVG -> new reference/mom-test-full (1,610) - 2.2 AI personas 3,385->1,362; prompts 2-5, keep/revise/cut rubric, Objection Tracker -> new reference/persona-rehearsal-full (1,657) - 2.3 Where to Look 2,792->1,708 raw; per-channel walks, search-string gallery, six-dimension filter -> new shared reference/find-10-people-full (2,014) - 2.4 What to Say 2,449->1,232 raw; message teardowns, panel fallback, slow-path variant -> same shared reference - 2.5 Synthesis compressed to 630 prose (in band); depth already lives in the validated-problem-statement template, now pointed at instead of duplicated - 2.6 Prototype 3,587->1,142 prose; screen-by-screen build, worked example, full session script -> new reference/prototype-build-full (2,745) All reuse bridges preserved verbatim (seed pains, 1.2-posters-first-rows, placeholder-mapping table, excavation beat, Day-0 byte-exact excerpt, Torres recruiting barriers). Canon numbers intact; zero em-dashes. Lessons gain uniform "Deeper reference:" footers; M2 landing card links the four new companions. Band overage on 2.1/2.3/2.6 accepted: the mandated-keep prompts, tables, and bridges alone exceed the strict band, and exemplar parity is the operative target. Gates: bin/hugo-build green (726 pages, 8 validators), bin/rake test:critical 46 runs / 0 failures, 84 screenshots no diffs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(okf): record M2 compression migration + exemplar-parity rule Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): cold-eyes reuse fixes - warm lists, brief-as-scope, persona reconciliation, PRD Section 2 Four expand-never-restart defects from the M3+ cold-eyes artifact-reuse review: - 5.3 built the 50-name list cold from LinkedIn while three warmer lists already existed; new step 0 seeds champions/hot from the 2.4 interviewees, 1.4 waitlist signups, and 2.3 30-name list (mirrored in the operating kit's component 1 and Week-2 plan) - SOW guide asked for "your original RFP or feature wishlist" the course never produces; now ingests the 3.1 Product Brief + 3.2 outcome-shaped feature list as the scope Exhibit, with a Clause-1 vagueness tripwire - 5.1 derived a must-have persona parallel to the 2.5 validated persona with no reconciliation; one sentence names the delta-or-correction step - vibe-prd-template told readers to write Section 2 "from scratch" though the moment-of-use detail lives in Module 2 interview notes + 2.6 session notes Operating-kit PDF regenerated. Gates: bin/hugo-build green, bin/rake test:critical 46 runs / 0 failures, 84 screenshots no diffs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): M5 completion migration - 5.1/5.2/5.6/5.7 to micro-lesson form, four new reference companions Module 5 shipped two incompatible formats (5.3-5.5 v2, the rest v1 long-form at 2,879-4,015 words). This closes the split: all seven lessons now share the v2 template. Depth MOVED, nothing deleted: - 5.1 must-have segment 2,879->1,406; survey mechanics depth, segment SVG, decision tree -> reference/must-have-survey-full (1,368) - 5.2 channel selection 2,922->1,220 [OPTIONAL badge kept]; channel deep dives -> reference/channel-selection-full (2,000) - 5.6 paid pilot 4,015->1,436; clause prose, pricing bands, objection tables, Stripe mermaid -> reference/paid-pilot-full (2,330). DPA template block + #dpa-template anchor byte-preserved (operating-kit deep links verified) - 5.7 outbound 3,913->1,373; PH/IH deep dive, tooling stack, script variants, stage-cadence SVG -> reference/outbound-full (2,609) Preserved: Sean Ellis 40% survey canon + response thresholds; the 2.5 persona-reconciliation step; 5.2's canonical-slot Claude prompt; deposit 10-30% ACV / $500 floor; cold reply bands + the Module 5 cold seed reuse. Added to all four: outcome line, labeled Success check, "If this fails", Deeper reference footer. All "chapter" self-refs -> "lesson". M5 landing card links the four companions. Gates: bin/hugo-build green (737 pages, 8 validators), bin/rake test:critical 46 runs / 0 failures, 84 screenshots no diffs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): M3 compression migration - 3.1/3.2 to micro-lesson form, two new reference companions The last fully-unmigrated module pair. Depth MOVED, nothing deleted: - 3.1 product brief 2,851->1,122; per-section examples + mistakes, good-vs-bad SVG, vibe-vs-traditional decision, paid-cohort table -> reference/product-brief-full (1,833) - 3.2 outcomes rewrite 2,988->1,456; worked pairs, feature-vs-outcome SVG, CRM comparison, AI-reviewer protocol, OpinionX step -> reference/outcomes-not-features-full (1,159) Preserved: 3.1's word-for-word ingest of the 2.5 validated problem statement + 2.6 vocabulary; the "Outcome-shaped feature list" artifact name and its Lesson 4.1 SOW wiring (the sow-reading-guide now depends on it); OpinionX -> 2.3-2.4 interviewees bridge (now linked to the real slug). Added outcome lines + "If this fails" blocks; one visual each; "this chapter/post" -> "this lesson"; dropped the banned named-founder vignette opener on 3.1. M3 landing card links both companions. Gates: bin/hugo-build green (737 pages, 8 validators), bin/rake test:critical 46 runs / 0 failures, 84 screenshots no diffs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): canon punch-list - six surgical drift fixes from the verification swarm - ai-token-bill: Cursor seat $20-60 -> $20-40 (canon; siblings agree) - 5.3: unsupported "Sixty percent" opener softened to the cited source's own qualitative finding ("nearly every") - friday-demo-template: generic receipt example PR #847 -> #849 (#847 is reserved for the refund-branch review story) - hypothesis-sprint-full: differentiator columns fast/easy/free -> faster/easier/cheaper (matches its own prose + SVG) - how-this-course-works: "Chapter 0" badge -> "Overview" (Lesson terminology canon; matches course_sequence.yaml) - faq: "Lesson 4.3 chapter" wording fixed; 12-rule list now pointed at its post-migration home (reference/stack-tools-full) Gates: bin/hugo-build green; content-only single-line edits. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * feat(course): M4 migration - all five lessons to micro-lesson form, five new reference companions Module 4 was fully unmigrated (v1 long-form, 2-7x over band, no "If this fails" blocks, no outcome lines). All five lessons now v2. Depth MOVED: - 4.1 hire decision -> 1,237; Airbnb story depth, 4 paths, Series-A off-ramp -> reference/hire-decision-full - 4.2 ownership -> 1,560; credential trap, good/bad pairs, recovery table -> reference/ownership-full ("last year" timeline made absolute) - 4.3 stack -> 1,301; per-tool deep dives, all 12 rules, build-time prompts -> reference/stack-tools-full (Claude leakage prompt kept verbatim in core) - 4.4 build phases 3,568->1,608; per-phase steps, RLS self-test, green-lights detail -> reference/mvp-build-phases-full (Lovable/2.6 bridge + 1.4 email list + interviewee invite kept verbatim) - 4.5 ceiling signals 3,930->1,743; per-signal depth, SOC2 kit, shed/house/ skyscraper -> reference/ceiling-signals-full. Voice fixes: cinematic opener replaced with practitioner voice; three unsourced cohort vignettes collapsed to one composite-disclaimed story + two mechanism descriptions; 5-col table folded to 4 (validator cap) Added outcome lines + labeled Success checks + real "If this fails" failure modes to all five; "chapter"/"Module 4 post" self-refs -> "lesson"; canon numbers preserved (7+/4-6/<4, worksheet Q4/Q5, $80-120/hr fractional); the 4.5 artifact carry-forward table and all certified reuse bridges intact. Orphan duplicate shed-house-skyscraper.svg removed from the lesson bundle (canonical copy lives in the reference). M4 landing card links the five companions. Gates: bin/hugo-build green (8 validators), bin/rake test:critical 46 runs / 0 failures earlier on the identical content set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(okf): full-course migration state + git-lock daemon gotcha Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): voice wave - opener-shape rotation across 16 standalone pages + composite disclaimers The landing audit found 16 of 31 standalone pages opening with the anonymous-founder vignette (~11 the near-identical "A founder we picked up in Q[N] 20XX" clone) and invented-client dollar stories with no composite disclaimer. One fixer owned all 16 so shape diversity is global: - Rotation: mechanism-first x4, artifact-first x4, direct-address x3, question x1, retained vignette x4 (cap: no shape >4; linked pairs differ) - The 4 retained vignettes (salvage-vs-rebuild, engineering-org-chart, pivot-or-persevere, churn-triage) all carry the standard "Illustrative composite" disclaimer; attribution phrasing softened to the approved churn-page model - friday-demo-template's vignette dropped entirely (no reader payoff on a copy-paste template page) - opens artifact-first with the 7-question script - All teaching mechanics kept: $95K, $54K, $78K, $4,800 token bill, 0.6% activation - moved out of fake-client framing into mechanism descriptions - Attribution sweep ("we picked up / we worked with / I rode shotgun") now fully clean course-wide, including the hire-track reference straggler validated-problem-statement PDF regenerated (its opener changed). Gates: bin/hugo-build green (8 validators), bin/rake test:critical 46 runs / 0 failures, 84 screenshots no diffs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(okf): log voice wave completion Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): operating kit reframed from check-back stub to live-artifact index The M5 audit flagged the kit as promissory (30.03 completion-reward rule): "Status: shipping", title "(DPA Template Live)", 5 of 6 components described as coming later, plus format claims that never existed (Typeform JSON, DocuSign-import, annotated example DPAs, one-tab scoring Sheet). Post-migration, every component actually lives in a Module 5 lesson or its new reference page - so the honest fix is reframing, not waiting: - Title/description drop the "(DPA Template Live)" progress framing - "Status: shipping" callout -> "How this works" index framing; nothing to check back for - Each component now links its live home: scripts -> 5.7 + outbound reference; Stripe steps -> 5.6 + paid-pilot reference; survey questions -> 5.1 + survey reference for the CSV formula; tracker -> build-from-spec - Phantom deliverables replaced with what exists (annotated-example DPAs -> typical deposit fills inside the canon band) - Rescue-trauma footer ("rescued codebases... rescue calls") rewritten to Sam-appropriate framing; "chapter" self-ref -> "lesson" Kit PDF regenerated. Also removed 268 stray git-ignored claude-flow daemon logs from the hire-track bundle (audit FYI housekeeping). Gates: bin/hugo-build green (8 validators), bin/rake test:critical 46 runs / 0 failures, 84 screenshots no diffs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(test): align chapter-number-consistency fixtures with Lesson terminology ratchet The Lesson-terminology rule added to lib/course_validators.rb (3ed76be) made 'Chapter N.N' body refs a violation, but the unit-test fixture still used them and expected a pass - CI Unit Tests red while local test:critical (which skips test:unit) stayed green. Fixtures now use 'Lesson N.N'; the invalid-number test targets the number path instead of being masked by the terminology flag; new test covers the terminology violation itself. 263 runs, 0 failures locally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(workflows): mechanical course-audit runbook for less-powerful agents 8-phase command+pass-rule checklist (length/structure/terminology/canon/ seams/render/judged-with-escalation/fix-protocol) distilled from today's 7-agent audit + retrospective, so future audit swarms run from a file instead of re-derived briefs. Linked from the OKF review-swarm playbook. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): CodeRabbit round 1 - M1 metric rigor + OKF doc accuracy Content (4 valid CodeRabbit findings on M1): - 1.2 builder prompt no longer invites invented customer quotes (match vocabulary, mark [NEEDS REAL WORDING] instead of filling gaps) and resolves the six-word-cap vs exact-quote tension (keep their words, compress) - 1.3 install block gains step 5: fire + verify the form-submit conversion event before any ad spend (with builder-counter fallback) - 1.4 conversion denominator is now campaign-attributed visits, not total page views - 1.5 six-click completion ratio marked too small to call; 20+ clicks before trusting it OKF accuracy (5 findings): build output dir corrected to _dest/public-dev; ratchet described as source-markdown scan (not rendered HTML) with scope-only mechanism (no exemptions); test-gates matrix marked incomplete + unit-suite rule for lib/ changes; render-verification documents the 1280x800 first-fold capture and the mobile-emulation caveat; canon table gains an external-sources section. Rejected with reason: 5.6 ACV-credit (already conditional 'on conversion'); baseof.html lineColor nit (theme change, full visual gate cost, cosmetic). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): retrospective re-audit wave + CodeRabbit round 2 Owner found problems the first audit missed; retrospective identified four process gaps (audits ran pre-migration, no scroll gate, no fresh-prose taste pass, nobody owned seams) and a 4-agent re-audit ran against them: PROSE-TASTE (fresh-eyes scored read of all new prose): 7 of 11 new reference pages carried a byte-identical orientation tail - varied per page; rescue-attribution stragglers ("who came to us...") and two ratchet-dodge rephrases (Stripe-rate rewording, $8-15K contradicting its own hourly band) fixed; 4 new ratchet signatures. Owner calls applied: two disclaimer-less "we saw/know" anecdote attributions neutralized, "47 cold DMs" fake-specific softened. SEAM-FIXER (cross-page coherence): the recurring "4.3 covers the 12 rules" over-attribution fixed x3 + routed to stack-tools-full; duplicated five-green-lights checklist trimmed to pointer; 1 ratchet signature. HIGH: how-this-course-works rendered "0 modules, 26 lessons" - the course-stat shortcode still matched "Chapter N"/"Chapter 0" labels after the yaml moved to "Lesson N.N"/"Overview"; shortcode fixed, now renders "5 modules, 25 lessons, 6 artifacts". RENDER GATES: M3/M4 slice fully clean (14 pages, 12 SVGs, evidence read); M5/voice slice fixed pivot-wheel center-hub text overflow (verified by re-render). CODERABBIT ROUND 2 (valid remainder): Lasso citation linked at point of use; sow-guide "blank cheque"->check, unsourced 80% mediation stat softened, fee-shift jurisdiction caveat; hire-track onboarding heading spans its real 4 weeks + .cursorrules/slopsquatting glossed; five-tech "Acronym"->"Term" columns; vibe-prd Section-3 lead + "one metric"; webhook async caveat in the stack walkthrough; age-based channel exclusion replaced with behavior-based rule. Stale template PDFs regenerated (build-path worksheet, validated-problem- statement). Gates: hugo-build green (8 validators), test:critical 46/0, test:unit 263/0, bin/test AND bin/dtest both green for the themes/ change (84 screenshots, no diffs, both platforms). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V --------- Co-authored-by: Paul Keen <pftg@Mac.fritz.box> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sprint #3a — Orphan source file removal
Method
Three-pass verification per file:
resources.Getreference scan across all layouts and partials@importtransitive dependency trace — only counted as "live" when the importing file itself has a live parentgrepacross layouts, CSS, JS, TOML, YAML, JSON, MarkdownA file was marked as a confirmed orphan only when all three passes found zero live references.
Orphans by category
20 top-level fl- / bem- / consolidated files** — Beaver Builder export artifacts with no
resources.Getentry point.22 components/ files — Not imported by
component-bundle.cssorcomponents.css(the two live component entry points). Includes migration helpers and unused component extracts.24 utilities/ files — Only imported by orphan files. Files with live parents (
utilities/fl-builder-grid.css,utilities/foundation/reset.css,utilities/foundation/screen-reader.css) were KEPT.1 variables/ file —
variables/colors.csshas no importer in the live chain.Note:
critical/(15 files) andmixins/(1 file) untouched per sprint constraints.#3a verification
bin/dtest: 84 screenshots, 0 failuresSprint #3b — PurgeCSS safelist audit
Hypothesis: The
greedy:safelist blanket-preserves CSS rules for class prefixes that are already fully captured inhugo_stats.jsonby Hugo'swriteStats. Removing redundant patterns lets PurgeCSS eliminate unused WordPress-era rules.Hypothesis confirmed: All 6 candidate patterns ARE in
hugo_stats.json(fl-node: 399 classes, fl-builder-content: 17, fl-col: 13, technologies-component: 1, footer-component: 1, use-cases: 1).Pattern audit results
/^fl-node//^fl-builder-content//^technologies-component//^footer-component//^fl-col//^use-cases/^use-casesbeyond the one captured class#3b bundle reduction
#3b verification
bin/dtest: 84 screenshots, 0 failuresDynamic load patterns (informational)
No dynamic CSS loading patterns block further reduction. All
resources.ExecuteAsTemplatecalls reference explicitly named source files already in the live set.Patterns kept — root cause analysis
/^fl-col/:fl-col-small-custom-width,fl-col-custom-width, and responsive variants likefl-col-responsive-*appear in source CSS but are not emitted as HTML classes in any Hugo template. They're used via WordPress Beaver Builder's runtime width calculations, kept alive in HTML by JavaScript that hugo_stats.json never sees./^use-cases/: Similar pattern —use-cases-*modifier classes set by JS interaction state.🤖 Generated with Claude Code
Summary by CodeRabbit