feat(course): P0-P1 sprints - funnel instrumentation, media/typography polish, printable PDFs#356
Conversation
…t kit revival + dynamic footer year - GA4 course events via data-course-event attrs + delegated listener partial: start-course/quickstart (landing hero), branch-click (2.4/ 2.5/5.1 gate cards, from→to label), glossary-click, pdf-download - Microsoft Clarity template hook gated on microsoftClarity param (inert until the project ID is set - Paul action recorded in 40.18) - external validation pilot kit revived as 40.18 (deferral conditions met); revival-status section lists what's live + remaining actions - footer © year now dynamic (now.Year); dead copyright param removed Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…visuals, 5.7 mermaid - render-blockquote hook adds .bq-tldr to TL;DR callouts; purple accent gives the lesson-head stack visual hierarchy (verified: 1 per lesson, other blockquotes untouched) - outreach-sequence-template: Day-3 bump variants merged into one blockquote (adjacent-box count now 0) - 4.3: $0 Concierge MVP callout de-stacked to neutral prose (decision criterion leads, trade-off stated); 5.7: $0-stack callout de-stacked into the pipeline section as an equal free-vs-paid tooling choice - 1.5: off-style flow SVG rebuilt as 'same button, two framings' using the lesson's own copy; 1.3: GA4 sublabel factual fix; 1.2 anatomy SVG already correct (kept) - 5.7 stages mermaid TB→LR (was a ~1,200px vertical wall) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
… SVGs + 21 stale badges fixed - each Mia walkthrough gets a family-style hero cover (story-thread motif, per-module artifact terminal) + an inline artifact-trail SVG mapping that module's lesson outputs + cover/og frontmatter - the most-linked pages in the course are no longer pure text walls - 21 companion covers carried the retired 'Curriculum NN/30' counter (incl. the ICP-flagged glossary '08/30'); pill now reads 'Curriculum 2026' with title/chips/motif preserved pixel-for-pixel - 6 companions verified already-clean and skipped Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…eline) - bin/generate-template-pdfs: headless-Chrome print-to-PDF over the built pages (own temp profile; slug list at top; regenerate when the 5 source pages change - markdown stays the single source) - @media print block in single-post.css: hides site chrome/nav strip, black-on-white, break-inside guards for tables/pre/blockquotes - 5 print-verified PDFs shipped as bundle resources with a 'Prefer paper? Download the PDF' line (data-course-event= pdf-download feeds the GA4 funnel): build-path worksheet, Mom Test script, ownership checklist, validated problem statement, operating kit (DPA) - landing 'Free templates' section stays down per the 2026-05-21 deal until the full set exists; the other 9 gate on pilot download demand Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…ayout Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (27)
📝 WalkthroughWalkthroughThe PR adds template PDF generation and print styling, updates course content and walkthrough media, introduces course funnel analytics and Clarity tracking, adds semantic blockquote styling, and revises publishing workflow documentation and ignore rules. ChangesCourse publishing and instrumentation
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Visitor
participant CoursePage
participant CourseAnalytics
participant GA4
Visitor->>CoursePage: Click tracked course link
CoursePage->>CourseAnalytics: Provide event and link metadata
CourseAnalytics->>GA4: Emit course_* event
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 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 |
…ASCII cards + print polish - worksheet Q2/Q4 code blocks showed raw '[hire-track reference](/course/...)' markdown (links can't render inside pre; the Q2 line also overran the card edge) - now plain text pointing at the verdict table's real links; defect was live on the web page too (introduced in PR #354) - worksheet prose metric aligned: '8% smoke-test click rate' -> 'sign-up rate' (matches the corrected Q1/Good-example metric) - print CSS hides the self-referential 'Prefer paper? Download the PDF' line on paper (p:has(a[data-course-event=pdf-download])) - all 5 PDFs regenerated and re-inspected Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…p + gate hardening - pivot-wheel.svg: 'Customer Need' card was drawn over the subtitle (user-reported); wheel now sits in a translated group below the text - operating-kit: old-spine ghosts purged - '7.1-7.4' TOC renumbered to 5.1-5.7, 'walks five chapters'/'runs in four chapters' contradiction fixed, 7th component reframed as a bonus so 'The 6 components' holds, 'lead magnet' marketing jargon dropped - kit-sample-row.svg: font stack's terminal 'cursive' fell back to a glyph-dropping system font in headless print (gibberish table on paper) - stack now falls back to sans-serif - worksheet failure-mode '0 of 35 click' -> 30 (list canon); validated- problem 90-min block vs 30-min write reconciled - visual-scroll-gate.md: mandatory asset-level SVG raster pass + no-MCP headless-Chrome fallback documented (sampling pages missed 13 defective SVGs that a full asset sweep found) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…llout de-stack (all 43 SVGs + all 61 pages inspected)
Asset-level sweep (every course SVG rasterized + eyeballed) found 13
defective SVGs the page-sampling reviews had missed:
- overlapping text layers (catching-the-lie URL labels over step labels;
ph-vs-ih bar drawn over its own caption; shed-house-skyscraper caption
collision producing garbled '$10-25K/m6OC2')
- edge clipping (decision-matrix 3 quadrants; channel-icp-matrix callout
overflowing both sides; demo-rule 'tripe sandbo' pill + credential
crossing the panel divider; pivot-ledger 'core')
- elements through text (sean-ellis-gauge arrow, segment-isolation
ellipse, airbnb-test border, feature-vs-outcome border,
vibe-prd-template underline, admin-panel-spaceship truncation)
- stale old-spine refs INSIDE pivot-ledger art ('Chapter 2.3/7.5',
'Module 5A/6B' -> current canon)
Page-level sweep (all 61 pages, 332 scroll views): clean except 5.1's
mid-body triple callout stack (the 40.16 carry-forward) - re-run
cadence now prose, sample-size honesty + under-10 rules merged into
one callout. The alias-page 'directory index' finding was a file://
artifact - production alias redirect verified correct.
All 5 PDFs regenerated (operating-kit table now prints real glyphs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…shed label, kit row spacing - decision-matrix.svg: 'Module 3A/3B' old-spine ghosts -> 'Ch 4.3-4.4' / 'hire track' (matches pivot-ledger canon) - shed-house-skyscraper.svg: '2 ceiling signals fire' label crossed the house wall; shortened + repositioned into the clear gap - kit-sample-row.svg: 'Maybe - May 9' overran into the next column (read as '9F/u' in print); now 'Maybe · 5/9' - operating-kit PDF regenerated; all re-rasters eyeballed clean Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…ed agents) ruflo v3.25.6 'init --preset full' generates 96 local-tooling files under .claude/ - following the existing precedent that claude-flow artifacts (.claude-flow/, .mcp.json, binaries) stay untracked. Hand-authored agents elsewhere under .claude/ remain tracked. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (1)
bin/generate-template-pdfs (1)
24-24: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMake the Chrome path overridable via environment variable.
The hardcoded macOS path prevents Linux/CI usage without editing the script. Allow an override and fall back to the macOS default.
♻️ Proposed fix
-CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" +CHROME="${CHROME_BIN:-/Applications/Google Chrome.app/Contents/MacOS/Google Chrome}"🤖 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 `@bin/generate-template-pdfs` at line 24, Update the CHROME configuration in generate-template-pdfs to use an existing environment-provided Chrome path when set, while retaining the current macOS path as the fallback default.
🤖 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.
Inline comments:
In
`@content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md`:
- Line 219: Update the Path 1 metric text in the build-path decision worksheet
from “click” to “sign-up” so it matches the “sign-up rate” terminology and the
defined email-registration metric.
In
`@content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md`:
- Around line 159-167: Rewrite the “Re-run cadence” and “Sample-size honesty”
guidance to separate when to re-run from when to advance to M5.3. Correct the
example so under-10 guidance applies only to samples below 10, define
directional bands for every under-10 sample size (including 7–9 respondents),
and state one consistent rule that under-10 results may support provisional
advancement only with an explicit hypothesis caveat, not confident advancement.
Clarify that after a major release, re-run once the rate has held above 40% for
two consecutive runs rather than requiring two additional runs.
In
`@docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.18-external-validation-pilot-kit.md`:
- Line 10: Update the participant brief’s URL instructions to match the revived
whole Module 1 flow: provide only the landing-page URL in the welcome email,
have participants navigate from there through lessons 1.1 to 1.5, and remove the
requirement for two smoke-test URLs or the exclusion of the landing page.
- Around line 8-11: Update the Clarity setup guidance around the
microsoftClarity parameter and Paul’s remaining actions so activation is
explicitly blocked until /course/-only scope is implemented and the
cookie/consent posture is decided. Make these scope and consent prerequisites
hard requirements before setting the project ID, rather than optional follow-up
actions.
In `@docs/workflows/visual-scroll-gate.md`:
- Around line 28-31: Update the SVG conversion sweep to create /tmp/svgsweep
before processing files, and configure the shell loop to stop immediately if any
rsvg-convert invocation fails. Preserve the existing find, naming, and
conversion behavior.
- Around line 41-46: Update the documented headless fallback command to resolve
Chrome through a configurable path with a command -v fallback instead of
assuming the macOS app bundle. Before the ImageMagick command runs, create the
output directory with mkdir -p slices so it works from a clean checkout.
In `@layouts/course/list.html`:
- Around line 42-44: Update both hero CTA anchors in the template to include the
appropriate data-course-label attributes, using the existing course analytics
event labels for the start-course and quickstart actions so GA4 receives a
non-empty course_label.
In `@themes/beaver/layouts/partials/page/analytics.html`:
- Around line 1-12: Set the Microsoft Clarity project ID in the appropriate Hugo
configuration under [params], preferably config/_default/hugo.toml or the
relevant environment override, so the existing analytics.html conditional
enables the loader in non-server builds. Use the actual Clarity project ID and
leave the template logic unchanged.
---
Nitpick comments:
In `@bin/generate-template-pdfs`:
- Line 24: Update the CHROME configuration in generate-template-pdfs to use an
existing environment-provided Chrome path when set, while retaining the current
macOS path as the fallback default.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 30808c80-dfbb-49e2-8fdb-1ec63f193d1f
⛔ Files ignored due to path filters (54)
content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/build-path-decision-worksheet.pdfis excluded by!**/*.pdfcontent/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/engineering-org-chart-non-technical-founder/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/first-paying-customer-operating-kit.pdfis excluded by!**/*.pdfcontent/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-sample-row.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/architecture-comparison.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/catching-the-lie.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/demo-rule.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/friday-demo-template/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/hiring-interview-script/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/module-1-walkthrough-mia/artifact-trail.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/module-1-walkthrough-mia/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/artifact-trail.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/module-3-walkthrough-mia/artifact-trail.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/module-3-walkthrough-mia/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/module-4-walkthrough-mia/artifact-trail.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/module-4-walkthrough-mia/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/artifact-trail.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/mom-test-interview-script/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/mom-test-interview-script/mom-test-interview-script.pdfis excluded by!**/*.pdfcontent/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/sean-ellis-gauge.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/segment-isolation.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/vibe-prd-template-visual.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/ph-vs-ih.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/outreach-sequence-template/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/ownership-checklist/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/ownership-checklist/ownership-checklist.pdfis excluded by!**/*.pdfcontent/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-ledger.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-wheel.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/price-hypothesis-on-smoke-test-page/stripe-payment-link.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/airbnb-test.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/decision-matrix.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/channel-icp-matrix.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/tracking-snippets.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/sow-reading-guide/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/admin-panel-spaceship.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/feature-vs-outcome.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/validated-problem-statement-template.pdfis excluded by!**/*.pdfcontent/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/shed-house-skyscraper.svgis excluded by!**/*.svgcontent/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/cover.pngis excluded by!**/*.pngcontent/course/tech-for-non-technical-founders-2026/where-to-hire-developer-2026-map/cover.pngis excluded by!**/*.png
📒 Files selected for processing (30)
.gitignorebin/generate-template-pdfsconfig/_default/hugo.tomlcontent/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.mdcontent/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.mdcontent/course/tech-for-non-technical-founders-2026/module-1-walkthrough-mia/index.mdcontent/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/index.mdcontent/course/tech-for-non-technical-founders-2026/module-3-walkthrough-mia/index.mdcontent/course/tech-for-non-technical-founders-2026/module-4-walkthrough-mia/index.mdcontent/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/index.mdcontent/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.mdcontent/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.mdcontent/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/index.mdcontent/course/tech-for-non-technical-founders-2026/outreach-sequence-template/index.mdcontent/course/tech-for-non-technical-founders-2026/ownership-checklist/index.mdcontent/course/tech-for-non-technical-founders-2026/price-hypothesis-on-smoke-test-page/index.mdcontent/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.mdcontent/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.mddocs/projects/2605-tech-for-non-technical-founders/40-49-review/40.18-external-validation-pilot-kit.mddocs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.mddocs/workflows/visual-scroll-gate.mdlayouts/course/list.htmlthemes/beaver/assets/css/single-post.cssthemes/beaver/assets/css/style.cssthemes/beaver/layouts/_markup/render-blockquote.htmlthemes/beaver/layouts/course/single.htmlthemes/beaver/layouts/partials/blog/course-analytics.htmlthemes/beaver/layouts/partials/blog/course-prev-next.htmlthemes/beaver/layouts/partials/page/analytics.htmlthemes/beaver/layouts/partials/page/footer-content.html
💤 Files with no reviewable changes (1)
- config/_default/hugo.toml
|
|
||
| **Failure mode to watch for each path** -> | ||
| - Path 1 -> 0 of 35 click. Pivot the pitch or the problem. | ||
| - Path 1 -> 0 of 30 click. Pivot the pitch or the problem. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Update "click" to "sign-up" for metric consistency.
Line 232 changed the smoke-test metric from "click rate" to "sign-up rate," and lines 73-75 define the metric as "the share of visitors who left their email." Line 219 still says "0 of 30 click," which is inconsistent with the updated terminology.
💚 Proposed fix
-- Path 1 -> 0 of 30 click. Pivot the pitch or the problem.
+- Path 1 -> 0 of 30 sign-ups. Pivot the pitch or the problem.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - Path 1 -> 0 of 30 click. Pivot the pitch or the problem. | |
| - Path 1 -> 0 of 30 sign-ups. Pivot the pitch or the problem. |
🤖 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
`@content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md`
at line 219, Update the Path 1 metric text in the build-path decision worksheet
from “click” to “sign-up” so it matches the “sign-up rate” terminology and the
defined email-registration metric.
| Re-run cadence: re-run while the must-have rate is climbing, and after every major release once it holds above 40% for two consecutive runs. If a re-run drops, read the "somewhat disappointed" Q2-Q4 verbatims first - the diagnostic is in there. | ||
|
|
||
| > **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict. If you have 6 users say "very disappointed" and 4 say "somewhat disappointed", the 40% threshold says PASS - but with a ±40 percentage-point confidence band around that number, you do not know whether real demand is 20% or 80%. Treat any reading under 10 respondents as **directional only**: use it to prioritize the next outreach batch, not to advance into Module 5.3 with confidence. | ||
|
|
||
| > **Sample under 10 respondents (special case):** segment-slice math does not work. Do NOT classify by 25-40% bands. Instead: | ||
| > - **0-2 "very disappointed"**: treat as directional NO. Book more user sessions before re-running. | ||
| > **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict - with 6 "very disappointed" out of 10 the threshold says PASS, but the confidence band is wide enough that real demand could be 20% or 80%. Under 10, segment-slice math does not work and the 25-40% bands do not apply. Read the count directionally instead: | ||
| > | ||
| > - **0-2 "very disappointed"**: directional NO. Book more user sessions before re-running. | ||
| > - **3-4 "very disappointed"**: directional MAYBE. Book 5-10 more users, re-run. | ||
| > - **5+ "very disappointed" out of 6**: directional STRONG YES. Advance to M5.3 but caveat your outreach decisions - the segment language is hypothesis, not verified. | ||
| > | ||
| > Use an under-10 reading to prioritize the next outreach batch, not to advance into Module 5.3 with confidence. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make the cadence and under-10 decision rules consistent.
The new guidance has three contradictions: 6/10 is not an under-10 sample, the rubric only defines 5+ out of 6 while omitting 7-9 respondents, and line 165 says to advance to M5.3 while line 167 says not to advance with confidence. Also, line 159 can be read as requiring two passing runs before re-running after a major release.
Separate the re-run cadence from the advancement gate and use one consistent provisional-advancement rule.
Suggested wording
-Re-run cadence: re-run while the must-have rate is climbing, and after every major release once it holds above 40% for two consecutive runs.
+Re-run cadence: re-run while the must-have rate is climbing and after every major release. Advance only after the rate holds above 40% for two consecutive runs.
-> with 6 "very disappointed" out of 10 the threshold says PASS, but the confidence band is wide enough that real demand could be 20% or 80%.
+For example, 5 of 9 may be directionally strong, but the confidence band is still wide enough that real demand could differ substantially.
-> **5+ "very disappointed" out of 6**: directional STRONG YES. Advance to M5.3 but caveat your outreach decisions - the segment language is hypothesis, not verified.
+> **5+ "very disappointed" out of 6-9**: directional STRONG YES. Begin M5.3 planning provisionally, but do not treat this as confident advancement.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Re-run cadence: re-run while the must-have rate is climbing, and after every major release once it holds above 40% for two consecutive runs. If a re-run drops, read the "somewhat disappointed" Q2-Q4 verbatims first - the diagnostic is in there. | |
| > **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict. If you have 6 users say "very disappointed" and 4 say "somewhat disappointed", the 40% threshold says PASS - but with a ±40 percentage-point confidence band around that number, you do not know whether real demand is 20% or 80%. Treat any reading under 10 respondents as **directional only**: use it to prioritize the next outreach batch, not to advance into Module 5.3 with confidence. | |
| > **Sample under 10 respondents (special case):** segment-slice math does not work. Do NOT classify by 25-40% bands. Instead: | |
| > - **0-2 "very disappointed"**: treat as directional NO. Book more user sessions before re-running. | |
| > **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict - with 6 "very disappointed" out of 10 the threshold says PASS, but the confidence band is wide enough that real demand could be 20% or 80%. Under 10, segment-slice math does not work and the 25-40% bands do not apply. Read the count directionally instead: | |
| > | |
| > - **0-2 "very disappointed"**: directional NO. Book more user sessions before re-running. | |
| > - **3-4 "very disappointed"**: directional MAYBE. Book 5-10 more users, re-run. | |
| > - **5+ "very disappointed" out of 6**: directional STRONG YES. Advance to M5.3 but caveat your outreach decisions - the segment language is hypothesis, not verified. | |
| > | |
| > Use an under-10 reading to prioritize the next outreach batch, not to advance into Module 5.3 with confidence. | |
| Re-run cadence: re-run while the must-have rate is climbing and after every major release. Advance only after the rate holds above 40% for two consecutive runs. If a re-run drops, read the "somewhat disappointed" Q2-Q4 verbatims first - the diagnostic is in there. | |
| > **Sample-size honesty.** The Sean Ellis 40% threshold is statistically directional at **≥ 10 respondents**, useful at **20+**, and segment-sliceable at **30+**. Under 10 respondents your result is a hypothesis, not a verdict - for example, 5 of 9 may be directionally strong, but the confidence band is still wide enough that real demand could differ substantially. Under 10, segment-slice math does not work and the 25-40% bands do not apply. Read the count directionally instead: | |
| > | |
| > - **0-2 "very disappointed"**: directional NO. Book more user sessions before re-running. | |
| > - **3-4 "very disappointed"**: directional MAYBE. Book 5-10 more users, re-run. | |
| > - **5+ "very disappointed" out of 6-9**: directional STRONG YES. Begin M5.3 planning provisionally, but do not treat this as confident advancement. | |
| > | |
| > Use an under-10 reading to prioritize the next outreach batch, not to advance into Module 5.3 with confidence. |
🤖 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
`@content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md`
around lines 159 - 167, Rewrite the “Re-run cadence” and “Sample-size honesty”
guidance to separate when to re-run from when to advance to M5.3. Correct the
example so under-10 guidance applies only to samples below 10, define
directional bands for every under-10 sample size (including 7–9 respondents),
and state one consistent rule that under-10 results may support provisional
advancement only with an explicit hypothesis caveat, not confident advancement.
Clarify that after a major release, re-run once the rate has held above 40% for
two consecutive runs rather than requiring two additional runs.
| - **Clarity install:** template hook shipped in `themes/beaver/layouts/partials/page/analytics.html`, gated on `microsoftClarity` param. **Paul's action:** create the project at clarity.microsoft.com, then set `microsoftClarity = "<project-id>"` under `[params]` in `config/_default/hugo.toml`. Note: hook is currently site-wide like GA4, not `/course/`-scoped - scope-limit it in the same commit as the ID if desired. | ||
| - **GA4 funnel events:** live on course pages - `course_start_course` / `course_quickstart` (landing hero CTAs), `course_branch_click` (2.4 / 2.5 / 5.1 decision-gate cards, labeled `from→to`), `course_glossary_click`, `course_pdf_download` (printable worksheets). Page-path funnel (landing → 1.1 → 1.4 → 2.x → 5.6) comes from standard GA4 path exploration. | ||
| - **Scope update vs the original kit:** the pilot now tests the WHOLE Module 1 core path (landing → 1.1 → 1.5), not just the two 2026-06 pilot lessons - update the participant brief URLs accordingly (welcome email: landing URL only; the course routes from there). | ||
| - **Remaining Paul actions before first invite:** Clarity project + param (above), cookie/consent posture decision, budget sign-off ($25 × 5 = $125), ~5 hours calendar across screener/brief/watching/synthesis. |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
Do not activate Clarity before scope and consent are closed.
Line 8 says setting microsoftClarity enables a site-wide hook, while this kit requires /course/-only tracking and leaves consent unresolved. Setting the ID as instructed can collect recordings outside the pilot scope before the consent decision is implemented. Make scope and consent hard prerequisites before activation.
🤖 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
`@docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.18-external-validation-pilot-kit.md`
around lines 8 - 11, Update the Clarity setup guidance around the
microsoftClarity parameter and Paul’s remaining actions so activation is
explicitly blocked until /course/-only scope is implemented and the
cookie/consent posture is decided. Make these scope and consent prerequisites
hard requirements before setting the project ID, rather than optional follow-up
actions.
|
|
||
| - **Clarity install:** template hook shipped in `themes/beaver/layouts/partials/page/analytics.html`, gated on `microsoftClarity` param. **Paul's action:** create the project at clarity.microsoft.com, then set `microsoftClarity = "<project-id>"` under `[params]` in `config/_default/hugo.toml`. Note: hook is currently site-wide like GA4, not `/course/`-scoped - scope-limit it in the same commit as the ID if desired. | ||
| - **GA4 funnel events:** live on course pages - `course_start_course` / `course_quickstart` (landing hero CTAs), `course_branch_click` (2.4 / 2.5 / 5.1 decision-gate cards, labeled `from→to`), `course_glossary_click`, `course_pdf_download` (printable worksheets). Page-path funnel (landing → 1.1 → 1.4 → 2.x → 5.6) comes from standard GA4 path exploration. | ||
| - **Scope update vs the original kit:** the pilot now tests the WHOLE Module 1 core path (landing → 1.1 → 1.5), not just the two 2026-06 pilot lessons - update the participant brief URLs accordingly (welcome email: landing URL only; the course routes from there). |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Synchronize the participant brief with the revived Module 1 scope.
This line changes the test to landing → 1.1 → 1.5, but Lines 53-55 still require two smoke-test URLs and explicitly exclude the landing page. Participants can therefore follow the old path and invalidate the intended funnel observations. Update the brief in this change or block invites until it is updated.
🤖 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
`@docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.18-external-validation-pilot-kit.md`
at line 10, Update the participant brief’s URL instructions to match the revived
whole Module 1 flow: provide only the landing-page URL in the welcome email,
have participants navigate from there through lessons 1.1 to 1.5, and remove the
requirement for two smoke-test URLs or the exclusion of the landing page.
| ```sh | ||
| find content/course/<section> -name "*.svg" | while read f; do | ||
| rsvg-convert -w 1400 "$f" -o "/tmp/svgsweep/$(echo "$f" | awk -F/ '{print $(NF-1)"__"$NF}').png" | ||
| done |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
Create the raster output directory before the mandatory sweep.
The command writes into /tmp/svgsweep/ without creating it. On a clean machine, every rsvg-convert invocation fails and the mandatory asset gate produces no PNGs. Add mkdir -p /tmp/svgsweep and fail fast on conversion errors.
🤖 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 `@docs/workflows/visual-scroll-gate.md` around lines 28 - 31, Update the SVG
conversion sweep to create /tmp/svgsweep before processing files, and configure
the shell loop to stop immediately if any rsvg-convert invocation fails.
Preserve the existing find, naming, and conversion behavior.
| ```sh | ||
| CHROME='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' | ||
| "$CHROME" --headless --disable-gpu --user-data-dir=$(mktemp -d) --hide-scrollbars \ | ||
| --window-size=1280,16000 --virtual-time-budget=8000 \ | ||
| --screenshot=page.png "file://$PWD/_dest/public-dev/<path>/index.html" & P=$!; sleep 16; kill $P | ||
| magick page.png -trim +repage -crop 1280x2400 +repage slices/page--%02d.png |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## BASE_HANDBOOK.md\n'
wc -l docs/workflows/BASE_HANDBOOK.md
sed -n '1,220p' docs/workflows/BASE_HANDBOOK.md
printf '\n## flow-router.md\n'
wc -l docs/workflows/flow-router.md
sed -n '1,220p' docs/workflows/flow-router.md
printf '\n## visual-scroll-gate.md excerpt\n'
wc -l docs/workflows/visual-scroll-gate.md
nl -ba docs/workflows/visual-scroll-gate.md | sed -n '1,140p'
printf '\n## search for CHROME and slices references\n'
rg -n "CHROME|slices/|virtual-time-budget|headless fallback|Google Chrome" docs/workflows -SRepository: jetthoughts/jetthoughts.github.io
Length of output: 3589
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## visual-scroll-gate.md lines 1-120\n'
awk 'NR>=1 && NR<=120 { printf "%4d %s\n", NR, $0 }' docs/workflows/visual-scroll-gate.md
printf '\n## search for slices setup and Chrome path references\n'
rg -n "mkdir|slices|CHROME=|Google Chrome|command -v|headless fallback|virtual-time-budget" docs/workflows/visual-scroll-gate.md docs/workflows -SRepository: jetthoughts/jetthoughts.github.io
Length of output: 6674
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## grep for Chrome path conventions\n'
rg -n "Google Chrome.app|command -v .*chrome|CHROME=|chromium|chrome-devtools" . -S
printf '\n## grep for slices directory handling\n'
rg -n "mkdir -p .*slices|slices/page--%02d|slices/" . -S
printf '\n## show tracked files named slices or related outputs\n'
git ls-files | rg '(^|/)slices($|/)|page--|visual-scroll-gate|headless'Repository: jetthoughts/jetthoughts.github.io
Length of output: 9372
🏁 Script executed:
#!/bin/bash
set -euo pipefail
awk 'NR>=1 && NR<=80 { printf "%4d %s\n", NR, $0 }' bin/generate-template-pdfsRepository: jetthoughts/jetthoughts.github.io
Length of output: 3430
Make the headless fallback self-contained. CHROME is hardcoded to a macOS app bundle, and magick writes into slices/ without creating it first. Use a configurable/command -v Chrome lookup and mkdir -p slices so the fallback works from a clean checkout.
🤖 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 `@docs/workflows/visual-scroll-gate.md` around lines 41 - 46, Update the
documented headless fallback command to resolve Chrome through a configurable
path with a command -v fallback instead of assuming the macOS app bundle. Before
the ImageMagick command runs, create the output directory with mkdir -p slices
so it works from a clean checkout.
| <a class="cta-link" href="{{ .Params.hero_primary_url }}" data-course-event="start-course">{{ .Params.hero_primary_text }}</a> | ||
| {{ if .Params.hero_secondary_url }} | ||
| <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}">{{ .Params.hero_secondary_text }}</a> | ||
| <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}" data-course-event="quickstart">{{ .Params.hero_secondary_text }}</a> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Add data-course-label to hero CTAs for consistent GA4 tracking.
The course-analytics.html click handler reads data-course-label and defaults to '' when absent. The branch and glossary links in course-prev-next.html all include data-course-label, but these hero CTAs do not, so course_label will be empty for course_start_course and course_quickstart events.
💡 Suggested fix
- <a class="cta-link" href="{{ .Params.hero_primary_url }}" data-course-event="start-course">{{ .Params.hero_primary_text }}</a>
+ <a class="cta-link" href="{{ .Params.hero_primary_url }}" data-course-event="start-course" data-course-label="{{ .Params.slug | default .File.BaseFileName }}">{{ .Params.hero_primary_text }}</a>- <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}" data-course-event="quickstart">{{ .Params.hero_secondary_text }}</a>
+ <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}" data-course-event="quickstart" data-course-label="{{ .Params.slug | default .File.BaseFileName }}">{{ .Params.hero_secondary_text }}</a>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <a class="cta-link" href="{{ .Params.hero_primary_url }}" data-course-event="start-course">{{ .Params.hero_primary_text }}</a> | |
| {{ if .Params.hero_secondary_url }} | |
| <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}">{{ .Params.hero_secondary_text }}</a> | |
| <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}" data-course-event="quickstart">{{ .Params.hero_secondary_text }}</a> | |
| <a class="cta-link" href="{{ .Params.hero_primary_url }}" data-course-event="start-course" data-course-label="{{ .Params.slug | default .File.BaseFileName }}">{{ .Params.hero_primary_text }}</a> | |
| {{ if .Params.hero_secondary_url }} | |
| <a class="cta-link cta-link--ghost" href="{{ .Params.hero_secondary_url }}" data-course-event="quickstart" data-course-label="{{ .Params.slug | default .File.BaseFileName }}">{{ .Params.hero_secondary_text }}</a> |
🤖 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 `@layouts/course/list.html` around lines 42 - 44, Update both hero CTA anchors
in the template to include the appropriate data-course-label attributes, using
the existing course analytics event labels for the start-course and quickstart
actions so GA4 receives a non-empty course_label.
| {{ if and (not hugo.IsServer) (site.Params.microsoftClarity) }} | ||
| <!-- Microsoft Clarity (session recordings; required by the course validation | ||
| pilot). Enable by setting microsoftClarity = "<project-id>" under | ||
| [params] in hugo.toml after creating the project at clarity.microsoft.com. --> | ||
| <script type="text/javascript"> | ||
| (function(c,l,a,r,i,t,y){ | ||
| c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; | ||
| t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; | ||
| y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); | ||
| })(window, document, "clarity", "script", "{{ site.Params.microsoftClarity }}"); | ||
| </script> | ||
| {{ end }} |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if microsoftClarity is configured in Hugo config files
rg -n 'microsoftClarity' config/ --type=tomlRepository: jetthoughts/jetthoughts.github.io
Length of output: 171
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## repo files mentioning microsoftClarity\n'
rg -n --hidden --glob '!**/.git/**' 'microsoftClarity' .
printf '\n## candidate Hugo config files\n'
git ls-files | rg '(^|/)(hugo\.toml|config\.(toml|yaml|yml|json)|config/|params\.(toml|yaml|yml|json))$'Repository: jetthoughts/jetthoughts.github.io
Length of output: 1265
🏁 Script executed:
#!/bin/bash
set -euo pipefail
for f in config/_default/hugo.toml config/development/hugo.toml config/production/hugo.toml config/test/hugo.toml; do
echo "## $f"
if [ -f "$f" ]; then
rg -n 'microsoftClarity|^\[params\]|^\s*googleAnalytics|^\s*' "$f" || true
echo
fi
doneRepository: jetthoughts/jetthoughts.github.io
Length of output: 15142
🏁 Script executed:
#!/bin/bash
set -euo pipefail
for f in config/_default/hugo.toml config/development/hugo.toml config/production/hugo.toml config/test/hugo.toml; do
echo "## $f"
if [ -f "$f" ]; then
rg -n 'microsoftClarity|^\[params\]$|^\[.*\]$' "$f" || true
echo
fi
doneRepository: jetthoughts/jetthoughts.github.io
Length of output: 1235
Set microsoftClarity in Hugo config if Clarity should ship.
site.Params.microsoftClarity is unset in all current config/*/hugo.toml files, so the loader never runs. Add the project ID under [params] in config/_default/hugo.toml or the relevant environment override.
🧰 Tools
🪛 HTMLHint (1.9.2)
[error] 1-1: Doctype must be declared before any non-comment content.
(doctype-first)
🤖 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 `@themes/beaver/layouts/partials/page/analytics.html` around lines 1 - 12, Set
the Microsoft Clarity project ID in the appropriate Hugo configuration under
[params], preferably config/_default/hugo.toml or the relevant environment
override, so the existing analytics.html conditional enables the loader in
non-server builds. Use the actual Clarity project ID and leave the template
logic unchanged.
…s + surgical fix waves (40.19)
6-reviewer swarm scored every page x 8 dimensions (text, voice,
structure, engagement, visual, typography, media, navigation) from
sources + all 331 fresh scroll views. 54/60 PREMIUM outright; every
sub-premium finding fixed:
P1: three-questions Friday-demo anchors pointed at the dev-shop blog
checklist - repointed to the course template
P2: churn 'Modules 6.1-6.5' ghost; channel-selection '4 channels' vs
5-row table (EaM demoted to a fifth-play note); operating-kit
intro honesty; 5.6 false 'expandable rows' meta-narration deleted;
slopsquatting CI gate unified at 20-line (was 3 vs 30; actual ~20)
+ 'Your founder' POV; 4.1 matrix SVG conflicting timelines; friday-
demo cadence mermaid LR->TD (was an unreadable band); pivot trigger
tree -> 5-row decision table (compressed-mermaid attempt was an
illegible micro-strip; prose already carries detail); 3 covers
'WEEKS 4 to ship' -> '4-10' (pace canon) + matching alt texts;
agency page title dedup; ai-token-bill mermaid house theme;
weekly-dev-report editorial footer note stripped; alias added for
the deleted first-ten-customers-personal-network slug
P3: grammar (three-questions), Ch0 duplicated gate sentence, price-tag
sweep (4 pages per the sub-$100-tool voice rule), engineering-org-
chart closing line, 'co flow' -> 'checkout flow'
Mia number-chain verified contradiction-free across all 5 walkthroughs.
Deliberate non-fixes recorded in 40.19 SS3 so future passes don't
re-litigate. Report: 40.19.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
… single findings (40.19 §5) Coordinator self-audit of the review triage; every gap fixed: - old-spine ghost titles: FOUR Going-Further pages carried 'Module 6' prefixes (6.2-6.5) - prem-3 flagged one as 'confirm intentional'; all stripped from titles + og_titles - internal 'Module N AI critic/simulator block' labels: prem-6 found one; three more existed (2.2/4.3/5.2) - all retitled Sam-facing - missed P2: org-chart staircase mermaid scaled to micro-text -> 6-row decision table + flags rule (the pivot pattern; sequential- checklist mermaids now convert to tables) - Good/Bad worked-example callouts render green/red via the blockquote hook (8+ pages); fixing it exposed a cascade bug - the brand blockquote border-left overpainted ALL accent classes incl. TL;DR; accents now set border-left-color instead of a competing box-shadow - 2.2 redundant 4th head callout merged into the Progress line (skip guidance was stated twice); 2.6 triple callout stack merged to two - continuation chapters (churn, pivot) get the nav strip + glossary via course_nav frontmatter - the CORE-vs-continuation inconsistency prem-4 flagged - stack-walkthrough Phase 3 opens with 'the AI writes it, you paste it' reassurance for the no-code ICP; Keyworddit 'Free tool' tag cut - gate doc: raw headless --window-size is NOT mobile emulation (fake right-edge clipping on every page) - MCP resize required for mobile Gates: validators 8/8, build, test:critical, bin/test AND bin/dtest all green (0 diffs). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Summary
Executes the three P0-P1 sprints from the 2026-07-11 grooming (TASK-TRACKER §Groomed backlog) in one bundled PR: measurement + pilot readiness (A), media/typography polish (B), and the printable-PDF thin slice (C). Built by a 6-agent swarm with disjoint file ownership + coordinator; fresh cold-eyes diff review verdict: SHIP.
Sprint A - pilot + measurement (P0)
data-course-eventattributes + one delegated-listener partial:course_start_course/course_quickstart(landing hero),course_branch_click(2.4/2.5/5.1 decision-gate cards, labeled from→to),course_glossary_click,course_pdf_download. Page-path funnel (landing → 1.1 → 1.4 → 2.x → 5.6) comes from standard GA4 path exploration.microsoftClaritysite param - inert until the project ID is set (Paul actions listed in 40.18).40.18-external-validation-pilot-kit.md(deferral condition - course complete - met; revival section records what's live + remaining human actions).now.Year); dead hardcoded "© 2024" param removed.Sprint B - media + typography (P1)
.bq-tldr(purple bar + tint) so the lesson-head stack reads ranked; verified 1 per lesson, all other blockquotes byte-identical to goldmark default.Sprint C - printable PDFs (P1)
bin/generate-template-pdfs: headless-Chrome print-to-PDF over the built pages (markdown stays the single source; regenerate on content change).@media printblock hides site chrome and guards table/pre/blockquote page breaks.Test evidence
bin/validate-course: 8/8 green on every commit;bin/hugo-buildgreenbin/rake test:critical: 46 runs, 0 failuresbin/test(macOS) +bin/dtest(Linux): 46 runs, 0 failures, 84 screenshots, no diffs each🤖 Generated with Claude Code
https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Summary by CodeRabbit