Skip to content

Enable Clarity for course pilot + exclude analytics from local/test builds + un-gated board sync - #407

Merged
pftg merged 2 commits into
masterfrom
course-clarity-config
Jul 31, 2026
Merged

Enable Clarity for course pilot + exclude analytics from local/test builds + un-gated board sync#407
pftg merged 2 commits into
masterfrom
course-clarity-config

Conversation

@pftg

@pftg pftg commented Jul 31, 2026

Copy link
Copy Markdown
Member

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)

  • Clarity enabled: microsoftClarity = "xum05dgnec" in config/_default/hugo.toml (project created by Paul 2026-07-30; supersedes the earlier same-day waiver). Session recordings are available for the course pilot.
  • Defense in depth against local pollution (three layers):
    1. baseof.html only includes partials/page/analytics.html when site.BaseURL contains jetthoughts.com — dev (localhost:1313), test builds (localhost:1314), and any other baseURL never inject tracking at all.
    2. The Clarity snippet additionally guards at runtime against localhost|127.*|192.168.*|0.0.0.0 hostnames.
    3. Existing not hugo.IsServer guard retained.
  • Verified: dev build (bin/hugo-build) has 0 analytics references; hugo --environment production contains both googletagmanager and clarity.ms.

Visual baselines (intentional, prescribed by #405)

Docs sync (board + runbook)

  • PILOT GATE REMOVED (Paul, 2026-07-31): TASK-TRACKER Open queue rewritten as Waves 0/A-H covering the full formerly-pilot-gated backlog (Sprint D content gaps, Phase 2 mechanics, 16 campaign briefs, lead bridge). Pilot recruitment stays on Paul's desk but blocks nothing.
  • Runbook 20.12 + GOAL-AT-A-GLANCE + 20.07 statuses synced; .okf log + 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-record
  • bin/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

    • Added Microsoft Clarity configuration for supported production pages.
    • Analytics now load only on the live site and skip localhost, test, and private-network environments.
  • Documentation

    • Updated testing guidance, visual regression procedures, and snapshot baseline notes.
    • Refreshed course plans, project status, task tracking, and growth measurement documentation.
    • Updated publishing schedules and clarified shipped, deferred, and remaining work.

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

coderabbitai Bot commented Jul 31, 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: 52 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 Plus

Run ID: 3a3effbb-a1e7-4337-9543-1f99f8449ba4

📥 Commits

Reviewing files that changed from the base of the PR and between 027801e and 1eed621.

📒 Files selected for processing (1)
  • .okf/build/test-gates.md
📝 Walkthrough

Walkthrough

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

Changes

Testing workflow

Layer / File(s) Summary
Test command policy
.okf/build/test-gates.md, AGENTS.md, CLAUDE.md
Routine testing now uses bin/qtest --changed. Critical and full visual suites are reserved for milestones or PR preparation.
Snapshot baseline guidance
.okf/build/test-gates.md, .okf/log.md
The documentation records committed git HEAD baselines, stale differences, required baseline commits, and Docker screenshot limitations.

Production analytics gating

Layer / File(s) Summary
Production analytics configuration and loading
config/_default/hugo.toml, themes/beaver/layouts/baseof.html, themes/beaver/layouts/partials/page/analytics.html, docs/projects/2605-tech-for-non-technical-founders/20-29-strategy/20.12-course-growth-agent-runbook.md
Microsoft Clarity configuration and measurement guidance were added. Analytics and Clarity initialization now exclude local, test, private LAN, and other non-production hosts.

Project status records

Layer / File(s) Summary
Project execution status
docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md, docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md
The project overview and tracker now record shipped work, active queues, pilot validation, growth waves, and remaining tasks.
Publishing schedule updates
docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md
Course chapter statuses and audit notes were updated. The salvage/rebuild slug is now salvage-vs-rebuild-decision-tree.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: enabling Clarity, excluding analytics from local and test builds, and synchronizing the board status.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch course-clarity-config

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.

@pftg
pftg merged commit bab5122 into master Jul 31, 2026
4 checks passed
@pftg
pftg deleted the course-clarity-config branch July 31, 2026 10:18

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

Wrap 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

📥 Commits

Reviewing files that changed from the base of the PR and between 6ea61b6 and 027801e.

⛔ Files ignored due to path filters (2)
  • test/fixtures/screenshots/linux/mobile/homepage.png is excluded by !**/*.png
  • test/fixtures/screenshots/macos/mobile/homepage.png is excluded by !**/*.png
📒 Files selected for processing (11)
  • .okf/build/test-gates.md
  • .okf/log.md
  • AGENTS.md
  • CLAUDE.md
  • config/_default/hugo.toml
  • docs/projects/2510-seo-content-strategy/20-29-strategy/20.07-content-plan-icp-e-q2-2026.md
  • docs/projects/2605-tech-for-non-technical-founders/20-29-strategy/20.12-course-growth-agent-runbook.md
  • docs/projects/2605-tech-for-non-technical-founders/GOAL-AT-A-GLANCE.md
  • docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md
  • themes/beaver/layouts/baseof.html
  • themes/beaver/layouts/partials/page/analytics.html

Comment thread .okf/build/test-gates.md
@@ -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 |

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.

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

Comment thread CLAUDE.md
Comment on lines +119 to +125
- **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.

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.

📐 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-L52
  • CLAUDE.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.

Comment thread CLAUDE.md
- **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.

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.

📐 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`** |

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

🧩 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 -200

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

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

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

Comment on lines +16 to +20
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).

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

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.

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

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.

📐 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.md Lines 7-8: wrap the metadata.
  • TASK-TRACKER.md Lines 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

Comment on lines +7 to 9
**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

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

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.md Lines 7-9: record the current Clarity status.
  • GOAL-AT-A-GLANCE.md Lines 14-31: remove the stale GA4-only decision.
  • TASK-TRACKER.md Lines 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-L31
  • 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 - 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.

Comment on lines 33 to +47
**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.

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

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.md Lines 33-47: update the ordered action sequence.
  • TASK-TRACKER.md Lines 38-45: update campaign and lead-bridge status.
  • TASK-TRACKER.md Lines 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-L45
  • docs/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" }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ 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)))
PY

Repository: 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)))
PY

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

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