Skip to content

feat(course): P0-P1 sprints - funnel instrumentation, media/typography polish, printable PDFs#356

Merged
pftg merged 13 commits into
masterfrom
course-p0-p1-sprints
Jul 12, 2026
Merged

feat(course): P0-P1 sprints - funnel instrumentation, media/typography polish, printable PDFs#356
pftg merged 13 commits into
masterfrom
course-p0-p1-sprints

Conversation

@pftg

@pftg pftg commented Jul 11, 2026

Copy link
Copy Markdown
Member

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)

  • GA4 funnel events on course pages via data-course-event attributes + 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.
  • Microsoft Clarity hook in the analytics partial, gated on a microsoftClarity site param - inert until the project ID is set (Paul actions listed in 40.18).
  • External validation pilot kit revived as 40.18-external-validation-pilot-kit.md (deferral condition - course complete - met; revival section records what's live + remaining human actions).
  • Footer © year now dynamic (now.Year); dead hardcoded "© 2024" param removed.

Sprint B - media + typography (P1)

  • TL;DR visual accent: blockquote render hook adds .bq-tldr (purple bar + tint) so the lesson-head stack reads ranked; verified 1 per lesson, all other blockquotes byte-identical to goldmark default.
  • 5 Mia walkthrough heroes + artifact-trail SVGs: the most-linked pages in the course were pure text walls; each now has a family-style cover (og:image wired) and an inline per-module artifact trail. All 24 SVG facts verified against each walkthrough's own body.
  • 21 companion covers carried the retired "Curriculum NN/30" counter (incl. the ICP-flagged glossary "08/30") → now "Curriculum 2026", art preserved.
  • 1.5's off-style flow SVG rebuilt as "same button, two framings" using the lesson's own copy; 1.3 SVG factual label fix; 5.7 stages mermaid TB→LR with a fontSize bump (was a ~1,200px vertical wall, now a compact legible band).
  • Blockquote de-stacks: outreach-sequence-template Day-3 variants merged into one box; 4.3 + 5.7 "$0 path" callouts converted to neutral free-vs-paid prose per the recorded budget stance.

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 print block hides site chrome and guards table/pre/blockquote page breaks.
  • 5 print-verified PDFs shipped as bundle resources with a "Prefer paper? Download the PDF" line (feeding the GA4 event): 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.

Test evidence

  • bin/validate-course: 8/8 green on every commit; bin/hugo-build green
  • bin/rake test:critical: 46 runs, 0 failures
  • bin/test (macOS) + bin/dtest (Linux): 46 runs, 0 failures, 84 screenshots, no diffs each
  • Visual gate via headless-Chrome full-page captures at 1280px + 390px: walkthrough hero + artifact trail render (M1 trail numbers cross-checked against body), TL;DR accent distinct in the 5.7 head stack, two-framings SVG under its H2, mermaid band legible after the font bump, no horizontal overflow anywhere; PDFs opened and inspected page-by-page
  • Cold-eyes reviewer: SHIP, zero blockers/majors/minors; its 4 nits are documented in the hook comment or accepted as intended

🤖 Generated with Claude Code

https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V

Summary by CodeRabbit

  • New Features
    • Added “Prefer paper? Download the PDF” prompts across selected course pages and worksheet templates.
    • Added artifact-trail visuals plus improved cover image and social sharing metadata to walkthrough modules.
    • Added course click instrumentation for CTAs, branches, and glossary links; session recording is enabled when configured.
  • Content Updates
    • Refined multiple course lessons, decision/routing guidance, and templates for clarity.
    • Updated external validation pilot status and sprint notes.
  • Bug Fixes
    • Improved print formatting for companion pages and corrected key thresholds/routing details.

Paul Keen and others added 6 commits July 11, 2026 20:44
…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
@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: aec088ad-d8f9-4136-b270-5d7f88d9d6d4

📥 Commits

Reviewing files that changed from the base of the PR and between 9ba7567 and 05d89a3.

⛔ Files ignored due to path filters (5)
  • content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/decision-matrix.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/attack-chain.svg is excluded by !**/*.svg
📒 Files selected for processing (27)
  • content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/index.md
  • content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md
  • content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/index.md
  • content/course/tech-for-non-technical-founders-2026/channel-selection-before-outbound/index.md
  • content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md
  • content/course/tech-for-non-technical-founders-2026/customers-leaving-churn-triage-not-acquisition/index.md
  • content/course/tech-for-non-technical-founders-2026/engineering-org-chart-non-technical-founder/index.md
  • content/course/tech-for-non-technical-founders-2026/faq/index.md
  • content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md
  • content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md
  • content/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/index.md
  • content/course/tech-for-non-technical-founders-2026/first-ten-customers-outreach-message/index.md
  • content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/index.md
  • content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md
  • content/course/tech-for-non-technical-founders-2026/paid-pilot-charge-before-ship/index.md
  • content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/index.md
  • content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-build-phases/index.md
  • content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.md
  • content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/index.md
  • content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/index.md
  • content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/index.md
  • content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md
  • content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/index.md
  • docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.19-premium-review-full-course-2026-07-12.md
  • docs/workflows/visual-scroll-gate.md
  • themes/beaver/assets/css/style.css
  • themes/beaver/layouts/_markup/render-blockquote.html

📝 Walkthrough

Walkthrough

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

Changes

Course publishing and instrumentation

Layer / File(s) Summary
Printable artifact generation and rendering
bin/generate-template-pdfs, themes/beaver/assets/css/single-post.css, content/course/tech-for-non-technical-founders-2026/...
Adds Chrome-based PDF generation, print-specific layout rules, and PDF download callouts for course templates.
Course content and walkthrough media
content/course/tech-for-non-technical-founders-2026/...
Updates instructional guidance, navigation, titles, diagrams, social metadata, and Mia walkthrough artifact-trail images.
Course funnel analytics
layouts/course/list.html, themes/beaver/layouts/course/single.html, themes/beaver/layouts/partials/blog/*, themes/beaver/layouts/partials/page/analytics.html
Adds course event metadata and GA4 handling, conditionally loads Microsoft Clarity, and updates footer copyright rendering.
Blockquote presentation
themes/beaver/layouts/_markup/render-blockquote.html, themes/beaver/assets/css/style.css
Classifies TL;DR, good, and bad blockquotes and applies corresponding callout colors.
Publishing workflow and project records
.gitignore, config/_default/hugo.toml, docs/projects/..., docs/workflows/visual-scroll-gate.md
Updates generated-file ignore rules, copyright configuration, pilot records, review reporting, task tracking, and visual validation procedures.

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
Loading

Possibly related PRs

🚥 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 accurately summarizes the three main changes: funnel instrumentation, media/typography polish, and printable PDFs.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch course-p0-p1-sprints

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.

Paul Keen and others added 5 commits July 11, 2026 21:41
…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

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

Actionable comments posted: 8

🧹 Nitpick comments (1)
bin/generate-template-pdfs (1)

24-24: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Make 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

📥 Commits

Reviewing files that changed from the base of the PR and between 0d84580 and 9ba7567.

⛔ Files ignored due to path filters (54)
  • content/course/tech-for-non-technical-founders-2026/agency-ai-five-questions/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/agency-uses-ai-follow-up-questions/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/ai-token-bill-dev-shop-pass-through-cost/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/build-path-decision-worksheet.pdf is excluded by !**/*.pdf
  • content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/engineering-org-chart-non-technical-founder/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/first-paying-customer-operating-kit.pdf is excluded by !**/*.pdf
  • content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/kit-sample-row.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/architecture-comparison.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/catching-the-lie.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/demo-rule.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/friday-demo-template/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/hiring-interview-script/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/module-1-walkthrough-mia/artifact-trail.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/module-1-walkthrough-mia/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/artifact-trail.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/module-3-walkthrough-mia/artifact-trail.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/module-3-walkthrough-mia/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/module-4-walkthrough-mia/artifact-trail.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/module-4-walkthrough-mia/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/artifact-trail.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/mom-test-interview-script.pdf is excluded by !**/*.pdf
  • content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/sean-ellis-gauge.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/segment-isolation.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/vibe-prd-template-visual.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/ph-vs-ih.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/outreach-sequence-template/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/ownership-checklist/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/ownership-checklist/ownership-checklist.pdf is excluded by !**/*.pdf
  • content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-ledger.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/pivot-or-persevere-decision-framework/pivot-wheel.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/price-hypothesis-on-smoke-test-page/stripe-payment-link.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/salvage-vs-rebuild-decision-tree/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/self-serve-stack-walkthrough/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/airbnb-test.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/decision-matrix.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/slopsquatting-ai-supply-chain-attack/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/smoke-test-landing-page-7-day-demand-test/channel-icp-matrix.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/smoke-test-wire-tracking/tracking-snippets.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/sow-reading-guide/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/admin-panel-spaceship.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/stop-specifying-features-start-outcomes/feature-vs-outcome.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/validated-problem-statement-template.pdf is excluded by !**/*.pdf
  • content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/shed-house-skyscraper.svg is excluded by !**/*.svg
  • content/course/tech-for-non-technical-founders-2026/weekly-dev-report-template-founders/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/where-to-hire-developer-2026-map/cover.png is excluded by !**/*.png
📒 Files selected for processing (30)
  • .gitignore
  • bin/generate-template-pdfs
  • config/_default/hugo.toml
  • content/course/tech-for-non-technical-founders-2026/build-path-decision-worksheet/index.md
  • content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md
  • content/course/tech-for-non-technical-founders-2026/module-1-walkthrough-mia/index.md
  • content/course/tech-for-non-technical-founders-2026/module-2-walkthrough-mia/index.md
  • content/course/tech-for-non-technical-founders-2026/module-3-walkthrough-mia/index.md
  • content/course/tech-for-non-technical-founders-2026/module-4-walkthrough-mia/index.md
  • content/course/tech-for-non-technical-founders-2026/module-5-walkthrough-mia/index.md
  • content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md
  • content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md
  • content/course/tech-for-non-technical-founders-2026/outbound-without-sales-team/index.md
  • content/course/tech-for-non-technical-founders-2026/outreach-sequence-template/index.md
  • content/course/tech-for-non-technical-founders-2026/ownership-checklist/index.md
  • content/course/tech-for-non-technical-founders-2026/price-hypothesis-on-smoke-test-page/index.md
  • content/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/index.md
  • content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.md
  • docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.18-external-validation-pilot-kit.md
  • docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md
  • docs/workflows/visual-scroll-gate.md
  • layouts/course/list.html
  • themes/beaver/assets/css/single-post.css
  • themes/beaver/assets/css/style.css
  • themes/beaver/layouts/_markup/render-blockquote.html
  • themes/beaver/layouts/course/single.html
  • themes/beaver/layouts/partials/blog/course-analytics.html
  • themes/beaver/layouts/partials/blog/course-prev-next.html
  • themes/beaver/layouts/partials/page/analytics.html
  • themes/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.

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.

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

Suggested change
- 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.

Comment on lines +159 to +167
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.

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.

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

Suggested change
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.

Comment on lines +8 to +11
- **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.

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.

🔒 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).

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.

🗄️ 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.

Comment on lines +28 to +31
```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

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.

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

Comment on lines +41 to +46
```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

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.

🩺 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 -S

Repository: 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 -S

Repository: 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-pdfs

Repository: 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.

Comment thread layouts/course/list.html
Comment on lines +42 to +44
<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>

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.

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

Suggested change
<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.

Comment on lines +1 to +12
{{ 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 }}

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.

🔒 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=toml

Repository: 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
done

Repository: 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
done

Repository: 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.

Paul Keen and others added 2 commits July 12, 2026 11:36
…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
@pftg pftg merged commit ad1cb19 into master Jul 12, 2026
2 checks passed
@pftg pftg deleted the course-p0-p1-sprints branch July 12, 2026 10:06
pftg pushed a commit that referenced this pull request Jul 12, 2026
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