Skip to content

feat(course): Module 2 (Validate the Problem) v2 — template, Mia walkthrough, gatekeeper fixes#351

Merged
pftg merged 20 commits into
masterfrom
module-2-validate-the-problem
Jul 10, 2026
Merged

feat(course): Module 2 (Validate the Problem) v2 — template, Mia walkthrough, gatekeeper fixes#351
pftg merged 20 commits into
masterfrom
module-2-validate-the-problem

Conversation

@pftg

@pftg pftg commented Jul 10, 2026

Copy link
Copy Markdown
Member

Summary

Brings Module 2 (Validate the Problem) to the same v2 standard Module 1 shipped at in #345: template alignment, the Module 2 Mia walkthrough, a full multi-gatekeeper review loop, and every BLOCKER/MAJOR finding resolved with independent re-verification.

What's in the sprint (6 commits)

  1. Template alignment — all 5 chapters (2.1, 2.2 [OPTIONAL], 2.3a, 2.3b, 2.4) get the M1 lesson template: Lesson 2.x · [CORE/OPTIONAL] headers (old "Step N of 4" miscounted 5 chapters), Progress chain M2 · 1-5 of 5 with accumulating results, "After this lesson you will be able to" outcome lines, Done/You-have-now/Next/If-blocked footers.
  2. Project docs refreshed to post-feat(course): From Idea to First Paying Customer — 5-module course, landing, nav #345 reality (TASK-TRACKER, PROJECT-INDEX, GOAL-AT-A-GLANCE).
  3. Module 2 Mia walkthrough (module-2-walkthrough-mia) — continues the M1 composite story with every number consistent with the lessons it exercises (8 of 10 clear the ≥7/10 gate; her M1 Money and location notebook questions both close); See-it-in-action lines wired into all 5 lessons, the M1 walkthrough, and the landing card in the same commit.
  4. Release-gate punch list persisted as 40.12 (4 independent gate reports: cold-eyes, ICP, claims, consolidated — all converged).
  5. All gatekeeper findings fixed (net −173 lines): 6 in-lesson case-study blocks deleted (spec §2.7; contradicted the walkthrough); build/pivot/kill gate unified to canonical 7+/4-6/<4 across 4 pages with an explicit score≡spend equivalence; outreach-sequence-template fully rewritten from a stale 233-line funded-founder tool-stack artifact into a 95-line true 2.3b companion (Gmail + NeetoCal, honest bump variants); synthesis page got proper header/Progress/4-slot footer; 5 dead external links fixed; volatile price hardcodes → capability language; fabricated-precision stats → first-party or qualitative; "Most founders" ×3 + slogany flips reworded; 4-column mobile table fixed; currency normalized.
  6. Re-verification round — reviewer confirmed 5/5 fix clusters, caught one sweep-introduced broken sentence (fixed) + 5 pre-existing phantom anchors pointing into Module 2 (retargeted).

Verification

  • Independent re-verification verdict: ship-ready (all BLOCKERs genuinely resolved, no new defects remaining)
  • bin/hugo-build — all 7 course validators pass
  • bin/rake test:critical green on every commit (46 runs, 0 failures; 84 visual-regression screenshots, no diffs)
  • Production build link sweep over the whole course section: zero broken internal links
  • Em-dash / banned-pattern sweeps clean across all touched files

Known, deliberately out of scope (tracked in 40.12): the word-count band gap vs the 30.03 spec (pre-existing, needs a split-or-waiver decision), and Module 3-5 in-lesson case-study blocks (their modules' sprints).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added a Module 2 walkthrough following Mia through interviews, synthesis, decision-making, and prototype testing.
    • Added dedicated lessons for “Mom Test Synthesis: Build, Pivot, or Kill” and clickable prototype validation.
  • Documentation
    • Reorganized Module 2 into lessons 2.3–2.6 with updated navigation and cross-references.
    • Refreshed interview, outreach, prototype, decision framework, and course overview guidance.
    • Added a streamlined outreach sequence template for booking customer interviews.
    • Updated templates, FAQs, checklists, further reading, and completion guidance for consistency.

Paul Keen and others added 6 commits July 9, 2026 18:58
…plate

First slice of the Module 2 rework, matching the template Module 1 shipped
with in #345:

- headers: "Module 2 · Step N of 4" (which miscounted the 5 chapters as 4)
  → "Module 2 · Lesson 2.x · [CORE]" with 2.2 labeled [OPTIONAL]
- Progress lines added, chaining M2 · 1-5 of 5 with accumulating
  "Results so far" from Module 1 artifacts through scored interviews
- "After this lesson you will be able to:" outcome line added to all 5
- footers unified to Done / You have now / Next / If blocked, with the
  You-have-now line accumulating artifacts like Module 1's
- 2.3a opener "Most non-technical founders start with the same move"
  reworded (banned cohort-generalization pattern)

Remaining on this branch: Module 2 Mia walkthrough + See-it-in-action
lines, cross-page consistency pass, cold-eyes review loop.

Gates: bin/hugo-build validators pass; bin/rake test:critical green
(46 runs, 0 failures; 84 screenshots, no diffs). Em-dash and
banned-pattern sweeps clean on all 5 edited chapters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TASK-TRACKER, PROJECT-INDEX, GOAL-AT-A-GLANCE were 2-3 weeks stale
(pre-merge status, old 1.2a/b/c lesson labels, "pilot in flight").
Now: course merged + live via PR #345 (squash 90216d2); M1 fully v2 as
lessons 1.1-1.5 with four review rounds resolved; chapter count is
shortcode-derived (24 today, never hardcoded); covers say "20+ chapters" /
"All free"; obsolete deferred items closed (v1/v2 status callouts dropped,
cover regen done differently); active phase = M2 v2 migration on branch
module-2-validate-the-problem with template alignment landed (48552e7).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New module-2-walkthrough-mia continues the M1 composite story through
Module 2, consistent with every number the lessons teach: 5 past-tense
questions drafted per 2.1 (her hypothetical first draft matches the
lesson's broken-question table); one bad question caught in the 2.2
persona rehearsal; 30-name list read out of the same communities the
Vermont-mother post came from; 5-a-day outreach naming specific posts,
ten calls booked (2.3a/b); 8 of 10 clear the ≥7/10 real-past-spend gate
with one self-broken interview scored 3/10; the Money and location
notebook questions from M1 both close (parents pay $70-120/session;
specialty-first search confirmed); 2.4 prototype 4-of-5 pass with the
fail producing the finding (price belongs on the profile) and the
customer vocabulary for Module 3.

Wiring (same commit per 30.03 §2.7): italic See-it-in-action line added
to all 5 M2 lessons; M1 walkthrough's "Next: Module 2" now points at the
new page; landing M2 card gains the walkthrough link.

Gates: bin/hugo-build validators pass; bin/rake test:critical green
(46 runs, 0 failures; 84 screenshots, no diffs); production link sweep
clean; em-dash/banned-pattern sweeps clean on the new page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…esolved

Four independent gate reports (cold-eyes, ICP, claims, consolidated)
converged on the same defects; every BLOCKER and MAJOR is fixed:

- deleted all 6 in-lesson "Case Study: Tomas & Mia" blocks (30.03 §2.7:
  case studies live only at the module-end walkthrough; the blocks also
  contradicted the new walkthrough's numbers)
- unified the build/pivot/kill gate to the canonical 7+/4-6/<4 in 2.4's
  combined decision matrix and the interview script (both previously used
  <5 = KILL with an undefined band); synthesis page now states the
  score≥7 ≡ real-past-spend equivalence so orientation-page phrasing is
  the same gate
- synthesis page: proper "Module 2 · Synthesis · [CORE]" header, Progress
  line, 4-slot footer (was legacy 3-slot with "After Step 1" mislabel);
  2.1's post-interview routing now goes synthesis-first
- outreach-sequence-template fully rewritten as the true 2.3b companion
  (was a stale pre-split artifact: Calendly vs NeetoCal, Clay/Apollo
  80-120-row lists vs 30 hand-picked names, $200-500 credit-card persona,
  "30 founders I've already spoken to" scripted lie, "Module 0" ref,
  5%/2% bands). Now: Day-0/3/7 messages with honest first-round and
  experienced bump variants, LinkedIn/Reddit/waitlist openers, NeetoCal
  copy, tracking columns - Gmail-only, Sam-priced
- dead links fixed: YC how-to-talk-to-users 404 (5 lessons), yannklis
  (dead domain), Lenny 404, designkit 404, Google sending-limits 404;
  vps-template phantom #synthesis anchors, PDF/SVG claim, Module 3->2 and
  Module 4->3 mislabels; script's ed-tech-story promise dropped
- claims/voice sweep: Lovable/IdeaProof/ValidatorAI/Apollo/Perplexity/
  Maze/panel price hardcodes -> capability language; unsourced precision
  (3-5x, 70%+ show, 8-12%, 60%+, 200%-better, reply-band conflicts) ->
  first-party framed or qualitative; "Most founders" x3 + slogany flips
  reworded; Pushshift (restricted API) dropped; unspaced hyphen-dashes
  fixed; 2.2's 4-column tracker -> 3 columns (375px rule); Lovable gloss
  deduped; fractional-CTO reviewer refs -> founder-peer; currency
  normalized to $; walkthrough's 11-booked/10-run gap explained;
  quickstart/HTCW "2-hour" prototype figures dropped; 30.03 line 243
  updated (M2 walkthrough founder = Mia)

Gates: bin/hugo-build 7 validators pass; bin/rake test:critical green
(46 runs, 0 failures; 84 screenshots, no diffs); production link sweep
clean; em-dash/banned-pattern sweeps clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…hesis anchors

Reviewer re-verification of 83bcb14 confirmed all 5 fix clusters and
caught one defect the genericization sweep introduced: 2.4's Lovable
gloss read "Free trial; . No coding required." after the price removal -
now "Free trial available." Also retargeted the 5 Module 3-5 links still
pointing at 2.1's removed #synthesis anchor to the synthesis page
(pre-existing, but they point into Module 2 so they ride this sprint).

Gates: bin/hugo-build validators pass; bin/rake test:critical green
(46 runs, 0 failures; 84 screenshots, no diffs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

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

Next review available in: 49 minutes

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

How can I continue?

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

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 06023a8a-fa54-4bba-82f5-20c2fb696eca

📥 Commits

Reviewing files that changed from the base of the PR and between 273eef1 and 623fbe2.

⛔ Files ignored due to path filters (1)
  • content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/mom-test-script.svg is excluded by !**/*.svg
📒 Files selected for processing (23)
  • 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/clickable-prototype-validation-2-hour-lovable/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/find-10-people-with-problem-outreach-2026/index.md
  • content/course/tech-for-non-technical-founders-2026/form-your-founding-hypothesis-90-minute-sprint/index.md
  • content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md
  • content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md
  • content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md
  • content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md
  • content/course/tech-for-non-technical-founders-2026/outreach-sequence-template/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/smoke-test-landing-page-7-day-demand-test/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/validated-problem-statement-template/index.md
  • content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/index.md
  • data/course_banned_strings.yaml
  • data/course_sequence.yaml
  • docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.14-m2-final-fanout-2026-07-10.md
  • docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md
  • docs/projects/2605-tech-for-non-technical-founders/PROJECT-INDEX.md
  • docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md
📝 Walkthrough

Walkthrough

Module 2 was restructured into lessons 2.3–2.6, adding transcript synthesis and clickable prototype chapters. Lesson content, outreach templates, navigation, a Mia walkthrough, supporting course references, project records, and a banned-string validator were updated.

Changes

Module 2 curriculum and lesson flow

Layer / File(s) Summary
Curriculum sequence and lesson framing
content/course/.../_index.md, data/course_sequence.yaml, quickstart/index.md, how-this-course-works/index.md, Module 2 lesson pages
Module 2 now uses lessons 2.3–2.6, with explicit synthesis and prototype steps and revised lesson headers, metadata, and outcomes.
Interview preparation and build decision
ai-persona-pre-validation..., mom-test-ask-about-past-not-future/index.md, mom-test-interview-script/index.md, mom-test-synthesis-build-pivot-kill/index.md
Interview rehearsal, question evaluation, transcript scoring, and build/pivot/kill routing were updated for the revised sequence.
Interview recruitment and outreach resources
find-10-people-*, outreach-sequence-template/index.md, channel-selection-before-outbound/index.md, related course pages
Recruitment guidance, outreach messaging, templates, performance wording, and chapter references were aligned with chapters 2.3–2.4.
Prototype validation and downstream routing
clickable-prototype-validation-2-hour-lovable/index.md, module-2-walkthrough-mia/index.md, related templates and decision pages
Prototype validation, the Mia walkthrough, completion links, and downstream Module 3–5 handoffs were updated.
Content validation and project records
data/course_banned_strings.yaml, lib/course_validators.rb, test/unit/course_validators_test.rb, docs/projects/...
A banned-string validator and tests were added, while project status, release-gate, retrospective, and migration records were refreshed.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CourseIndex
  participant InterviewLessons
  participant SynthesisLesson
  participant PrototypeLesson
  participant Module3Brief
  CourseIndex->>InterviewLessons: route through lessons 2.1–2.4
  InterviewLessons->>SynthesisLesson: provide interview transcripts
  SynthesisLesson->>PrototypeLesson: route build decisions to lesson 2.6
  PrototypeLesson->>Module3Brief: pass validated problem and prototype findings
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the PR’s main theme: Module 2 v2 alignment, the Mia walkthrough, and related validation/gate fixes.
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 module-2-validate-the-problem

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 4 commits July 9, 2026 21:09
…overs

Sub-lettered indexes (2.3a/2.3b) read as A/B alternatives, carried no
information the Progress chain didn't, contradicted Module 1's flattened
1.1-1.5 precedent, and left the mandatory Synthesis gate without a number
("between 4 and 5 of 5"). Now: 2.1 Mom Test · 2.2 AI Personas [OPTIONAL] ·
2.3 Where to Look · 2.4 What to Say · 2.5 Synthesis · 2.6 Prototype.

- renumbered across all lesson titles/headers/Progress chains (n of 6),
  yaml (synthesis added to the prev/next sequence as Chapter 2.5 - spine
  count now derives 25 via course-stat), landing card (2.5 gets its own
  row, synthesis removed from the templates line), quickstart, HTCW table,
  and every cross-reference course-wide ("Ch 2.3 (a + b)" → "Ch 2.3-2.4",
  prototype refs 2.4 → 2.6, synthesis 2.1b → 2.5)
- Chrome re-review of all M2 pages at 1280x800 caught two lessons (2.3,
  2.5) shipping a stale copy of the pre-#345 landing cover ("18 chapters",
  "14 free"); both replaced with purpose-made lesson covers in the family
  style (30-name-list card; decision-gate card with 7+/4-6/<4 bands),
  rendered 2x + Lanczos, alt texts updated
- verified via headless audit: all 8 M2 pages 200, headers 2.1-2.6
  correct, zero stale letters, all images resolve, mermaid renders,
  no horizontal overflow
- all M2 pages confirmed draft: false (publish-ready)

Gates: bin/hugo-build 7 validators pass (incl. title-yaml-match on the
renumber); bin/rake test:critical green (46 runs, 0 failures; 84
screenshots, no diffs); production link sweep clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Residual from the claims sweep - the 2.2 copy was fixed, the Chapter 0
tool-stack row still named specific frontier models.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fresh zero-context review after the 2.1-2.6 flatten found the exact
predicted failure mode: prose written against the old order. All fixed:

- 2.1's post-interview line routed readers straight to the prototype
  (old next-chapter), skipping the 2.5 decision gate - now scores-first
- 2.6's exit-artifact table credited "Ch 2.1 synthesis" and ranged
  "Ch 2.1-2.4" for artifacts its own chapter produces (now 2.5 / 2.1-2.6);
  adjacent stale You-have-now recap now names 2.5 and 2.6 correctly
- vps-template: garbled mid-sentence fragment ("or ./mom-test-...))")
  rewritten; spliced ../ URL cleaned
- walkthrough gets a proper Lesson 2.5 section (the synthesis pass was
  the only lesson not modeled); description updated; gate verdict now
  named as BUILD on the 7+/4-6/under-4 scale
- 2.5: doubled <hr> removed; See-it-in-action line added (only sibling
  missing it); landing M2 card leave-line now names the build/pivot/kill
  decision

Reviewer confirmed the data layer (yaml, prev/next chain, gate
consistency, links, anchors, voice) fully clean - these were the last
prose stragglers.

Gates: bin/hugo-build validators pass; bin/rake test:critical green
(46 runs, 0 failures; 84 screenshots, no diffs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of review churn (7 rounds, each finding new defects): fixed
defects could silently return and edits re-created old classes - nothing
ratcheted. New validator 8 checks data/course_banned_strings.yaml (17
seed signatures from this cycle's review rounds) on every build; every
future review fix adds its signature in the same commit. First run caught
3 live 'Most founders' instances human rounds missed - fixed. Unit tests
updated (31 runs green); all 8 validators + critical suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

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

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/unit/course_validators_test.rb (1)

347-365: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add banned-string-ratchet to the asserted validator names.

The test asserts assert_equal 8 and checks 7 of 8 names, but omits assert_includes names, "banned-string-ratchet". A rename or swap of the 8th validator would pass silently as long as the count stays 8.

🐛 Proposed fix
     assert_includes names, "year-stamp-fabrication"
+    assert_includes names, "banned-string-ratchet"
   end
🤖 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 `@test/unit/course_validators_test.rb` around lines 347 - 365, Add an assertion
for "banned-string-ratchet" to the validator name checks in
test_run_all_returns_eight_results, ensuring all eight expected validators are
explicitly verified.
🟡 Minor comments (16)
content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md-50-50 (1)

50-50: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix subject–verb agreement.

Because “founder” is singular, inherit should be inherits.

Proposed fix
-A non-technical founder typically inherit the daily standup ritual without ever being told what good looks like.
+A non-technical founder typically inherits the daily standup ritual without ever being told what good looks like.
🤖 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/three-questions-turn-standup-into-proof/index.md`
at line 50, Fix the subject–verb agreement in the opening sentence by changing
“inherit” to “inherits” for the singular subject “A non-technical founder.”
content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/index.md-37-37 (1)

37-37: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix subject–verb agreement.

Because “founder” is singular, learn should be learns.

Proposed fix
-A non-technical founder often learn engineering vocabulary under pressure, mid-meeting, with a bill on the table.
+A non-technical founder often learns engineering vocabulary under pressure, mid-meeting, with a bill on the table.
🤖 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/five-tech-words-stop-nodding-at/index.md`
at line 37, Fix the subject–verb agreement in the opening paragraph: update “A
non-technical founder often learn” to use the singular verb “learns.”
content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md-33-43 (1)

33-43: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the callouts as continuous blockquotes.

The blank lines at Lines 42 and 249 trigger MD028 and may render the subsequent Skip this and Advanced content outside the intended callouts. Prefix those blank lines with > or remove them.

Also applies to: 248-250

🤖 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/ai-persona-pre-validation-mom-test-prep/index.md`
around lines 33 - 43, Fix the Markdown blockquote continuity in the lesson
content by removing the blank lines or adding a `>` marker at the affected gaps
near the `Skip this if you've interviewed before.` and `Advanced` callouts,
ensuring each callout remains a continuous blockquote and passes MD028.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md-32-42 (1)

32-42: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep these callouts as continuous blockquotes.

The blank lines at Lines 39, 41, and 196 trigger MD028 and can cause the following text to render outside the intended callout. Replace each blank line with > or remove it.

Also applies to: 193-197

🤖 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/mom-test-ask-about-past-not-future/index.md`
around lines 32 - 42, Fix the broken continuous blockquotes in the lesson
content by replacing the blank lines at the referenced callout sections,
including the area around “Where you are in the round” and lines 193–197, with
standalone “>” markers or removing the blank lines. Preserve all callout text
and ensure each blockquote renders as one continuous block.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md-39-39 (1)

39-39: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the blank line inside the blockquote.

Remove the blank line or prefix it with > so the callout remains one valid blockquote.

🤖 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/find-10-people-where-to-look/index.md`
at line 39, Remove the blank line within the blockquote in the course content,
or prefix that line with “>” so the entire callout remains a single valid
blockquote.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md-40-42 (1)

40-42: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the blank lines inside blockquotes.

Remove the blank lines or prefix them with > so these callouts render as continuous blockquotes.

Also applies to: 130-130, 386-386

🤖 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/clickable-prototype-validation-2-hour-lovable/index.md`
around lines 40 - 42, Remove blank lines within the blockquote callouts in the
Markdown content, including the sections around the TL;DR and the locations
referenced at lines 130 and 386; either delete the empty lines or prefix them
with > so each callout renders as one continuous blockquote.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md-39-41 (1)

39-41: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the blank lines inside the blockquote.

Remove the blank lines or prefix them with > to keep the introductory callout as one valid blockquote.

🤖 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/mom-test-synthesis-build-pivot-kill/index.md`
around lines 39 - 41, Fix the blockquote formatting around the TL;DR callout by
removing blank lines inside the blockquote or prefixing those lines with “>”,
keeping the entire introductory callout as one continuous blockquote.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md-203-203 (1)

203-203: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove the stray quote in the Reddinbox entry.

The rendered sentence currently contains Reddinbox / " These tools..., which is visibly malformed.

🤖 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/find-10-people-where-to-look/index.md`
at line 203, Remove the stray double quote after the Reddinbox link in the
monitoring tools paragraph, leaving the sentence to continue directly with
“These tools surface the threads faster.”
content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md-39-43 (1)

39-43: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the blank lines inside the blockquote.

Remove the blank lines or prefix them with > so the introductory callout remains valid Markdown.

🤖 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/find-10-people-with-problem-outreach-2026/index.md`
around lines 39 - 43, Remove the blank lines between the blockquoted TL;DR and
Part 2 paragraphs in the introductory callout, or prefix those lines with “>” so
the entire callout remains a valid contiguous Markdown blockquote.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md-387-387 (1)

387-387: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clarify that 7+ is a count threshold, not a score for every transcript.

“10 interview transcripts scored 7+/10 strong signal” reads as though all ten transcripts scored at least 7, conflicting with the documented 7-of-10 gate. State that ten transcripts were scored and at least seven met the strong-signal threshold.

🤖 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/clickable-prototype-validation-2-hour-lovable/index.md`
at line 387, The Module 2 completion checklist in the closing statement must
clarify the interview gate: replace “10 interview transcripts scored 7+/10
strong signal” with wording that indicates ten transcripts were scored and at
least seven met the 7+/10 strong-signal threshold, consistent with the
documented 7-of-10 requirement.
content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md-125-125 (1)

125-125: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the blank line inside the blockquote.

Remove the blank line or prefix it with > so the closing callout remains valid Markdown.

🤖 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/mom-test-synthesis-build-pivot-kill/index.md`
at line 125, Remove the blank line within the blockquote near the “If blocked”
guidance, or prefix that line with “>”, so the callout remains valid Markdown.

Source: Linters/SAST tools

content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md-129-129 (1)

129-129: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the malformed Lovable pricing sentence.

The bold sentence ends with a period, followed by lowercase and, producing broken prose. Join the clauses with a dash/comma or start a new sentence with Paid plans.

🤖 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/clickable-prototype-validation-2-hour-lovable/index.md`
at line 129, Fix the malformed pricing prose in the “Practical Lovable onramp”
paragraph by removing the period before “and” and joining the clauses correctly,
or by starting a new sentence with “Paid plans”; preserve the existing meaning
about paid plans being optional for this chapter.
content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md-199-199 (1)

199-199: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Soften the citation claim. Perplexity Pro and Gemini Deep Research are citation-oriented, but they don’t guarantee a source link for every individual claim. Rephrase this as “typically return citations” and keep the spot-check reminder.

🤖 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/find-10-people-where-to-look/index.md`
at line 199, In the “Upgrade the AI ICP map prompt with a deep-research tool”
section, soften the citation claim for Perplexity Pro and Gemini Deep Research
by replacing “return real-source citations for every claim” with wording that
says they typically return citations, while preserving the reminder to
spot-check each proposed community and collect reusable quote snippets.
content/course/tech-for-non-technical-founders-2026/outreach-sequence-template/index.md-81-81 (1)

81-81: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the booking guidance aligned with the interview script.

“Book 30 minutes, ask for 20 - the good calls run long” conflicts with the script’s bounded format: 20 minutes of talking, 5 minutes for scoring, and “Do not go over.” Replace this with explicit wrap-up/scoring buffer guidance so callers do not normalize overruns.

🤖 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/outreach-sequence-template/index.md`
at line 81, The duration guidance conflicts with the bounded interview format.
Replace the “book 30 minutes, ask for 20” wording in the outreach sequence with
explicit guidance to reserve 20 minutes for the conversation and 5 minutes
afterward for scoring and wrap-up, emphasizing that calls should not run over.
content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/index.md-65-65 (1)

65-65: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the section heading with the updated source chapter.

Line 63 still says “Chapter 2.1 synthesis,” while this line links to Ch 2.5. Update one of them so the template has a single authoritative chapter number.

🤖 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/one-page-product-brief-vibe-prd/index.md`
at line 65, Align the chapter reference in the surrounding section heading with
the linked validated problem statement in the “What goes in it” guidance,
ensuring both use the same authoritative chapter number.
content/course/tech-for-non-technical-founders-2026/vibe-prd-template/index.md-27-27 (1)

27-27: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Update the stale synthesis chapter label.

The link points to the synthesis page, but the text still says “Chapter 2.1.” Use the current chapter number, likely Ch 2.5, consistently with the revised Module 2 structure.

🤖 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/vibe-prd-template/index.md`
at line 27, Update the Chapter 2.1 label in the synthesis link description
within the Vibe PRD template to the current Chapter 2.5 designation, keeping the
existing link target unchanged.
🧹 Nitpick comments (2)
test/unit/course_validators_test.rb (1)

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

Add dedicated tests for the banned-string ratchet validator.

No test verifies that check_banned_strings actually detects a banned string, tests scope filtering, or exercises the missing-YAML fallback. The existing test_missing_yaml_file_does_not_crash doesn't cover this validator's missing-file path due to the hardcoded ratchet_path (see related comment in lib/course_validators.rb). A bug in the validator's regex, string matching, or scope logic would go undetected.

As per coding guidelines, new tests in test/unit/ should be behavior-focused — these would test the observable behavior (violation reported vs. not) without coupling to internals.

♻️ Example test cases
  # ── Validator 8: banned-string regression ratchet ──────────────────────

  def test_banned_strings_detects_violation
    File.write("#{`@tmpdir`}/data/course_banned_strings.yaml", YAML.dump({
      "banned" => [{ "string" => "Most founders", "reason" => "test ban" }]
    }))
    write_course_chapter(slug: "ch1", title: "1.1 · Test",
      body: "Most founders skip this step.\n")

    result = CourseValidators.run_all.find { |r| r.name == "banned-string-ratchet" }
    refute result.passed, "Banned string should be detected"
    assert result.violations.any? { |v| v.include?("Most founders") }
  end

  def test_banned_strings_scope_filters_by_directory
    File.write("#{`@tmpdir`}/data/course_banned_strings.yaml", YAML.dump({
      "banned" => [{ "string" => "banned phrase", "reason" => "scoped",
                     "scope" => "module-1-" }]
    }))
    write_course_chapter(slug: "module-1-lesson", title: "1.1 · Test",
      body: "This has banned phrase here.\n")
    write_course_chapter(slug: "module-2-lesson", title: "2.1 · Test",
      body: "This has banned phrase here too.\n")

    result = CourseValidators.run_all.find { |r| r.name == "banned-string-ratchet" }
    refute result.passed
    assert result.violations.any? { |v| v.include?("module-1-lesson") }
    refute result.violations.any? { |v| v.include?("module-2-lesson") }
  end

  def test_banned_strings_missing_yaml_passes
    FileUtils.rm_f("#{`@tmpdir`}/data/course_banned_strings.yaml")
    write_course_chapter(slug: "ch1", title: "1.1 · Test", body: "Content.\n")

    result = CourseValidators.run_all.find { |r| r.name == "banned-string-ratchet" }
    assert result.passed, "Missing banned-strings YAML should not crash"
  end
🤖 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 `@test/unit/course_validators_test.rb` around lines 347 - 388, Add
behavior-focused tests for the banned-string-ratchet result returned by
CourseValidators.run_all: verify a configured phrase produces a violation
containing the phrase, scope filtering reports only matching chapter slugs, and
a missing banned-strings YAML file passes without crashing. Place these
alongside the existing run_all tests and identify the validator by its result
name, "banned-string-ratchet".

Source: Coding guidelines

lib/course_validators.rb (1)

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

Extract BANNED_STRINGS_PATH as a class constant for test isolation.

ratchet_path is hardcoded as a local variable, unlike YAML_PATH, COURSE_DIR, and ALL_BLOG_DIR which are class constants overridden in test setup. This means tests read the real data/course_banned_strings.yaml from the project root instead of a temp fixture. Consequences:

  • test_missing_yaml_file_does_not_crash removes #{@tmpdir}/data but the validator still finds the real file — the missing-file fallback path is never exercised for this validator.
  • Tests pass only because test content ("Content.\n") doesn't match any of the 17 real banned strings. Adding a future banned string that matches test content would silently break tests.
♻️ Proposed fix
   YAML_PATH = "data/course_sequence.yaml"
+  BANNED_STRINGS_PATH = "data/course_banned_strings.yaml"
   ALL_BLOG_DIR = "content/blog"
   def check_banned_strings
     violations = []
-    ratchet_path = "data/course_banned_strings.yaml"
-    if File.exist?(ratchet_path)
-      entries = YAML.load_file(ratchet_path).fetch("banned", [])
+    if File.exist?(BANNED_STRINGS_PATH)
+      entries = YAML.load_file(BANNED_STRINGS_PATH).fetch("banned", [])
       course_chapters.each do |path|

And in test/unit/course_validators_test.rb setup/teardown:

     `@orig_yaml_path` = CourseValidators::YAML_PATH
+    `@orig_banned_strings_path` = CourseValidators::BANNED_STRINGS_PATH
     silence_warnings do
       CourseValidators.const_set(:COURSE_DIR, "#{`@tmpdir`}/content/blog")
       CourseValidators.const_set(:ALL_BLOG_DIR, "#{`@tmpdir`}/content/blog")
       CourseValidators.const_set(:YAML_PATH, "#{`@tmpdir`}/data/course_sequence.yaml")
+      CourseValidators.const_set(:BANNED_STRINGS_PATH, "#{`@tmpdir`}/data/course_banned_strings.yaml")
     end
     silence_warnings do
       CourseValidators.const_set(:COURSE_DIR, `@orig_course_dir`)
       CourseValidators.const_set(:ALL_BLOG_DIR, `@orig_all_blog_dir`)
       CourseValidators.const_set(:YAML_PATH, `@orig_yaml_path`)
+      CourseValidators.const_set(:BANNED_STRINGS_PATH, `@orig_banned_strings_path`)
     end
🤖 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 `@lib/course_validators.rb` around lines 343 - 367, Extract the hardcoded
ratchet path in check_banned_strings into a class constant named
BANNED_STRINGS_PATH, and use that constant instead of the local
"data/course_banned_strings.yaml" value. Update test setup and teardown to
override and restore BANNED_STRINGS_PATH alongside YAML_PATH, COURSE_DIR, and
ALL_BLOG_DIR so tests use the temporary fixture and exercise the missing-file
fallback.
🤖 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/clickable-prototype-validation-2-hour-lovable/index.md`:
- Around line 352-353: Resolve the overlapping outcomes in the decision matrix
by adding an explicit precedence rule or revising the conditions so each result
maps to exactly one route. Update the matrix near the “KILL” and “STOP, don't
proceed to M3” rows, prioritizing the appropriate action when both conditions
are true.

In
`@content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md`:
- Line 40: The TL;DR outreach math overstates the expected result from 30
messages. Update the recommendation and related conversion figures in the TL;DR
and corresponding section to align 20–30% replies with roughly 50% attendance,
or explicitly identify 10 interviews as a best-case outcome.
- Line 135: Replace the unsupported absolute claims in the opener sentence with
qualified language, such as stating that it often outperforms colder variants
and may be among the strongest examples in the chapter.

In
`@content/course/tech-for-non-technical-founders-2026/must-have-segment-pmf-test/index.md`:
- Line 174: Correct the final table-cell reference in the PMF test lesson so the
visible chapter/lesson label matches the destination
`/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/`;
update either the label or URL consistently, using the surrounding table row as
the edit location.

In
`@content/course/tech-for-non-technical-founders-2026/should-you-hire-2026-decision-tree/index.md`:
- Line 98: The self-serve gate conflicts with the Q1 definition because it omits
the required Ch 2.6 prototype criterion. Update the paragraph beginning “Pick
this path when” to include the current Ch 2.6 successful prototype-run
requirement, ensuring the gate matches the decision matrix; alternatively,
remove that requirement from Q1 so both rules are consistent.

In
`@content/course/tech-for-non-technical-founders-2026/validated-problem-statement-template/index.md`:
- Around line 53-55: Keep the validation requirement consistent throughout the
template: either change the new “one advisor plus one peer” guidance back to two
advisors, or update the sign-off fields and all downstream instructions to
explicitly accept one advisor and one peer, including their respective
signatures.

In
`@docs/projects/2605-tech-for-non-technical-founders/30-39-architecture-design/30.03-course-format-requirements-for-creators.md`:
- Line 385: Update the Module 2 “Validate” row to match the revised core-path
sequence: replace “2.4 Prototype” with “2.5 Synthesis” and “2.6 Clickable
Prototype,” and add the required build/pivot/kill decision step, matching the
ordering and naming in the course sequence definition.

---

Outside diff comments:
In `@test/unit/course_validators_test.rb`:
- Around line 347-365: Add an assertion for "banned-string-ratchet" to the
validator name checks in test_run_all_returns_eight_results, ensuring all eight
expected validators are explicitly verified.

---

Minor comments:
In
`@content/course/tech-for-non-technical-founders-2026/ai-persona-pre-validation-mom-test-prep/index.md`:
- Around line 33-43: Fix the Markdown blockquote continuity in the lesson
content by removing the blank lines or adding a `>` marker at the affected gaps
near the `Skip this if you've interviewed before.` and `Advanced` callouts,
ensuring each callout remains a continuous blockquote and passes MD028.

In
`@content/course/tech-for-non-technical-founders-2026/clickable-prototype-validation-2-hour-lovable/index.md`:
- Around line 40-42: Remove blank lines within the blockquote callouts in the
Markdown content, including the sections around the TL;DR and the locations
referenced at lines 130 and 386; either delete the empty lines or prefix them
with > so each callout renders as one continuous blockquote.
- Line 387: The Module 2 completion checklist in the closing statement must
clarify the interview gate: replace “10 interview transcripts scored 7+/10
strong signal” with wording that indicates ten transcripts were scored and at
least seven met the 7+/10 strong-signal threshold, consistent with the
documented 7-of-10 requirement.
- Line 129: Fix the malformed pricing prose in the “Practical Lovable onramp”
paragraph by removing the period before “and” and joining the clauses correctly,
or by starting a new sentence with “Paid plans”; preserve the existing meaning
about paid plans being optional for this chapter.

In
`@content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/index.md`:
- Line 39: Remove the blank line within the blockquote in the course content, or
prefix that line with “>” so the entire callout remains a single valid
blockquote.
- Line 203: Remove the stray double quote after the Reddinbox link in the
monitoring tools paragraph, leaving the sentence to continue directly with
“These tools surface the threads faster.”
- Line 199: In the “Upgrade the AI ICP map prompt with a deep-research tool”
section, soften the citation claim for Perplexity Pro and Gemini Deep Research
by replacing “return real-source citations for every claim” with wording that
says they typically return citations, while preserving the reminder to
spot-check each proposed community and collect reusable quote snippets.

In
`@content/course/tech-for-non-technical-founders-2026/find-10-people-with-problem-outreach-2026/index.md`:
- Around line 39-43: Remove the blank lines between the blockquoted TL;DR and
Part 2 paragraphs in the introductory callout, or prefix those lines with “>” so
the entire callout remains a valid contiguous Markdown blockquote.

In
`@content/course/tech-for-non-technical-founders-2026/five-tech-words-stop-nodding-at/index.md`:
- Line 37: Fix the subject–verb agreement in the opening paragraph: update “A
non-technical founder often learn” to use the singular verb “learns.”

In
`@content/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/index.md`:
- Around line 32-42: Fix the broken continuous blockquotes in the lesson content
by replacing the blank lines at the referenced callout sections, including the
area around “Where you are in the round” and lines 193–197, with standalone “>”
markers or removing the blank lines. Preserve all callout text and ensure each
blockquote renders as one continuous block.

In
`@content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/index.md`:
- Around line 39-41: Fix the blockquote formatting around the TL;DR callout by
removing blank lines inside the blockquote or prefixing those lines with “>”,
keeping the entire introductory callout as one continuous blockquote.
- Line 125: Remove the blank line within the blockquote near the “If blocked”
guidance, or prefix that line with “>”, so the callout remains valid Markdown.

In
`@content/course/tech-for-non-technical-founders-2026/one-page-product-brief-vibe-prd/index.md`:
- Line 65: Align the chapter reference in the surrounding section heading with
the linked validated problem statement in the “What goes in it” guidance,
ensuring both use the same authoritative chapter number.

In
`@content/course/tech-for-non-technical-founders-2026/outreach-sequence-template/index.md`:
- Line 81: The duration guidance conflicts with the bounded interview format.
Replace the “book 30 minutes, ask for 20” wording in the outreach sequence with
explicit guidance to reserve 20 minutes for the conversation and 5 minutes
afterward for scoring and wrap-up, emphasizing that calls should not run over.

In
`@content/course/tech-for-non-technical-founders-2026/three-questions-turn-standup-into-proof/index.md`:
- Line 50: Fix the subject–verb agreement in the opening sentence by changing
“inherit” to “inherits” for the singular subject “A non-technical founder.”

In
`@content/course/tech-for-non-technical-founders-2026/vibe-prd-template/index.md`:
- Line 27: Update the Chapter 2.1 label in the synthesis link description within
the Vibe PRD template to the current Chapter 2.5 designation, keeping the
existing link target unchanged.

---

Nitpick comments:
In `@lib/course_validators.rb`:
- Around line 343-367: Extract the hardcoded ratchet path in
check_banned_strings into a class constant named BANNED_STRINGS_PATH, and use
that constant instead of the local "data/course_banned_strings.yaml" value.
Update test setup and teardown to override and restore BANNED_STRINGS_PATH
alongside YAML_PATH, COURSE_DIR, and ALL_BLOG_DIR so tests use the temporary
fixture and exercise the missing-file fallback.

In `@test/unit/course_validators_test.rb`:
- Around line 347-388: Add behavior-focused tests for the banned-string-ratchet
result returned by CourseValidators.run_all: verify a configured phrase produces
a violation containing the phrase, scope filtering reports only matching chapter
slugs, and a missing banned-strings YAML file passes without crashing. Place
these alongside the existing run_all tests and identify the validator by its
result name, "banned-string-ratchet".
🪄 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: 6f87b6f0-dfdd-4379-a9b4-4db8352e95a1

📥 Commits

Reviewing files that changed from the base of the PR and between 90216d2 and 273eef1.

⛔ Files ignored due to path filters (2)
  • content/course/tech-for-non-technical-founders-2026/find-10-people-where-to-look/cover.png is excluded by !**/*.png
  • content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/cover.png is excluded by !**/*.png
📒 Files selected for processing (39)
  • content/course/tech-for-non-technical-founders-2026/_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/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/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/find-10-people-with-problem-outreach-2026/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/five-tech-words-stop-nodding-at/index.md
  • content/course/tech-for-non-technical-founders-2026/how-this-course-works/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/mom-test-ask-about-past-not-future/index.md
  • content/course/tech-for-non-technical-founders-2026/mom-test-interview-script/index.md
  • content/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/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/one-page-product-brief-vibe-prd/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/pivot-or-persevere-decision-framework/index.md
  • content/course/tech-for-non-technical-founders-2026/quickstart/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/should-you-hire-2026-decision-tree/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/validated-problem-statement-template/index.md
  • content/course/tech-for-non-technical-founders-2026/vibe-coding-ceiling-signals/index.md
  • content/course/tech-for-non-technical-founders-2026/vibe-prd-template/index.md
  • data/course_banned_strings.yaml
  • data/course_sequence.yaml
  • docs/projects/2605-tech-for-non-technical-founders/30-39-architecture-design/30.03-course-format-requirements-for-creators.md
  • docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.12-m2-release-gate-2026-07-09.md
  • docs/projects/2605-tech-for-non-technical-founders/40-49-review/40.13-retrospective-review-churn-2026-07-10.md
  • docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md
  • docs/projects/2605-tech-for-non-technical-founders/PROJECT-INDEX.md
  • docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md
  • lib/course_validators.rb
  • test/unit/course_validators_test.rb

Comment on lines +352 to 353
| Under 4 of 10 scored ≥7 | (any) | **KILL** - the problem is too weak for this ICP. Return to Ch 1.1 with a different customer or problem blank rewritten. |
| (any) | 0-1 of 5 passed | **STOP, don't proceed to M3** - the solution shape is fundamentally wrong; return to Ch 2.1 |

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

Resolve the overlapping decision-matrix outcomes.

A result with fewer than four strong interview signals and 0–1 prototype passes matches both rows: one says KILL and restart at Ch 1.1, while the other says STOP and return to Ch 2.1. Add an explicit precedence rule or split the conditions so learners receive one deterministic route.

🤖 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/clickable-prototype-validation-2-hour-lovable/index.md`
around lines 352 - 353, Resolve the overlapping outcomes in the decision matrix
by adding an explicit precedence rule or revising the conditions so each result
maps to exactly one route. Update the matrix near the “KILL” and “STOP, don't
proceed to M3” rows, prioritizing the appropriate action when both conditions
are true.

> "You signed up for the waitlist on [page] last Tuesday - up for a 20-minute call?"

Reply rates on that opener run 60%+ - the highest in this whole chapter.
That opener out-performs every cold variant - the person already raised a hand - the highest in this whole chapter.

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

Replace the unsupported absolute performance claim.

“Out-performs every cold variant” and “the highest in this whole chapter” cannot be established from the surrounding guidance. Use a qualified statement such as “often outperforms colder variants.”

🤖 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/find-10-people-with-problem-outreach-2026/index.md`
at line 135, Replace the unsupported absolute claims in the opener sentence with
qualified language, such as stating that it often outperforms colder variants
and may be among the strongest examples in the chapter.

| **You built for the wrong segment** | The product works, but the people you onboarded do not have the pain. Your Q5 slice shows: one segment is at 55%, the rest are at 5%. | Stop selling to the audience and start selling to the segment. | [Chapter 5.3a](/course/tech-for-non-technical-founders-2026/first-ten-customers-network-list/) personal-network outreach to the right segment. |
| **You built the right thing, but it is not finished** | The Q3 verbatims are hedged ("it is nice to have," "I would use it if it had X"). The main benefit answers lack conviction. | Go back into the build and finish the thing. | Schedule a [Friday demo](/course/tech-for-non-technical-founders-2026/friday-demo-rule-founder-progress/) with the next release. |
| **The pain is real, but your product is not the relief** | The Q4 verbatims name a workaround that is already 80% of the job (a spreadsheet, an existing tool, a person they pay). | Either niche into the 20% the workaround does not cover, or pivot. | [Chapter 2.1](/course/tech-for-non-technical-founders-2026/mom-test-ask-about-past-not-future/#synthesis-write-down-what-you-heard-decide-whats-next) validated-problem statement. |
| **The pain is real, but your product is not the relief** | The Q4 verbatims name a workaround that is already 80% of the job (a spreadsheet, an existing tool, a person they pay). | Either niche into the 20% the workaround does not cover, or pivot. | [Chapter 2.1](/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/) validated-problem statement. |

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

Correct the chapter label or destination URL.

The link points to mom-test-synthesis-build-pivot-kill, which is Lesson 2.5, but the visible label says “Chapter 2.1.” This sends readers to the right-looking artifact under the wrong lesson reference and breaks the revised numbering contract.

🤖 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`
at line 174, Correct the final table-cell reference in the PMF test lesson so
the visible chapter/lesson label matches the destination
`/course/tech-for-non-technical-founders-2026/mom-test-synthesis-build-pivot-kill/`;
update either the label or URL consistently, using the surrounding table row as
the edit location.

### 2. Self-serve build ([The Self-Serve MVP Stack](/course/tech-for-non-technical-founders-2026/self-serve-mvp-stack-lovable-supabase-stripe-2026/))

Pick this path when the problem is validated (10+ Mom Test interviews with ≥7 strong-signal scores per the Ch 2.1b synthesis rubric + a Ch 1.4 smoke test that cleared the 6%+ "Promising" band - pre-orders and paid pilots are produced LATER in Module 5, do not require them as the gate), the scope is one workflow for one persona, and the backend requirements are simple - no real-time collaboration, no complex refund flows, no compliance scope.
Pick this path when the problem is validated (10+ Mom Test interviews with ≥7 strong-signal scores per the Ch 2.5 synthesis rubric + a Ch 1.4 smoke test that cleared the 6%+ "Promising" band - pre-orders and paid pilots are produced LATER in Module 5, do not require them as the gate), the scope is one workflow for one persona, and the backend requirements are simple - no real-time collaboration, no complex refund flows, no compliance scope.

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 self-serve gate match the decision matrix.

This paragraph permits self-serve after interviews and the smoke test, while the Q1 definition below still requires a successful prototype run. The two rules can route the same founder differently. Add the current Ch 2.6 prototype criterion here, or remove it from Q1.

🤖 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/should-you-hire-2026-decision-tree/index.md`
at line 98, The self-serve gate conflicts with the Q1 definition because it
omits the required Ch 2.6 prototype criterion. Update the paragraph beginning
“Pick this path when” to include the current Ch 2.6 successful prototype-run
requirement, ensuring the gate matches the decision matrix; alternatively,
remove that requirement from Q1 so both rules are consistent.

|---|---|---|
| M1 (Hypothesis & Smoke Test) | 1.1 Hypothesis, 1.2a Build page, 1.2b Run test, 1.3 Price test | Validation tools field guide |
| M2 (Validate) | 2.1 Mom Test, 2.3a Find people, 2.3b Outreach, 2.4 Prototype | 2.2 AI Personas |
| M2 (Validate) | 2.1 Mom Test, 2.3 Find people, 2.4 Outreach, 2.4 Prototype | 2.2 AI Personas |

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

Update the Module 2 core-path numbering.

This row still lists 2.4 Prototype, but the revised sequence defines 2.5 as synthesis and 2.6 as the clickable prototype. It also omits the required build/pivot/kill decision step, leaving this architecture guidance inconsistent with data/course_sequence.yaml:79-86.

Proposed correction
-| M2 (Validate) | 2.1 Mom Test, 2.3 Find people, 2.4 Outreach, 2.4 Prototype | 2.2 AI Personas |
+| M2 (Validate) | 2.1 Mom Test, 2.3 Find people, 2.4 Outreach, 2.5 Synthesis, 2.6 Prototype | 2.2 AI Personas |
📝 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
| M2 (Validate) | 2.1 Mom Test, 2.3 Find people, 2.4 Outreach, 2.4 Prototype | 2.2 AI Personas |
| M2 (Validate) | 2.1 Mom Test, 2.3 Find people, 2.4 Outreach, 2.5 Synthesis, 2.6 Prototype | 2.2 AI Personas |
🤖 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/30-39-architecture-design/30.03-course-format-requirements-for-creators.md`
at line 385, Update the Module 2 “Validate” row to match the revised core-path
sequence: replace “2.4 Prototype” with “2.5 Synthesis” and “2.6 Clickable
Prototype,” and add the required build/pivot/kill decision step, matching the
ordering and naming in the course sequence definition.

Paul Keen and others added 10 commits July 9, 2026 22:40
Card 5 rect ends at y=890 but the viewBox was 880 tall, cutting the
card's bottom border (user-reported screenshot). Extended to 910.
Swept all course SVGs for the same content-past-viewBox defect - this
was the only instance.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mom-test-script.svg background rect kept the old 880 height after the
viewBox fix - Q5 card overhung the panel. Both now 910 (user-reported).
40.14 records the verified fan-out findings (65: 20 MAJOR/34 MINOR/11 NIT,
69 agents, adversarially verified) for the fix loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
External reader review triaged: adopted (1) expectation-setting - first
interviews will be awkward and you will accidentally pitch; normalized by
pointing at Mia's own 3/10 first call in the walkthrough; (2) the
no-story interviewee failure mode - end politely at 10 minutes and count
it as [customer]-blank data. Deferred: downloadable cheat sheet (already
tracked as the P1 PDF-templates backlog item; Interview Script page is
the printable card until then).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Second external review triaged. Most 'watch out' items were already
covered (politeness bias :127, generic-persona failure signal :214,
false-confidence warning :231, rehearsal-validates-questions-not-business)
- confirming the page. Adopted the two genuinely new pieces:
(1) GIGO gets an action, not just a warning - can't write 3 distinct
personas -> route back to 1.1 and tighten the [customer] blank;
(2) Objection Tracker gains the emotional-prep framing - having sat with
an objection in rehearsal, you take notes instead of getting defensive
and pitching when a real customer raises it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Four more external reviews triaged (2.3, 2.4, 2.5, 2.6). Nearly all
points confirmed existing content (pattern-vs-average, pre-order test,
silent observation, be-human-first etiquette, throwaway discipline).
Adopted the two genuinely new pieces: (1) 2.3 perfectionism time-box -
day three still polishing the list means stop; 25 good rows now beat 30
perfect rows next week; (2) 2.4 outreach-anxiety reframe - you ask people
about their own expertise, more are flattered than bothered. Skipped:
2.5 'why now' timing factor (gate scope expansion - backlog candidate).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…view-flow diagram

Six parallel fixers with disjoint file ownership worked the full 40.14
punch list; every finding FIXED or skipped-with-reason (stale/other-owner):

- M1 boundary: 1.1 no longer instructs pitching the hypothesis in
  interviews (Module 2 uses it to pick who/what, never read aloud);
  1.4's Promising band restores the 1.4→1.5→2.1 spine; "3 ICP
  characteristics from Ch 1.1" softened everywhere to deriving from the
  [customer] blank (which 1.1 actually produces)
- 2.5/2.6 routing seams: BUILD routes through 2.6 then 3.1 in flowchart,
  body, and template checkbox; KILL has ONE destination (1.1 → 2.3)
  across flowchart/body/Next; 2.6's Input/Progress now carry 2.5's
  decision + validated problem statement
- wrong instructions: 2.6 step 1 uses its own 3-screen prompt (was 2.2's
  persona prompt); 2.4's Output books calls (no phantom transcripts);
  FAQ's binary "Directional KILL" now the 7+/4-6/<4 gate
- sweep damage: Reddinbox fragment and orphaned Lovable clause rewritten;
  "Sam" persona leak removed (2.6 + ratchet caught 2 more in M3/M4
  chapters); "47-button" fake-specific broken across 2 files
- claims/consistency: Stripe Tax false "launching Q1 2026" claim fixed;
  Apollo credit hardcodes → capability language; session-length and
  pre-order-count contradictions unified; HTCW M2 time honest (~3-5 wks);
  yaml 2.4 goal closes the funnel arithmetic
- interview-flow mermaid compressed 1881px → 971px (Q2-Q5 collapsed to
  one node, diamonds → compact rects) per the 2x-viewport rule

Ratchet grew 17 → 25 signatures; the new entries immediately caught 3
instances outside M2 scope (fixed). Out-of-scope note: "Artifact #N of 6"
labels in 3.1/4.3b/5.4 renumber in their module sprints.

Gates: all 8 validators pass; bin/rake test:critical green (46 runs,
0 failures; 84 screenshots, no diffs); production link sweep clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TASK-TRACKER/PROJECT-INDEX/GOAL-AT-A-GLANCE updated: M2 v2 migration
complete (flattened 2.1-2.6, walkthrough, all review rounds closed,
regression ratchet live, 8 reader-review adoptions); 40.14 marked ALL
FIXED; carry-forwards recorded (artifact-label renumbering in M3-M5
sprints, word-band decision, 'why now' backlog idea). Next stream: M3.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 2.4 goal update (30-name list -> 10 booked interviews, expand-if-thin)
was applied in the working tree during the M2 sprint but never committed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Supersedes the stale '2 chapters -> ~3 micro-lessons' plan: 1:1 lesson
mapping (no splits), Mia walkthrough, vibe-prd-template companion
alignment, 5 known defects pre-listed, 40.06-grounded content
improvements in/out of scope, 40.13 ratchet discipline + ordered gates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
I1-I3 from 40.06 friction (3.2 hook reframe, AI-critic manual fallback,
explicit Done gate); I4-I5 from documented content-organization rules
(2-forks decision table, first-fold hero check). Each with exact landing
spot, wired into the ordered steps; backlog rows closed by the sprint
noted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
@pftg pftg merged commit 0e6a899 into master Jul 10, 2026
3 checks passed
@pftg pftg deleted the module-2-validate-the-problem branch July 10, 2026 03:23
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