Enable Clarity for course pilot + exclude analytics from local/test builds + un-gated board sync - #407
Conversation
…ics from local/test builds - microsoftClarity = xum05dgnec (project created by Paul 2026-07-30) - baseof.html gates the analytics partial on baseURL containing jetthoughts.com: dev (1313) and test (1314) builds never inject tracking - Clarity snippet additionally hostname-guards localhost/LAN at runtime - macOS mobile homepage baseline re-recorded per #405's note (intentional 28px hero gap below 860px; diff confined to the shifted photo). Linux baseline re-record follows in this same PR via bin/dtest. - Board sync: PILOT GATE REMOVED (Paul 2026-07-31) - TASK-TRACKER queue rewritten as Waves 0/A-H; runbook 20.12 + GOAL + 20.07 statuses synced - Test policy: bin/qtest --changed is the routine gate; bin/test+bin/dtest once at PR prep (CLAUDE.md, AGENTS.md, .okf/build/test-gates.md) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
|
Warning Review limit reached
Next review available in: 52 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the 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 configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe change updates test workflow guidance, documents committed snapshot baselines, restricts analytics to production hosts, adds Microsoft Clarity configuration, and refreshes course publishing, growth, project status, and task-tracking records. ChangesTesting workflow
Production analytics gating
Project status records
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
There was a problem hiding this comment.
Actionable comments posted: 9
🧹 Nitpick comments (1)
docs/projects/2605-tech-for-non-technical-founders/20-29-strategy/20.12-course-growth-agent-runbook.md (1)
4-4: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winWrap the status line to 80 columns.
Line 4 exceeds the repository line-length limit. Split the Markdown status
across lines without changing its content.As per coding guidelines, keep each output line at 80 characters or fewer.
🤖 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/20-29-strategy/20.12-course-growth-agent-runbook.md` at line 4, Wrap the status text in the document so every output line is 80 characters or fewer, preserving the exact wording, punctuation, and Markdown content without changing the status information.Source: Coding guidelines
🤖 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 @.okf/build/test-gates.md:
- Line 13: Update the `bin/qtest --changed` description in the test-gates table
to state that affected-page desktop and mobile screenshot tests are guaranteed,
while additional random non-scoped tests may also run within the remaining
budget; preserve the existing orphan guard, color-system check, and escalation
details.
In `@CLAUDE.md`:
- Line 125: Update the “Visual regression test gate (BLOCKING for
HTML/CSS/template changes)” rule in CLAUDE.md to include standalone JavaScript
changes, matching the guideline that any *.html, *.css, or *.js edit requires
bin/qtest --changed. Preserve the existing required test and baseline
instructions while expanding the covered file scope.
- Around line 119-125: Standardize the test schedule across CLAUDE.md lines
119-125 and 82, AGENTS.md line 52, and .okf/build/test-gates.md lines 14-16:
resolve the adjacent per-commit gate conflict, align routine and milestone
triggers, and remove or update the conflicting pre-commit critical-suite
requirement so all policy files specify the same commands and timing.
In
`@docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md`:
- Line 187: Replace the stale slug in the NEW-M content-plan row with
salvage-vs-rebuild-decision-tree, and update the same slug in all related
planning artifacts so every reference uses the live course path.
In
`@docs/projects/2605-tech-for-non-technical-founders/20-29-strategy/20.12-course-growth-agent-runbook.md`:
- Around line 16-20: Synchronize the measurement policy in this runbook with the
current GA4 + Clarity state by updating remaining GA4-only or denied-by-default
statements, including the relevant analytics.html consent configuration and
TASK-TRACKER.md Clarity status, or clearly labeling those statements as
historical while preserving the current pilot policy.
In `@docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md`:
- Around line 7-8: Reflow the changed metadata in
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md lines 7-8
so every output line is 80 characters or fewer, preserving all status content.
Apply the same wrapping to
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md lines 3-5,
with no content changes.
- Around line 7-9: Align the canonical Clarity decision across all three sites:
update docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md
lines 7-9 to state the current status, remove the stale GA4-only decision from
lines 14-31, and update
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md lines 3-5 to
retain the same analytics decision.
- Around line 33-47: The execution records have conflicting pilot-gate statuses.
In docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md lines
33-47, update the ordered actions so campaign execution and related work remain
pilot-gated while preserving only explicit un-gated exceptions; in
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md lines 38-45,
align campaign and lead-bridge statuses; and in lines 303-319, distinguish
shipped campaign briefs from their still-gated execution.
In `@themes/beaver/layouts/baseof.html`:
- Line 17: Replace the substring check in themes/beaver/layouts/baseof.html at
lines 17-17 with an exact production-host allowlist check. Update the browser
gate in themes/beaver/layouts/partials/page/analytics.html at lines 6-13 to load
Clarity only when the verified hostname is the exact production host and the
protocol is HTTPS, rejecting private, loopback, link-local, IPFS-style, empty,
and file:// hosts; ensure both analytics gates use the same production-host
policy.
---
Nitpick comments:
In
`@docs/projects/2605-tech-for-non-technical-founders/20-29-strategy/20.12-course-growth-agent-runbook.md`:
- Line 4: Wrap the status text in the document so every output line is 80
characters or fewer, preserving the exact wording, punctuation, and Markdown
content without changing the status information.
🪄 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 Plus
Run ID: 0a0bc474-c098-40ab-b9f8-1593e4cb16a8
⛔ Files ignored due to path filters (2)
test/fixtures/screenshots/linux/mobile/homepage.pngis excluded by!**/*.pngtest/fixtures/screenshots/macos/mobile/homepage.pngis excluded by!**/*.png
📒 Files selected for processing (11)
.okf/build/test-gates.md.okf/log.mdAGENTS.mdCLAUDE.mdconfig/_default/hugo.tomldocs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.mddocs/projects/2605-tech-for-non-technical-founders/20-29-strategy/20.12-course-growth-agent-runbook.mddocs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.mddocs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.mdthemes/beaver/layouts/baseof.htmlthemes/beaver/layouts/partials/page/analytics.html
| @@ -12,8 +12,8 @@ timestamp: 2026-07-30T00:00:00Z | |||
| |---|---|---| | |||
| | `bin/qtest --changed` | Scoped visual gate: builds once (~11s), runs ONLY affected pages' desktop+mobile screenshot tests (~2.5s each) + orphan guard + color-system check; site-wide/unmapped files auto-escalate to the full critical suite | Per micro-commit inside a sprint (~25-60s); NOT a substitute for the milestone/PR gates below | | |||
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Describe the extra tests run by bin/qtest --changed.
bin/qtest:4-22 runs affected-page tests first, then uses leftover budget
for random non-scoped tests. Replace “ONLY affected pages” with wording that
states affected pages are guaranteed and additional random tests may run.
🤖 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 @.okf/build/test-gates.md at line 13, Update the `bin/qtest --changed`
description in the test-gates table to state that affected-page desktop and
mobile screenshot tests are guaranteed, while additional random non-scoped tests
may also run within the remaining budget; preserve the existing orphan guard,
color-system check, and escalation details.
| - **Zero ad hoc test scripts**: Use repo-provided test commands: `bin/qtest --changed` (routine), `bin/rake test:critical` (milestones), `bin/test`/`bin/dtest` (PR prep only) | ||
| - **No Python scripts for analysis**: Prefer `rg`, `sed`, `awk`, and shell tools | ||
| - **Zero tolerance for duplicates**: No `*_refactored.*`, `*_new.*`, `*_backup.*` files | ||
| - **New-doc locations (3 layers)**: (1) **company** things that persist across every opportunity — vision/mission, the operating system, the opportunity portfolio — live in `docs/business/`; (2) a **project** validating one opportunity/initiative gets its own `docs/projects/<YYMM-slug>/` folder (dated-slug convention: 2509/2510/2604/2605/2607); (3) reusable **process how-tos** go under `docs/workflows/`. Everything else edits an existing file. Do NOT put the business/OS under `docs/workflows/` (how-tos only) or collapse the company layer into a single project — the company OS runs ALL projects, and one bet is "Validating" at a time (flagged 2026-07-22: the Vibe Code Rescue OS first landed in workflows/, then wrongly nested the whole business inside project 2607; the company layer now lives in `docs/business/` with 2607 as portfolio bet #1). | ||
| - **Reflection triggers**: User reports "code is bad" / "over-engineered" → HALT, 5-Why analysis, fix config, THEN proceed | ||
| - **Mandatory self-critique on voice-sensitive content (BLOCKING)**: For any draft or revision of LinkedIn posts, blog posts, or marketing copy, invoke `reflexion-reflect` (Standard Path) BEFORE first handback. After user pushback on the same draft, escalate to `reflexion-critique` (multi-judge debate) per the LinkedIn pipeline §3 / blog pipeline equivalent. Solo iteration past first delivery consistently misses pattern-level tells (over-narration, cinematic beat-marking, shape-coded copywriting) — observed on the 2026-05-11 Monday Jira-not-progress post (5 user corrections after the AI rubric scored 0/10). | ||
| - **Visual regression test gate (BLOCKING for HTML/CSS/template changes)**: After ANY edit to `themes/`, `layouts/`, `content/blog/*/index.md` body HTML, or `*.css`, run BOTH `bin/test` (macOS host) AND `bin/dtest` (Linux/Docker) BEFORE committing. They write to separate baseline dirs (`test/fixtures/screenshots/macos/` vs `linux/`) and CI runs Linux — skipping `bin/dtest` ships a green PR locally that breaks the build. The 35-failure incident on 2026-04-30 happened because Sprints #2/#3 shipped 15 commits without running it once — and the failing tests caught a real `.fl-button` regression Sprint #3 missed. Visual regression failures are NOT optional warnings; they are commit blockers. Either fix the regression OR confirm the change is intentional AND update baselines (both macos/ AND linux/) in the same commit. "I'll run tests after a few commits" is the path that lets unfixed bugs ship. | ||
| - **Visual regression test gate (BLOCKING for HTML/CSS/template changes)**: After ANY edit to `themes/`, `layouts/`, `content/blog/*/index.md` body HTML, or `*.css`, run `bin/qtest --changed` BEFORE committing (Paul 2026-07-31: qtest is the routine gate for simplicity). The FULL pair — `bin/test` (macOS host) AND `bin/dtest` (Linux/Docker) — runs ONCE at PR-preparation time (branch head, before `gh pr create`) or when Paul explicitly confirms; they write to separate baseline dirs (`test/fixtures/screenshots/macos/` vs `linux/`) and CI runs Linux, so a PR must never open without the dtest leg. The 35-failure incident on 2026-04-30 happened because Sprints #2/#3 shipped 15 commits without a visual gate at all — and the failing tests caught a real `.fl-button` regression Sprint #3 missed. Visual regression failures are NOT optional warnings; they are commit blockers. Either fix the regression OR confirm the change is intentional AND update baselines (both macos/ AND linux/) in the same commit. Baselines compare against **git HEAD, not the working tree** — an un-committed "accepted" PNG changes nothing, and an identical difference_level across runs means a stale committed baseline, not a flaky render. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Use one test schedule across all policy files.
The documents currently define different triggers for the critical suite and
the full visual pair. This can cause missed coverage or unnecessary full-suite
runs.
CLAUDE.md#L119-L125: Resolve the conflict with the adjacent
per-commit gate instruction.AGENTS.md#L52-L52: Match the key-command schedule to the selected policy.CLAUDE.md#L82-L82: Align the routine and milestone triggers..okf/build/test-gates.md#L14-L16: Remove the conflicting pre-commit
critical-suite requirement, or update the other policy files.
🧰 Tools
🪛 LanguageTool
[uncategorized] ~125-~125: The operating system from Apple is written “macOS”.
Context: ...; they write to separate baseline dirs (test/fixtures/screenshots/macos/ vs linux/) and CI runs Linux, so a ...
(MAC_OS)
📍 Affects 3 files
CLAUDE.md#L119-L125(this comment)AGENTS.md#L52-L52CLAUDE.md#L82-L82.okf/build/test-gates.md#L14-L16
🤖 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 `@CLAUDE.md` around lines 119 - 125, Standardize the test schedule across
CLAUDE.md lines 119-125 and 82, AGENTS.md line 52, and .okf/build/test-gates.md
lines 14-16: resolve the adjacent per-commit gate conflict, align routine and
milestone triggers, and remove or update the conflicting pre-commit
critical-suite requirement so all policy files specify the same commands and
timing.
| - **Reflection triggers**: User reports "code is bad" / "over-engineered" → HALT, 5-Why analysis, fix config, THEN proceed | ||
| - **Mandatory self-critique on voice-sensitive content (BLOCKING)**: For any draft or revision of LinkedIn posts, blog posts, or marketing copy, invoke `reflexion-reflect` (Standard Path) BEFORE first handback. After user pushback on the same draft, escalate to `reflexion-critique` (multi-judge debate) per the LinkedIn pipeline §3 / blog pipeline equivalent. Solo iteration past first delivery consistently misses pattern-level tells (over-narration, cinematic beat-marking, shape-coded copywriting) — observed on the 2026-05-11 Monday Jira-not-progress post (5 user corrections after the AI rubric scored 0/10). | ||
| - **Visual regression test gate (BLOCKING for HTML/CSS/template changes)**: After ANY edit to `themes/`, `layouts/`, `content/blog/*/index.md` body HTML, or `*.css`, run BOTH `bin/test` (macOS host) AND `bin/dtest` (Linux/Docker) BEFORE committing. They write to separate baseline dirs (`test/fixtures/screenshots/macos/` vs `linux/`) and CI runs Linux — skipping `bin/dtest` ships a green PR locally that breaks the build. The 35-failure incident on 2026-04-30 happened because Sprints #2/#3 shipped 15 commits without running it once — and the failing tests caught a real `.fl-button` regression Sprint #3 missed. Visual regression failures are NOT optional warnings; they are commit blockers. Either fix the regression OR confirm the change is intentional AND update baselines (both macos/ AND linux/) in the same commit. "I'll run tests after a few commits" is the path that lets unfixed bugs ship. | ||
| - **Visual regression test gate (BLOCKING for HTML/CSS/template changes)**: After ANY edit to `themes/`, `layouts/`, `content/blog/*/index.md` body HTML, or `*.css`, run `bin/qtest --changed` BEFORE committing (Paul 2026-07-31: qtest is the routine gate for simplicity). The FULL pair — `bin/test` (macOS host) AND `bin/dtest` (Linux/Docker) — runs ONCE at PR-preparation time (branch head, before `gh pr create`) or when Paul explicitly confirms; they write to separate baseline dirs (`test/fixtures/screenshots/macos/` vs `linux/`) and CI runs Linux, so a PR must never open without the dtest leg. The 35-failure incident on 2026-04-30 happened because Sprints #2/#3 shipped 15 commits without a visual gate at all — and the failing tests caught a real `.fl-button` regression Sprint #3 missed. Visual regression failures are NOT optional warnings; they are commit blockers. Either fix the regression OR confirm the change is intentional AND update baselines (both macos/ AND linux/) in the same commit. Baselines compare against **git HEAD, not the working tree** — an un-committed "accepted" PNG changes nothing, and an identical difference_level across runs means a stale committed baseline, not a flaky render. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Include standalone JavaScript in the blocking test rule.
This rule lists themes/, layouts/, content-body HTML, and CSS, but it
omits JavaScript files outside those directories. Add the JavaScript scope
or document a deliberate exception.
As per coding guidelines, **/*.{html,css,js} requires
bin/qtest --changed after any HTML, CSS, or JavaScript change.
🧰 Tools
🪛 LanguageTool
[uncategorized] ~125-~125: The operating system from Apple is written “macOS”.
Context: ...; they write to separate baseline dirs (test/fixtures/screenshots/macos/ vs linux/) and CI runs Linux, so a ...
(MAC_OS)
🤖 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 `@CLAUDE.md` at line 125, Update the “Visual regression test gate (BLOCKING for
HTML/CSS/template changes)” rule in CLAUDE.md to include standalone JavaScript
changes, matching the guideline that any *.html, *.css, or *.js edit requires
bin/qtest --changed. Preserve the existing required test and baseline
instructions while expanding the covered file scope.
Source: Coding guidelines
| | **NEW-K** | **2026-05-17** | **🧑💼 Founders / Control** | **Who Owns Your GitHub, AWS, and Database?** | **`github-aws-database-ownership-checklist`** | **47/50** | **✅ LIVE as course chapter (2026-07-30 G3 audit: /blog/ alias redirects into the course; link to it, do not redraft)** | | ||
| | **NEW-L** | **2026-05-24** | **🧑💼 Founders / Control** | **Cheap Developers Are Expensive When Nobody Senior Reviews the Code** | **`cheap-developers-expensive-without-cto-review`** | **44/50** | **🔲 Planned - next 5 #4 (client research: student/freelancer trap, Fractional CTO guardrails)** | | ||
| | **NEW-M** | **2026-05-27** | **🧑💼 Founders / Rescue** | **Should You Salvage the Codebase or Rebuild?** | **`salvage-vs-rebuild-software-project`** | **45/50** | **🔲 Planned - next 5 #5 (client research: independent audit decision tree)** | | ||
| | **NEW-M** | **2026-05-27** | **🧑💼 Founders / Rescue** | **Should You Salvage the Codebase or Rebuild?** | **`salvage-vs-rebuild-software-project`** | **45/50** | **✅ LIVE as course chapter (2026-07-30 G3 audit: /blog/ alias redirects into the course; link to it, do not redraft) - slug changed to `salvage-vs-rebuild-decision-tree`** | |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Relevant plan entry:"
if [ -f docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md ]; then
sed -n '180,192p' docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md | nl -ba -v179
else
echo "Plan file missing"
fi
echo
echo "Repository references to both slug forms:"
rg -n "salvage-vs-rebuild-(software-project|decision-tree)|salvage-vs-rebuild-software-project|salvage-vs-rebuild-decision-tree" . || true
echo
echo "Check current git status/diff stat:"
git diff --stat || true
echo
echo "Find possible content/redirect files mentioning salvage:"
git ls-files | rg -i "(salvage|rebuild|redirects|alias|_redirects|sitemap|content)" | head -200Repository: jetthoughts/jetthoughts.github.io
Length of output: 232
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Relevant plan entry:"
if [ -f docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md ]; then
sed -n '180,192p' docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md
else
echo "Plan file missing"
fi
echo
echo "Repository references to both slug forms:"
if command -v rg >/dev/null 2>&1; then
rg -n "salvage-vs-rebuild-(software-project|decision-tree)|salvage-vs-rebuild-software-project|salvage-vs-rebuild-decision-tree" . || true
elif command -v grep >/dev/null 2>&1; then
grep -RInE "salvage-vs-rebuild-(software-project|decision-tree)|salvage-vs-rebuild-software-project|salvage-vs-rebuild-decision-tree" . || true
else
echo "rg/grep unavailable"
fi
echo
echo "Check current git status/diff stat:"
git diff --stat || true
echo
echo "Find possible content/redirect files mentioning salvage:"
if command -v git ls-files >/dev/null 2>&1; then
git ls-files | grep -iE "(salvage|rebuild|redirects|alias|_redirects|sitemap|content)" | head -200 || true
fiRepository: jetthoughts/jetthoughts.github.io
Length of output: 26209
Update the stale planning slug.
The live course page uses salvage-vs-rebuild-decision-tree, but this row still shows salvage-vs-rebuild-software-project. Replace the table slug and update the matching references in the related planning artifacts before merging so links keep using the live path.
Proposed correction
-| **NEW-M** | ... | **`salvage-vs-rebuild-software-project`** | ... |
+| **NEW-M** | ... | **`salvage-vs-rebuild-decision-tree`** | ... |📝 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.
| | **NEW-M** | **2026-05-27** | **🧑💼 Founders / Rescue** | **Should You Salvage the Codebase or Rebuild?** | **`salvage-vs-rebuild-software-project`** | **45/50** | **✅ LIVE as course chapter (2026-07-30 G3 audit: /blog/ alias redirects into the course; link to it, do not redraft) - slug changed to `salvage-vs-rebuild-decision-tree`** | | |
| | **NEW-M** | **2026-05-27** | **🧑💼 Founders / Rescue** | **Should You Salvage the Codebase or Rebuild?** | **`salvage-vs-rebuild-decision-tree`** | **45/50** | **✅ LIVE as course chapter (2026-07-30 G3 audit: /blog/ alias redirects into the course; link to it, do not redraft) - slug changed to `salvage-vs-rebuild-decision-tree`** | |
🤖 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/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md`
at line 187, Replace the stale slug in the NEW-M content-plan row with
salvage-vs-rebuild-decision-tree, and update the same slug in all related
planning artifacts so every reference uses the live course path.
| 2. **Measurement = GA4 + Clarity.** (History: Clarity was waived earlier on | ||
| 2026-07-30, then Paul created project xum05dgnec the same evening - | ||
| waiver superseded.) Session recordings ARE available for the pilot. | ||
| Analytics never load on local dev or test builds (baseURL gate in | ||
| baseof.html). |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Synchronize the new measurement policy with the remaining records.
This change says GA4 + Clarity, but this file still describes a GA4-only,
denied-by-default state. analytics.html Lines 29-31 now grant analytics
storage. The tracker at
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md
Lines 145-153 also says Clarity is waived and unset. Update these records or
mark the older text as historical.
🤖 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/20-29-strategy/20.12-course-growth-agent-runbook.md`
around lines 16 - 20, Synchronize the measurement policy in this runbook with
the current GA4 + Clarity state by updating remaining GA4-only or
denied-by-default statements, including the relevant analytics.html consent
configuration and TASK-TRACKER.md Clarity status, or clearly labeling those
statements as historical while preserving the current pilot policy.
| **Last updated**: 2026-07-30 EOD (9 PRs merged in one day: completion mechanics C1, media waves M1-M5a/b, growth waves G1-G3 per the 20.12 runbook, GA4 consent root-cause fix) | ||
| **Status**: 🟢 Course LIVE and CONTENT-COMPLETE on v2 · all 5 modules migrated (PRs #345/#351/#352/#353, deployed via #356) · review-clean (40.15/40.17/40.19) · instrumented (GA4-only - Clarity waived 2026-07-30; consent fix in #402 unmutes the funnel) · completion mechanics + media waves + growth waves shipped · 🔄 Active: external validation pilot (recruitment = the one human item) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Apply the 80-character rule to changed status lines.
Both files add long metadata lines. Reflow them without changing the status
content.
GOAL-AT-A-GLANCE.mdLines 7-8: wrap the metadata.TASK-TRACKER.mdLines 3-5: wrap the metadata.
As per coding guidelines, keep each output line at 80 characters or fewer.
📍 Affects 2 files
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md#L7-L8(this comment)docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md#L3-L5
🤖 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/GOAL-AT-A-GLANCE.md`
around lines 7 - 8, Reflow the changed metadata in
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md lines 7-8
so every output line is 80 characters or fewer, preserving all status content.
Apply the same wrapping to
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md lines 3-5,
with no content changes.
Source: Coding guidelines
| **Last updated**: 2026-07-30 EOD (9 PRs merged in one day: completion mechanics C1, media waves M1-M5a/b, growth waves G1-G3 per the 20.12 runbook, GA4 consent root-cause fix) | ||
| **Status**: 🟢 Course LIVE and CONTENT-COMPLETE on v2 · all 5 modules migrated (PRs #345/#351/#352/#353, deployed via #356) · review-clean (40.15/40.17/40.19) · instrumented (GA4-only - Clarity waived 2026-07-30; consent fix in #402 unmutes the funnel) · completion mechanics + media waves + growth waves shipped · 🔄 Active: external validation pilot (recruitment = the one human item) | ||
| **Owner**: JT content team |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Align the Clarity status across both project records.
The records disagree about whether Clarity is waived or configured. Keep one
canonical status before the pilot uses these instructions.
GOAL-AT-A-GLANCE.mdLines 7-9: record the current Clarity status.GOAL-AT-A-GLANCE.mdLines 14-31: remove the stale GA4-only decision.TASK-TRACKER.mdLines 3-5: retain the same analytics decision.
📍 Affects 2 files
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md#L7-L9(this comment)docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md#L14-L31docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md#L3-L5
🤖 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/GOAL-AT-A-GLANCE.md`
around lines 7 - 9, Align the canonical Clarity decision across all three sites:
update docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md
lines 7-9 to state the current status, remove the stale GA4-only decision from
lines 14-31, and update
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md lines 3-5 to
retain the same analytics decision.
| **Next high-overview actions, in order:** | ||
|
|
||
| 1. **External validation pilot (P0, Sprint A #2)** - recruit 3-5 real | ||
| idea-stage founders, watch Clarity recordings, find where they stall. | ||
| Kit: `40-49-review/40.18-*pilot-kit*`. Blocked on Paul's desk only | ||
| (Clarity project + consent posture + budget + calendar); everything else | ||
| is agent-prepped. This gates almost everything downstream. | ||
| 2. **Media + completion waves (P1, agent-doable in parallel with | ||
| recruitment lag)** - order M1 -> C1 -> M2 -> M3 -> M4 in TASK-TRACKER: | ||
| Wave M1 = SVGs for the 4 core lessons with zero inline visual; **NEW Wave | ||
| C1 (2026-07-30) = completion mechanics** - 20-min first-win path on | ||
| overview/1.1, tool-stack tables deferred to just-in-time, | ||
| implementation-intention lines, Clarity-gated localStorage progress | ||
| tracker, living-document trust line. Then decision-aid retrofits (now | ||
| incl. the mis-titled salvage-vs-rebuild "tree" + where-to-hire "map" and | ||
| the 4 worst word-walls), printable PDFs (scaffolded: filled Mia example | ||
| first, never blank forms), mobile-legibility investigation. | ||
| Definition-of-done includes the visual scroll gate + Comic Sans text | ||
| budgets + words-per-visual <= ~600. | ||
| Rationale: 2026-07-30 review of Product Compass courses + 57-source | ||
| learning-research corpus + Sam/pedagogy persona synthesis - the | ||
| completion gap is progress mechanics, not media. Public certificate | ||
| REJECTED (stealth-stage ICP won't share); private Founder OS pack is the | ||
| Phase-2 completion artifact, gated on pilot demand. | ||
| 3. **Sprint D demand-driven fixes** - only what pilot recordings surface | ||
| (plus the pre-groomed 10.08 content-gap batch, the reference-tier | ||
| visual/cover gap, and the Module-2 applied-checkpoint experiment). Do not | ||
| guess; the pilot data decides. | ||
| 4. **Distribution prep** - blog funnel per 2510/20.07 + LinkedIn campaign. | ||
| Gated on the pilot confirming the course converts readers, not before. | ||
| 1. **External validation pilot (P0)** - recruit 3-5 real idea-stage | ||
| founders per the `40-49-review/40.18-*pilot-kit*`. The ONLY human item: | ||
| recruitment + consent posture + budget + calendar. Stall diagnosis = | ||
| GA4 funnel drop-offs + founder debriefs (no session recordings - Clarity | ||
| waived). This gates everything in item 3. | ||
| 2. **Remaining agent queue (not gated)** - see TASK-TRACKER "Open queue": | ||
| M5c reference-tier visuals (5 chapters), ~19-cover batch, G2.2 SERP | ||
| spot-check, post-deploy GA4 re-verification (#402 must show 2xx collect | ||
| hits + course_pdf_download / course_copy_share_link landing). | ||
| 3. **Pilot-gated (do not start)** - campaign-brief execution (16 briefs | ||
| ready), Sprint D content-gap batch, Phase 2 (Module-2 applied checkpoint, | ||
| private Founder OS pack, localStorage progress tracker - deferred by 2-1 | ||
| vote), reader->JT-lead bridge. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Align the pilot-gate status across the execution records.
The queue says the work is un-gated, while the G1-G3 record and overview say
campaign work remains pilot-gated. Use one status and preserve only explicit
exceptions.
GOAL-AT-A-GLANCE.mdLines 33-47: update the ordered action sequence.TASK-TRACKER.mdLines 38-45: update campaign and lead-bridge status.TASK-TRACKER.mdLines 303-319: distinguish shipped briefs from execution.
📍 Affects 2 files
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md#L33-L47(this comment)docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md#L38-L45docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md#L303-L319
🤖 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/GOAL-AT-A-GLANCE.md`
around lines 33 - 47, The execution records have conflicting pilot-gate
statuses. In
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md lines
33-47, update the ordered actions so campaign execution and related work remain
pilot-gated while preserving only explicit un-gated exceptions; in
docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md lines 38-45,
align campaign and lead-bridge statuses; and in lines 303-319, distinguish
shipped campaign briefs from their still-gated execution.
| {{/* Analytics (GA4 + Clarity) load ONLY on the real production host - | ||
| local dev (localhost:1313), test builds (localhost:1314), and any | ||
| other baseURL never inject tracking. */}} | ||
| {{ if strings.Contains site.BaseURL "jetthoughts.com" }} |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== files =="
git ls-files | rg '(^themes/beaver/layouts/baseof\.html$|^themes/beaver/layouts/partials/page/analytics\.html$|$okf$|\.okf/|docs/90-99-content-strategy/strategy-analysis/90\.10-icp-primary-website-target\.md)' || true
echo
echo "== baseof =="
if [ -f themes/beaver/layouts/baseof.html ]; then
nl -ba themes/beaver/layouts/baseof.html | sed -n '1,80p'
fi
echo
echo "== analytics partial =="
if [ -f themes/beaver/layouts/partials/page/analytics.html ]; then
nl -ba themes/beaver/layouts/partials/page/analytics.html | sed -n '1,80p'
fi
echo
echo "== related refs =="
rg -n "microsoftClarity|Clarity|clarity|jetthoughts\.com|BaseURL|analytics\.html|site\.BaseURL" -S . --glob '!node_modules/**' --glob '!dist/**' --glob '!public/**' | head -200 || true
echo
echo "== static check via read-only python =="
python3 - <<'PY'
from pathlib import Path
import re
baseof = Path("themes/beaver/layouts/baseof.html").read_text()
analytics = Path("themes/beaver/layouts/partials/page/analytics.html").read_text() if Path("themes/beaver/layouts/partials/page/analytics.html").exists() else ""
checks = ["strings.Contains site.BaseURL \"jetthoughts.com\"", "strings.HasPrefix site.BaseURL", "strings.HasPrefix site.BaseURL", ".Hostname()"]
print("baseof_contains_jt=" + str("strings.Contains site.BaseURL \"jetthoughts.com\"" in baseof))
print("baseof_has_hostname_check=" + any(x in baseof for x in [".Hostname()", ".Host"]))
if analytics:
print("analytics_has_denylist=" + bool(re.search(r"^(localhost|127\\\\.|192\\.168\\.|0\\.0\\.0\\.0)/", analytics, re.M)))
print("analytics_has_https_check=" + bool(re.search(r"\n\s*if\s*\(\s*!location\.protocol\s*[!=]=\s*['\"]https:", analytics)))
PYRepository: jetthoughts/jetthoughts.github.io
Length of output: 1605
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== baseof first 120 lines =="
awk '{printf "%7d: %s\n", NR, $0}' themes/beaver/layouts/baseof.html | sed -n '1,120p'
echo
echo "== analytics partial first 120 lines =="
awk '{printf "%7d: %s\n", NR, $0}' themes/beaver/layouts/partials/page/analytics.html | sed -n '1,120p'
echo
echo "== related refs =="
rg -n "microsoftClarity|Clarity|clarity|jetthoughts\.com|BaseURL|analytics\.html|site\.BaseURL|localhost|127\." -S . --glob '!node_modules/**' --glob '!dist/**' --glob '!public/**' | head -240 || true
echo
echo "== static gate shape probe =="
python3 - <<'PY'
from pathlib import Path
import re
baseof = Path("themes/beaver/layouts/baseof.html").read_text()
analytics = Path("themes/beaver/layouts/partials/page/analytics.html").read_text() if Path("themes/beaver/layouts/partials/page/analytics.html").exists() else ""
print("baseof_contains_jetthoughts=", "strings.Contains site.BaseURL \"jetthoughts.com\"" in baseof)
print("baseof_has_hostname_method=", any(x in baseof for x in [".Hostname()", ".Host"]))
print("analytics_full_regex=", bool(re.search(r"/\^\(localhost|127\\\\|192\\\\\.168\\\\\.|0\.0\.0\.0\)/", analytics, re.S)))
print("analytics_protocols=", sorted(set(re.findall(r"location\.protocol\s*([!=]+)=?\s*['\"]([^'\"]+)['\"]", analytics))))
print("analytics_has_loopback_or_private_or_ipv6_or_file=", any(token in analytics for token in [
"127.", "192.168.", "172.16", "169.254", "localhost", "file://", "location.hostname", "[A-Fa-f0-9:]",
]))
print("analytics_has_https_exact_check=", bool(re.search(r"\blocation\.protocol\s*===?\s*['\"]https:?\s*['\"]", analytics)))
PYRepository: jetthoughts/jetthoughts.github.io
Length of output: 49322
Use one exact production-host allowlist at both analytics gates.
strings.Contains site.BaseURL "jetthoughts.com" makes any baseURL containing that substring load analytics. The browser check also only denies specific local addresses, so hosts like 10.0.0.5, 172.16.0.5, 169.254.1.1, IPFS-style private/loopback local hostnames, or file:// pages with an empty hostname can still record. Load analytics only when site.BaseURL has the exact production host, and load Clarity in the browser only for a verified production hostname over HTTPS.
📍 Affects 2 files
themes/beaver/layouts/baseof.html#L17-L17(this comment)themes/beaver/layouts/partials/page/analytics.html#L6-L13
🤖 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/baseof.html` at line 17, Replace the substring check in
themes/beaver/layouts/baseof.html at lines 17-17 with an exact production-host
allowlist check. Update the browser gate in
themes/beaver/layouts/partials/page/analytics.html at lines 6-13 to load Clarity
only when the verified hostname is the exact production host and the protocol is
HTTPS, rejecting private, loopback, link-local, IPFS-style, empty, and file://
hosts; ensure both analytics gates use the same production-host policy.
Summary
Enables Microsoft Clarity for the course validation pilot and hard-excludes ALL analytics from local dev and test builds, plus the 2026-07-31 board sync that removes the pilot gate from the course backlog.
Analytics changes (theme + config)
microsoftClarity = "xum05dgnec"inconfig/_default/hugo.toml(project created by Paul 2026-07-30; supersedes the earlier same-day waiver). Session recordings are available for the course pilot.baseof.htmlonly includespartials/page/analytics.htmlwhensite.BaseURLcontainsjetthoughts.com— dev (localhost:1313), test builds (localhost:1314), and any other baseURL never inject tracking at all.localhost|127.*|192.168.*|0.0.0.0hostnames.not hugo.IsServerguard retained.bin/hugo-build) has 0 analytics references;hugo --environment productioncontains both googletagmanager and clarity.ms.Visual baselines (intentional, prescribed by #405)
test/fixtures/screenshots/{macos,linux}/mobile/homepage.pngre-recorded per fix(homepage): breathing room between hero CTA and hero image on mobile #405's commit-message note ("mobile homepage screenshots will show this intentional 28px shift on their next blessed-stack run — re-record via bin/test and bin/dtest"). The 0.2747 diff is the 28px hero-image gap fix(homepage): breathing room between hero CTA and hero image on mobile #405 added below 860px; headline/copy/CTA pixels are unchanged (verified via diff heatmap).Docs sync (board + runbook)
.okflog + test-gates caveat (snap_diff baselines = git HEAD, not working tree).Test evidence
bin/rake test:critical: 34 runs, only expected mobile-homepage baseline re-recordbin/test(macOS) +bin/dtest(Linux): logs in session scratchpad; both baseline dirs updated in the same commit per CLAUDE.md rule🤖 Generated with Claude Code
https://claude.ai/code/session_01XzSs7FupxTPeX4QW1u5anX
Summary by CodeRabbit
New Features
Documentation