Skip to content

chore(css): orphan source removal + PurgeCSS safelist audit - #333

Closed
pftg wants to merge 5 commits into
masterfrom
chore/css-orphan-audit
Closed

chore(css): orphan source removal + PurgeCSS safelist audit#333
pftg wants to merge 5 commits into
masterfrom
chore/css-orphan-audit

Conversation

@pftg

@pftg pftg commented May 10, 2026

Copy link
Copy Markdown
Member

Sprint #3a — Orphan source file removal

  • Source files before: 148 CSS files (4.8 MB)
  • Orphans removed: 67 files
  • Source files remaining: 81 files (3.1 MB)
  • Source size reduction: 1.7 MB (35%)
  • Build output (css/): unchanged at 2.3 MB (orphans were never bundled)

Method

Three-pass verification per file:

  1. resources.Get reference scan across all layouts and partials
  2. @import transitive dependency trace — only counted as "live" when the importing file itself has a live parent
  3. Full-repo basename grep across layouts, CSS, JS, TOML, YAML, JSON, Markdown

A 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.Get entry point.

22 components/ files — Not imported by component-bundle.css or components.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/ filevariables/colors.css has no importer in the live chain.

Note: critical/ (15 files) and mixins/ (1 file) untouched per sprint constraints.

#3a verification

  • Hugo build: 1012 pages, identical to baseline
  • bin/dtest: 84 screenshots, 0 failures

Sprint #3b — PurgeCSS safelist audit

Hypothesis: The greedy: safelist blanket-preserves CSS rules for class prefixes that are already fully captured in hugo_stats.json by Hugo's writeStats. 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

Pattern hugo_stats classes Action Reason
/^fl-node/ 399 Removed All used node IDs captured; bin/dtest 0 failures
/^fl-builder-content/ 17 Removed All variants captured; bin/dtest 0 failures
/^technologies-component/ 1 Removed Single class captured; bin/dtest 0 failures
/^footer-component/ 1 Removed Single class captured; bin/dtest 0 failures
/^fl-col/ 13 Kept 8 visual regression failures — fl-col controls layout columns used beyond the captured set
/^use-cases/ 1 Kept 2 visual regression failures — CSS rules use ^use-cases beyond the one captured class

#3b bundle reduction

Bundle Baseline Final Delta
homepage 220 KB 142 KB -78 KB (-35%)
services 172 KB 118 KB -54 KB (-31%)
about-us 139 KB 93 KB -46 KB (-33%)
use-cases 168 KB 103 KB -65 KB (-39%)
blog-list 110 KB 76 KB -34 KB (-31%)
blog-single 112 KB 79 KB -33 KB (-29%)
Total 2.3 MB 1.4 MB -787 KB (-34%)

#3b verification

  • Hugo build: 1012 pages (all builds)
  • Final bin/dtest: 84 screenshots, 0 failures

Dynamic load patterns (informational)

No dynamic CSS loading patterns block further reduction. All resources.ExecuteAsTemplate calls 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 like fl-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

  • Style
    • Restructured theme stylesheet organization by consolidating and removing component and utility CSS files.
    • Updated CSS class safelist configuration in build tooling.

Review Change Stack

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>
@coderabbitai

coderabbitai Bot commented May 10, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This 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.

Changes

CSS Stylesheet Consolidation & Cleanup

Layer / File(s) Summary
Build Configuration
postcss.config.js
PurgeCSS greedy safelist patterns narrowed from 10 patterns to 6, removing ^fl-builder-content, ^fl-node, ^technologies-component, ^footer-component.
Master Consolidation Imports
themes/beaver/assets/css/_consolidated-layouts.css, themes/beaver/assets/css/components/_consolidated-components.css, themes/beaver/assets/css/utilities/_consolidated-utilities.css
Three master CSS files that aggregate @import directives for layouts, components, and utilities are completely emptied, breaking import chains for all dependent stylesheet files.
Critical & Foundation Stylesheets
themes/beaver/assets/css/critical.css, themes/beaver/assets/css/fl-foundation.css
Critical above-the-fold CSS and FL-Builder foundation utilities removed, including reset rules, base typography, layout containers, builder layer support, and responsive visibility helpers.
Layout Component Files
themes/beaver/assets/css/components/layout-columns.css, themes/beaver/assets/css/components/layout-foundation.css, themes/beaver/assets/css/components/layout-rows.css
Layout-specific component CSS defining column float rules, row centering, and layout box-sizing helpers are deleted.
Grid Column Utilities
themes/beaver/assets/css/utilities/grid/fl-col.css
FL-Builder grid column base styles and content padding/margin resets are removed.
Navigation Component Files
themes/beaver/assets/css/components/c-navigation.css, themes/beaver/assets/css/components/blocks/c-nav.css, themes/beaver/assets/css/components/navigation-migration.css
Navigation and menu component CSS fully removed, including .c-nav, .c-navigation BEM components, dropdown submenu styling, and FL-Builder/PowerPack menu integration.
Card & Content Components
themes/beaver/assets/css/components/blocks/c-card.css, themes/beaver/assets/css/components/cards-migration.css, themes/beaver/assets/css/components/c-testimonial-slider.css, themes/beaver/assets/css/components/c-testimonial-section.css
Card, testimonial, and content component CSS removed, including base card styles, layout variants, testimonial slider styling, and migration mappings.
Form & Input Components
themes/beaver/assets/css/components/forms-migration.css, themes/beaver/assets/css/components/c-gravity-forms.css
Form and Gravity Forms component CSS deleted, including .c-form styling, field layout, validation states, and form input styling.
Modal, Spacer & Additional Components
themes/beaver/assets/css/components/c-infobox.css, themes/beaver/assets/css/components/c-modal.css, themes/beaver/assets/css/components/c-pagination.css, themes/beaver/assets/css/components/c-spacer.css, themes/beaver/assets/css/components/buttons-migration.css, themes/beaver/assets/css/components/pp-tabs.css, themes/beaver/assets/css/components/typography.css
Modal overlay, spacer, pagination, infobox, button migration, tabs, and typography component CSS removed.
PowerPack Component Files
themes/beaver/assets/css/components/pp-content-grid.css, themes/beaver/assets/css/components/pp-list.css, themes/beaver/assets/css/utilities/components/powerpack/*
PowerPack plugin component CSS removed, including content grid layout, list styling, icon/infobox utilities, and component-specific positioning.
BEM Page Conversion Styles
themes/beaver/assets/css/bem-404-conversion.css, themes/beaver/assets/css/bem-home-page-minimal.css
BEM-based page-specific CSS for 404 error page and home page minimal layout removed, including custom properties and semantic class hooks.
Utility Base Files
themes/beaver/assets/css/utilities.css, themes/beaver/assets/css/utilities/display.css, themes/beaver/assets/css/utilities/clearfix.css, themes/beaver/assets/css/utilities/fl-builder-basic.css
Base utility stylesheet definitions for display, clearfix, and basic layout helpers removed.
Flexbox & Positioning Utilities
themes/beaver/assets/css/utilities/flexbox.css, themes/beaver/assets/css/utilities/position.css, themes/beaver/assets/css/utilities/positioning/center-absolute.css
Flexbox utility classes (.u-flex, .u-flex-column, .u-justify-center) and positioning helpers (.pos-relative, .center-absolute) removed.
Spacing & Display Utilities
themes/beaver/assets/css/utilities/c-spacing.css, themes/beaver/assets/css/utilities/margins.css, themes/beaver/assets/css/utilities/padding.css, themes/beaver/assets/css/utilities/opacity.css
Spacing utility classes for margins, padding, opacity, and component spacing (sections/containers) removed, including custom properties and mobile variants.
Responsive & Visibility Utilities
themes/beaver/assets/css/utilities/fl-builder-visibility.css, themes/beaver/assets/css/utilities/responsive/breakpoints.css, themes/beaver/assets/css/utilities/responsive/visibility.css
Responsive visibility toggles (.fl-visible-*), breakpoint rules, and media query styling for different screen sizes removed.
Color & Background Utilities
themes/beaver/assets/css/utilities/colors.css, themes/beaver/assets/css/utilities/colors/backgrounds.css
Color utility classes for text, backgrounds, borders, interactive states, CTAs, and visual helpers removed.
Accessibility Color & Enhancement Utilities
themes/beaver/assets/css/utilities/color-accessibility.css
WCAG color combinations, accessibility enhancements (high-contrast, reduced-motion), color-blind status patterns, and print accessibility styles removed.
FL-Builder Component Utilities
themes/beaver/assets/css/utilities/fl-builder-components.css
FL-Builder plugin utilities for modules, buttons, icons, photos, pagination, and slideshow components removed.
Typography Utilities
themes/beaver/assets/css/utilities/typography/text-utilities.css
Text alignment utility classes (.text-left, .text-center, .text-right) removed.
Accessibility Focus & Mobile Fixes
themes/beaver/assets/css/accessibility-focus.css, themes/beaver/assets/css/mobile-fixes.css
Accessibility focus styling (skip links, form control focus, dropdown/modal focus) and mobile fixes for 860px breakpoint removed.
Theme-Specific & Bundle Files
themes/beaver/assets/css/fl-clients-bundle.css, themes/beaver/assets/css/fl-contact-layout.css, themes/beaver/assets/css/cta-backgrounds.css
Theme-specific CSS for client bundle, contact layout, and CTA backgrounds removed, including advanced menu styling and FL-node overrides.
CSS Custom Properties
themes/beaver/assets/css/variables/colors.css
Root-level CSS custom properties for colors and backgrounds removed.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

Suggested reviewers

  • dgorodnichy

Poem

🐰 A rabbit hops through CSS files so neat,
Deleting sheets with cleanup complete,
PurgeCSS safelist trimmed down tight,
Consolidation now shining bright!
Old utilities fade to the past,
A cleaner codebase built to last. 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore(css): orphan source removal + PurgeCSS safelist audit' directly and clearly summarizes the main changes: removing orphaned CSS files and auditing PurgeCSS configuration.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/css-orphan-audit

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 and usage tips.

pftg and others added 4 commits May 10, 2026 19:10
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>
@pftg pftg changed the title chore(css): remove unreferenced legacy CSS source files chore(css): orphan source removal + PurgeCSS safelist audit May 10, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
postcss.config.js (1)

36-38: ⚡ Quick win

Excellent 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

📥 Commits

Reviewing files that changed from the base of the PR and between a2b96ae and d85499d.

📒 Files selected for processing (68)
  • postcss.config.js
  • themes/beaver/assets/css/_consolidated-layouts.css
  • themes/beaver/assets/css/accessibility-focus.css
  • themes/beaver/assets/css/beaver-grid-layout.css
  • themes/beaver/assets/css/bem-404-conversion.css
  • themes/beaver/assets/css/bem-home-page-minimal.css
  • themes/beaver/assets/css/components/_consolidated-components.css
  • themes/beaver/assets/css/components/blocks/c-card.css
  • themes/beaver/assets/css/components/blocks/c-nav.css
  • themes/beaver/assets/css/components/buttons-migration.css
  • themes/beaver/assets/css/components/c-gravity-forms.css
  • themes/beaver/assets/css/components/c-infobox.css
  • themes/beaver/assets/css/components/c-modal.css
  • themes/beaver/assets/css/components/c-navigation.css
  • themes/beaver/assets/css/components/c-pagination.css
  • themes/beaver/assets/css/components/c-spacer.css
  • themes/beaver/assets/css/components/c-testimonial-section.css
  • themes/beaver/assets/css/components/c-testimonial-slider.css
  • themes/beaver/assets/css/components/cards-migration.css
  • themes/beaver/assets/css/components/forms-migration.css
  • themes/beaver/assets/css/components/layout-columns.css
  • themes/beaver/assets/css/components/layout-foundation.css
  • themes/beaver/assets/css/components/layout-rows.css
  • themes/beaver/assets/css/components/navigation-migration.css
  • themes/beaver/assets/css/components/pp-content-grid.css
  • themes/beaver/assets/css/components/pp-list.css
  • themes/beaver/assets/css/components/pp-tabs.css
  • themes/beaver/assets/css/components/typography.css
  • themes/beaver/assets/css/critical.css
  • themes/beaver/assets/css/cta-backgrounds.css
  • themes/beaver/assets/css/fl-about-layout.css
  • themes/beaver/assets/css/fl-careers-layout.css
  • themes/beaver/assets/css/fl-clients-alt-bundle.css
  • themes/beaver/assets/css/fl-clients-bundle.css
  • themes/beaver/assets/css/fl-clients-layout.css
  • themes/beaver/assets/css/fl-component-layout.css
  • themes/beaver/assets/css/fl-contact-layout.css
  • themes/beaver/assets/css/fl-foundation.css
  • themes/beaver/assets/css/fl-homepage-layout.css
  • themes/beaver/assets/css/fl-services-layout.css
  • themes/beaver/assets/css/fl-use-cases-layout.css
  • themes/beaver/assets/css/mobile-fixes.css
  • themes/beaver/assets/css/utilities.css
  • themes/beaver/assets/css/utilities/_consolidated-utilities.css
  • themes/beaver/assets/css/utilities/c-spacing.css
  • themes/beaver/assets/css/utilities/clearfix.css
  • themes/beaver/assets/css/utilities/color-accessibility.css
  • themes/beaver/assets/css/utilities/colors.css
  • themes/beaver/assets/css/utilities/colors/backgrounds.css
  • themes/beaver/assets/css/utilities/components/powerpack/content-grid.css
  • themes/beaver/assets/css/utilities/components/powerpack/infobox.css
  • themes/beaver/assets/css/utilities/components/powerpack/pp-icon.css
  • themes/beaver/assets/css/utilities/components/powerpack/pp-list.css
  • themes/beaver/assets/css/utilities/display.css
  • themes/beaver/assets/css/utilities/fl-builder-basic.css
  • themes/beaver/assets/css/utilities/fl-builder-components.css
  • themes/beaver/assets/css/utilities/fl-builder-visibility.css
  • themes/beaver/assets/css/utilities/flexbox.css
  • themes/beaver/assets/css/utilities/grid/fl-col.css
  • themes/beaver/assets/css/utilities/margins.css
  • themes/beaver/assets/css/utilities/opacity.css
  • themes/beaver/assets/css/utilities/padding.css
  • themes/beaver/assets/css/utilities/position.css
  • themes/beaver/assets/css/utilities/positioning/center-absolute.css
  • themes/beaver/assets/css/utilities/responsive/breakpoints.css
  • themes/beaver/assets/css/utilities/responsive/visibility.css
  • themes/beaver/assets/css/utilities/typography/text-utilities.css
  • themes/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

@pftg pftg closed this May 11, 2026
@pftg
pftg deleted the chore/css-orphan-audit branch May 11, 2026 07:49
pftg pushed a commit that referenced this pull request Jul 12, 2026
… 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
pftg added a commit that referenced this pull request Jul 17, 2026
… 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>
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