Add the ability to use custom urls - #8
Merged
Merged
Conversation
pftg
reviewed
May 22, 2024
Member
There was a problem hiding this comment.
can we use devto_urls_mapping.csv or use _ instead of -
pftg
reviewed
May 22, 2024
| end | ||
|
|
||
| pp "TODO: Need to uncomment canonical url update when blog will be live." | ||
| pp 'TODO: Need to uncomment canonical url update when blog will be live.' |
pftg
requested changes
May 22, 2024
pftg
left a comment
Member
There was a problem hiding this comment.
@dgorodnichy please add readme how to provide custom name for blog post from dev.to
pftg
approved these changes
May 22, 2024
pftg
added a commit
that referenced
this pull request
Apr 10, 2026
…inks Expanded from 5 signs to 8, adding JetThoughts-specific signals: - #3 "Every deploy breaks something" (no tests → deployment fear) - #4 "They won't refactor" (technical debt compounds) - #5 "No transparency" (no reports, no demos) - #8 "You feel afraid to ask questions" (emotional signal) Internal links expanded from 6 to 12 unique JetThoughts posts: - Added: Shape Up, fixing slow teams, code quality evaluation, onboarding checklist, red flags in big PRs, knowing what team does - "Finding the Next Partner" section now references specific practices (daily deploys, CI/CD, async standups, delivery flow, onboarding) - Closing section replaced with 7 internal link list to practice posts Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Apr 29, 2026
…6-05-06 Full pipeline executed end-to-end: - Drafter agent: 1820 words, 5 verified internal links, 5 external citations (Bug0 2026, Osmani 80% problem, Stack Overflow 2025, GitClear 2025, Veracode 2025). Three rescue stories with industry/quarter/version/dollars. - Round 1 (3 critics): founder persona 6.5/10, SEO/slop 6/10, editor "minor". Synthesized 10 fixes: lead with healthtech founder story (founder's #1 ask), cut consultant-speak, vary section openers, kill slogany closer. - Round 2 (3 NEW critics): senior dev caught Osmani title fact-check, copywriter caught compass-metaphor TED-talk, AI detector caught three "Not X - Y" patterns. 9 fixes applied. - Round 3 (3 NEW critics): DevOps practitioner 7/10 ("missing the smell of an actual on-call shift" - added Honeycomb p99 detail, named SQL injection vector); conversion optimizer 6.5/10 ("biggest attention drop is Osmani paragraph") - inserted primary CTA after Section 5 peak-pain moment; tired reader Lisa skimmed past section 5 - confirmed CTA placement fix was correct. - Cold-eyes Agent 4 (LLM-enforced final gate per docs/workflows/blog-pipeline.md STEP 5c): 9/9 PASS, PUBLISH-READY. Frontmatter consistency, no fluffy narration, no fake authority, no timeline fabrication, no "Not X but Y", no em dashes, no rule-of-three triads, no template repetition, no impersonal fragments. - Cover image: duplicate of vibe-coding-crisis template, customized for Quality Tax ($60-90K headline gradient, BUG0/OSMANI/RESCUE BOOK chips), rendered 2400x1260x2 via chrome-devtools, Lanczos downsample to 2400x1260. Status: draft:true, date:2026-05-06. Hugo respects future-dated content; flip the flag on May 6 with no further work needed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Apr 30, 2026
Reader-experience agent's #1 conversion finding: end-of-article CTAs were invisible (italic line / inline blue link / nothing at all). After 11-12 min reading, ICP-E hit the bottom and visually defaulted to "I guess that's it?" Highest-intent moment, weakest visual treatment. CSS (themes/beaver/assets/css/style.css): - .blog .cta-link: Ruby red background (#cc342d), white text, 14/28 padding, 8px radius, 600 weight, no underline - :hover state, :visited state, mobile breakpoint (full-width centered on phones with adjusted padding) - Selectors: .blog p a.cta-link / .blog li a.cta-link / .blog .cta-link override the body link styles Posts adopted (replaced markdown link with inline HTML <a class="cta-link">): - fire-dev-shop-guide (post #1) - "Get an honest audit" - 47-startups-failed-same-coding-mistake (post #5) - "Book a 45-minute codebase health check" - rails-event-structured-logging-8-1 (post #6) - "Book the free monitoring audit" - hiring-dev-shop-questions (post #7) - "Book the 45-minute checklist call" - quality-tax-ai-mvp-cost (post #8) - "Send your repo for the read" Verified visually at /tmp/typo-sprint2-after-cta-link.png. Hugo build clean (655 pages, 1494 non-page files). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Apr 30, 2026
…d bin/dtest to test gate User flagged 2026-04-30 that data-dense paragraphs (e.g. Quality Tax post section 2: '$34K -> $4K -> $19K -> $38K -> 9.5x -> $72K') buried the financial story in plain prose. Founders skim for numbers; bold rendering helps the eye land. Per the voice-guide "Data emphasis" rule (added in commit 1712b60): - Bold percentages, currency, sizes, latencies, multipliers, rescue counts - Don't bold common nouns (Rails, Ruby, AI) - Skip fields already in code blocks or external quotes 128 data points bolded across 11 posts (10 most recent + the user's Quality Tax #8 example): - ruby-on-rails-performance-optimization-patterns-2026 (12) - fire-dev-shop-guide (14) - solid-trifecta-hybrid-redis-rails-8 (13) - rails-8-1-active-job-continuations-end-lost-background-jobs (10) - vibe-coding-crisis-ai-code-debt (14) - 47-startups-failed-same-coding-mistake (16) - dev-shop-red-flags-checklist (12) - founders-guide-hiring-dev-shop (2 - sparse pillar overview) - rails-event-structured-logging-8-1 (9) - hiring-dev-shop-questions (13) - quality-tax-ai-mvp-cost (heavy pass; user's flagged section) Also: CLAUDE.md visual regression gate now requires BOTH bin/test (macOS host) AND bin/dtest (Linux/Docker). CI runs Linux, so a green PR locally that skipped bin/dtest will break the build. Both must pass before commit. bin/test passed: 42 runs, 116 assertions, 0 failures, 84 screenshots compared, 0 diffs. Hugo build clean. bin/dtest follow-up: 81 Linux baselines pending update from prior sprints. Will be handled in a separate commit after running bin/dtest fresh to confirm they reflect the fully-fixed state. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
May 1, 2026
…6-41316 Two posts shipped: 1. Post #8 "The Quality Tax: AI MVPs Cost More to Fix" - already passed full 9-persona + cold-eyes pipeline pre-PR. Flipped draft: true → false and adjusted date 2026-05-06 → 2026-05-02 to publish today instead of future-dated (Hugo would otherwise hide it). 2. Post B "The Rails CVE Your Dev Shop Skipped" - new draft for the April 21, 2026 universal RCE disclosure (CVE-2026-41316). Abbreviated team- mode pipeline: draft → Round 1 3-critic loop (founder/SEO-slop/copy editor) → cold-eyes Agent 4 final gate (9/9 PUBLISH-READY, zero edits). Round 1 caught heavier triadic patterns than post A: 3 rule-of-three triads, 4 parallel-template paragraphs, 1 duplicate slogan, opening jargon dump - all rewritten before cold-eyes. ~1500 body words, 5 internal links, 6 external citations. Cover image: monospace "CVE-41316" identifier + red→purple gradient "8.1 / 10" severity + Ruby gem with alert glow. Build green. Both news-pegged: posts A (PocketOS), #8 (Quality Tax), and B (Rails CVE) ship inside the same 2-week trend window the 4-agent research synthesis identified. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
May 2, 2026
…nds) (#310) * docs(content): 4-agent research synthesis - revise content plan Cross-validated 14-day signal scan (Apr 17 - May 1, 2026) across 4 parallel research agents (Rails, AI/vibe-coding, founder forums, competitor publishing): - PocketOS database wipe (Apr 25, 851 HN points, 30hr outage) - inserted as urgent post A (publish 2026-05-04, news-pegged time-decays) - Rails CVE-2026-41316 universal RCE (Apr 21) - inserted as B (May 7) - 6 additional posts from cross-agent signals: NEW-C2 founder trust voice (Apr 20 IG), NEW-D2 AI token bill (Apr 23 Pragmatic Engineer), NEW-E agency-uses-AI (Apr 30 Wilbur Labs + Amazon rollback), NEW-F Rails 7 EOL, NEW-G retros founder edition, NEW-H PaaS bill trap Dropped #16 Budget Creep (generic angle). Merged #10 into NEW-E (sharper Apr 30 hook). Stream ratio: 13:7:7 Founders:Rails:AI (27 posts total). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * publish(blog): post A "9 Seconds: An AI Agent Wiped a Live SaaS" News-pegged ICP-E post on the April 25, 2026 PocketOS incident (Cursor + Claude + Railway stack deleted production DB and backups in 9 seconds, 30hr outage). Full team-mode pipeline: 3-round 9-persona critic loop (founder persona, SEO-slop, copy editor, senior dev, copywriter, AI detector, DevOps practitioner, conversion optimizer, tired founder reader) + cold-eyes Agent 4 final gate (9/9 checks PUBLISH-READY). ~1500 body words, 5 internal links, 6 external citations, primary keyword in first sentence. Cover image: strike-through database SVG with 30hr/HN/ backup-gap chips. Build green, zero console errors, mobile renders clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * publish(blog): post #8 Quality Tax (flip live) + post B Rails CVE-2026-41316 Two posts shipped: 1. Post #8 "The Quality Tax: AI MVPs Cost More to Fix" - already passed full 9-persona + cold-eyes pipeline pre-PR. Flipped draft: true → false and adjusted date 2026-05-06 → 2026-05-02 to publish today instead of future-dated (Hugo would otherwise hide it). 2. Post B "The Rails CVE Your Dev Shop Skipped" - new draft for the April 21, 2026 universal RCE disclosure (CVE-2026-41316). Abbreviated team- mode pipeline: draft → Round 1 3-critic loop (founder/SEO-slop/copy editor) → cold-eyes Agent 4 final gate (9/9 PUBLISH-READY, zero edits). Round 1 caught heavier triadic patterns than post A: 3 rule-of-three triads, 4 parallel-template paragraphs, 1 duplicate slogan, opening jargon dump - all rewritten before cold-eyes. ~1500 body words, 5 internal links, 6 external citations. Cover image: monospace "CVE-41316" identifier + red→purple gradient "8.1 / 10" severity + Ruby gem with alert glow. Build green. Both news-pegged: posts A (PocketOS), #8 (Quality Tax), and B (Rails CVE) ship inside the same 2-week trend window the 4-agent research synthesis identified. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Jul 11, 2026
…es, citations, covers (40.17) (#354) * feat(course): branch-aware nav strip + walkthrough nav + ranked entry orientation (40.17 P1 #1-2) - course-prev-next partial: sequence entries may declare 'branches' (2.4 run-interviews loop, 2.5 build/pivot/kill gate, 5.1 core-vs- optional) so the strip never contradicts the footer routing - frontmatter fallback (course_nav_prev/next) puts the strip on the 5 Mia walkthroughs + vibe-prd-template; M5 walkthrough now exits to the landing Going-further section instead of dead-ending - glossary utility link under every strip (glossary was reachable from one landing card only) - landing orientation line ranked: Ch0 first, quickstart as the time-poor alternative Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): rewrite the two RED legacy companions - worksheet gate + stack-walkthrough pace (40.17 P1 #4-5) build-path-decision-worksheet: - Q1 gate now matches 4.1 canon (M1-M2 evidence; pre-orders explicitly deferred to Module 5) - no more false 'not ready' bounce - route ghosts 6A/6B/5.2/Module-2-retake replaced with real slugs - Q2 jargon translated to Sam-answerable plain English self-serve-stack-walkthrough: - reframed from 4-week full-time to session-based with the 10-week evenings pace as primary (matches 4.4 + Mia canon) - webhook debugging is Dashboard-first; Stripe CLI demoted to optional branch (keeps 4.3's no-terminal promise) - 2 dead docs.stripe.com URLs replaced with verified 200s +9 ratchet signatures for the removed defects Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): citations, glossing, scannability + 5.6 completion moment (40.17 P1 #3/6, P2 #7/11-14, P3 #15-17/20) Citations (all replacements curl-verified 200): - 30 dead external links replaced across 18 files (Steve Blank, Lenny, YC Library, First Round, SaaStr, Stripe docs, Vanta, ICANN, Snyk, Veracode, Octoverse, ProfitWell->Paddle, Bolster, Wes Kao, Pragmatic Engineer, latent.space, Simon Willison; 2 archive.org snapshots for JTBD sources); dead gocofound.com removed entirely (DNS gone) - fabricated '47% of all merged PRs' Octoverse stat corrected to the sourced ~46%-of-code-by-Copilot-users figure Journey fixes: - 5.6 footer now declares the core course COMPLETE and routes finishers to Going-further (graduation was stranded on optional 5.7) - H2 subheadings added to 1.2-1.5 (four ~1,000-word walls, zero headings); glossary grammar bug + softened rescue lede; glossary and FAQ forward CTAs; validation-tools-field-guide linked from 1.1 - 2.4 research-panel cost explained ($0 default vs paid shortcut) - glosses at first mention: ICP/SOW (4.1), IP/DBA (4.2), Calendly (5.4), Apollo/Sales Navigator (5.7), CSV/CRM (3.2), SKU (churn), Cursor (vibe-prd-template); 4.3 'Modules 1-4' slip + prototype-reuse repetition trimmed; quickstart fear anchor $10K+ -> $30K+ - 5.3 network-buckets.svg stale '8.1' -> '5.1'; friday-demo-template demo credential un-mailto'd; churn/pivot 'X of N' denominators dropped; hire-track named consistently +30 ratchet signatures for the removed defects Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): cover/badge reconciliation - 10 covers regenerated (40.17 P2 #8-9) Wrong-promise badges fixed: 2.4 (Clay+Lindy/$200-500 -> Gmail+list/$0 panels optional), 4.1 (Keep/Rebuild rescue tree -> 4 build paths, 30min -> 14min), 4.5 (Module 4B -> OPTIONAL Next 5.1), ownership-checklist (Hostage list -> 12-row ownership audit), outreach-sequence-template (Clay+Lindy -> Gmail+NeetoCal+Reddit), 1.1 (TIME 90 min -> EXERCISE 90 min vs the 6-min-read byline) Cover reuse killed: distinct covers for 5.4 (message variants + Loom) and 5.5 (reply tracker) - both previously byte-identical to 5.3's; new Going-Further covers for churn (leaky bucket) and pivot (decision ledger) - both previously reusing 5.1's Sean Ellis gauge Stale metadata aligned: 4.1 + 2.4 cover_image_alt describe the new art; churn og_title old-spine '7.5 ·' prefix dropped Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): cold-eyes review round - source-truth 3 slopsquatting claims + worksheet signal attribution Diff-regression reviewer verified the fixes against their cited sources: - 'Snyk reproduction confirmed rate had not improved' - not in the cited article; now states the supported ~1-in-5 hallucination rate - ToxicSkills 13.4% re-stamped to the real frame (534 ClawHub skills, Feb 2026) and the fabricated June-Sept-vs-Q1 trajectory dropped - fabricated '12 codebases with hallucinated requestz' replaced with the article's real huggingface-cli 30k-download datapoint - worksheet Good-example 8% now attributed to email sign-ups (the 1.4 'Promising' band), not the 1.5 Buy-button price test +3 ratchet signatures Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * docs(course): 40.17 execution log + tracker - ICP journey fix sprint complete Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V * fix(course): address PR #354 review - CodeRabbit 15 comments + premium anchor-text class Premium bar (user-reported): raw course paths as visible anchor text replaced with named anchors (2.1 Mom Test script, 4.2 ownership checklist); class ratchet-banned CodeRabbit review comments (all 15 verified and addressed): - worksheet: Q1 metric un-conflated (Promising band = 1.4 email sign-ups, not the 1.5 Buy button); verdict table aligned with the authoritative Q1-Q5 flow (Path 2/3/4 conditions now partition every answer combination) - stack-walkthrough: verify_jwt-off + Stripe-Signature verification step added (deliveries 401 otherwise); AI-paste debugging now says redact PII/secrets; idempotency upgraded to atomic unique-constraint event ledger; Stripe checklist scoped to the one wired event; PostHog/Plausible replay capability untangled - slopsquatting: three unsupported production-incident bullets removed (cited article covers a different attack); further-reading annotation neutralized - 4.2: current ICANN Transfer Policy URL + precise code-release/ transfer-release/60-day-lock timing - counts: 'Seven platforms ranked' / 'The 7 platforms ranked' / 'seven-row list' -> six after gocofound removal - demo credential founder@test.com/demo1234 -> demo@example.com everywhere (incl. 2 SVGs); landing 'Chapter 1.1' now a link; Veracode 'shipped' -> 'tested samples'; vibe-prd 'ship from on' grammar; 40.17 typo +11 ratchet signatures Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V --------- Co-authored-by: Paul Keen <pftg@Mac.fritz.box> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
pftg
pushed a commit
that referenced
this pull request
Jul 24, 2026
Code-review of the rescue-sprint kit before first sends. Fixes: - Joy Adamson routing (SEND-SHEET msg 5, opener #3, prospect row 3): her quote is a comment on Nico Casavecchia's post; copy said 'your post' and pointed Paul at Nico's thread. Now says 'your comment', with a DM-via-profile routing note. - Pre-send gate added to SEND-SHEET + backlog Next: confirm NeetoCal S0 checklist (URL resolves 200, but event setup unchecked), tracking sheet, msg-5 routing — THEN send. - New rescue-sprint/pipeline.md: send/reply/booking ledger so A0 kill-criteria (~20 touches / ~10 calls) are countable; added as P10. - SEND-SHEET next-batch fixed: #6-10 → #4-#8 (batch 1 used #1-3,#12,#13; #4/#5 are the highest-trigger unsent rows). - Channel contradiction resolved: openers' thread-reply choice supersedes prospect-list 'IH DM' column (note added); SEND-SHEET labels actions. - Retention claim unified to sourced 5-year average (one-pager, four-forces) per warm-intro sourced-claims registry; was 3-year/'three years' in two docs. - Rows 16-17 downgraded to semi-ICP (pre-build/partner-seeking; audit offer may not fit) with send-last note. - P3 (HN) marked retired venue (0 rows, dev-dominated) so no future session re-runs it; kanban board noted as local-only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Jul 25, 2026
…rnal accuracy Founder-facing (7): r/cursor opener no longer borrows Saul_E's $55K figure; openers #2/#4/#6/#8 + SEND-SHEET align to the real delivery (45-min call -> 48h offline audit, not audit-in-45-min); Touch 1 follow-up no longer claims 'slot is still yours' to never-booked founders; pre-call email asks founders to HOLD admin and grant read-only (never hand admin credentials); discovery-kit secrets rule is absolute (sanitized excerpts only, synced to runbook event note); booking confirmation sets read-access expectation with a hostage-case escape hatch (spec + runbook copies). Internal accuracy (14): runbook P2/T9 stale $25K -> confirmed tiers; D1 card marked done via T8/T9; VoC cold-eyes Push count 10->13; sourcing-pipeline cold-row target + stale 'run now' footer; taxonomy Reddit access = excerpt/F5Bot; GOAL-AT-A-GLANCE demoted to supporting workstream under bet #1; RUN.md portable repo root + P7 non-blocking; strategy roadmap/risk reflect partner locked 2026-07-21; KR3 counts free audits (funnel entry); warm-intro table gains Last-touch column; p1 verdicts downgraded (dianewilliams75, 659ertramp, J_Jie556517) with cold-list row 15 synced; assumptions-register + grooming vote totals recomputed (A3 18, B1 23, B2 33, C3 17, C4 18, D2 25; V1 44/32/35, V2 C 32) — no winner flips. All 47 CodeRabbit comments triaged: 9 already fixed, 21 fixed here, rest dismissed with reasons (see session notes). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Aug 1, 2026
* refactor(course): card-grid the operating-kit's 6 components + one How-to-run section 40.24 L3 contract, commit 1 of 3 (40.23 C4 rider). The kit's six component blocks become a 2-column card grid (reusing .module-card + a new .kit-grid rule), each card closing with the same single 'Payoff:' label - replacing the six mismatched payoff labels (In practice / Why it matters / The outcome / What it does / Result / The payoff). The DPA deposit clause moves to a full-width fence just below the grid (narrow-card pre wrapped badly). The four trailing prose H2s (How to use / What this kit is not / How to get / Where this fits) collapse into one 'How to run the kit' with a v2 Done/Next closure. No new facts, no canon changes; all lesson and reference links kept. Kit PDF regenerated. Gates: bin/hugo-build green (8 validators), bin/qtest --changed green (34 runs, 0 failures, 53 screenshots no diffs). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * refactor(course): move Going-further tables to the kit, Already-building steps to Lesson 4.2 40.24 L3 contract, commit 2 of 3. The landing's three Going-further trigger tables relocate verbatim to a new 'Going further triggers' section (#going-further-triggers) at the close of the First-Paying-Customer Operating Kit; the landing section keeps its byte-identical H2 and points there. The Already-building 6-step pre-flight body relocates to Lesson 4.2 as an 'Already mid-build with a contractor?' side-path (step 1, the ownership audit, is that lesson itself, so the list carries the remaining 5); the landing section keeps its byte-identical H2 + fork sentences. The two completer 'Next' links (paid-pilot 5.6, outbound 5.7) repoint from the landing anchor to the kit's trigger section. GA4 branch-click label continuity: the branch links generated from churn-triage / pivot-or-persevere / module-5-walkthrough frontmatter still target the landing's unchanged #going-further-after-first-paying-customer anchor, so existing data-course-label values keep reporting under the same labels. Gates: bin/hugo-build green (8 validators); bin/qtest --changed reports no visual-affecting changes (markdown-only diff). Kit PDF regenerated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course): restructure landing to the L3 target order - hero Free note, two doors, Who-built-this up top 40.24 L3 contract, commit 3 of 3. New section order: hero (+ one-line 'Free' reconciliation note rendered under the chips via a new hero_note frontmatter slot in layouts/course/list.html), intro compressed to two doors (Start Lesson 1.1 / see the syllabus), Take this course if / Skip if + a 2-line already-building router to Lesson 4.2, the approved Who-built-this draft (softer variant, verbatim from the contract), Why-this-course-exists with the 'since 2011' clause removed from its intro (the Who block carries it) and bullets lightly trimmed (deep links kept), What-NOT-cover whole with its Going-Further reference repointed to direct chapter links, Module map (fundraising clause out of the intro; 16 Optional-reference rows removed; external tool names de-linked inside the cards - NOT-cover keeps the linked versions), the two byte-identical stub H2s, and the template end-cap's Start Lesson 1.1 as the final element. The 16-word share line is cut from the landing and re-homed at the operating kit's close. All 7 inbound anchors (#going-further-after-first-paying-customer x5, #already-started-building, #module-map) verified intact in built HTML. Mia walkthrough rows, chapter/template links, canon numbers, and the zero-service-CTA rule untouched. Intended visual change: macos desktop+mobile course/landing baselines updated in this commit. Linux baselines NOT re-recorded locally (emulated-Docker rule) - the dtest leg runs at PR prep. Gates: bin/hugo-build green (8 validators); bin/qtest --changed 34 runs, 2 failures = exactly the two intended course/landing screenshots (baselines accepted here), 51/53 others unchanged. Kit PDF regenerated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course): L4-visual V1 - mistake-card grid, module-card elevation, dark endcap, section eyebrows 40.25 brief, commit V1 of 3. course-list.css only (bundle exclusive to the landing): (1) ul.mistake-list becomes a 2-col card grid with ruby CSS counters 01-05 replacing the x bullets; (2) module cards get elevation, the leading 'Output:' strong restyled as a top-right ruby pill, and the 'You leave with' line promoted to a green tinted panel; (3) .course-endcap becomes an obsidian (#0d1117) island with a soft ruby radial glow behind the Start Lesson 1.1 CTA; (4) ruby uppercase eyebrow kickers above each section H2 keyed off stable heading ids, plus hero polish (ruby-tinted Free chip, CTA shadow). Zero copy changes; JetVelocity tokens only. Visual score (inspected 1280x800 + 390x844 in chrome-devtools): 1. Great look: YES - consistent ruby/obsidian tokens, aligned grid. 2. Functional: YES - no horizontal overflow at 390px, contrast holds. 3. Earns next scroll: YES - card grid breaks the mistake text wall; dark endcap gives the page a terminal CTA moment. 4. Helpful: YES - counters encode sequence, leave-panels surface the deliverable, eyebrows aid section scanning. No decorative-only art. Gates: bin/hugo-build green. bin/qtest --changed: desktop landing within 0.03 tolerance (baseline unchanged); mobile landing 0.045 intended diff - macos mobile baseline updated in this commit; all other tests green (css_orphan_guard 2 runs, color_system 1 run, 0 failures). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course): L4-visual V2 - timeline rail, mid-page CTA card, two-col module cards, gloss restore 40.25 brief, commit V2 of 3. Markup (_index.md) + course-list.css: (1) the five module cards wrap in a .module-rail div - a vertical ruby-fading rail with an 8px node per card, >=1000px only (no gutter below, hidden per the brief's mobile-alignment escape hatch); (2) a 6th mistake-grid cell: dark inverted CTA card 'Each mistake maps to a module - jump to the module map' (10 words) targeting the existing #module-map anchor, no counter/x marker; (3) module cards go two-column on >=768px via grid-template-areas - chapters left, 'You leave with' panel right - stacking back to one column below; (4) 40.24-addendum P3: the Founding-Hypothesis gloss restored to the full 'who the customer is, what problem you solve, why they'd pick you' wording (revert of the L3 trim). kit:168 '20 years' NOT touched (queued for W2). These two text items are the only word changes. Visual score (inspected 1280x800 + 390x844 in chrome-devtools): 1. Great look: YES - rail+nodes echo the course sequence, dark CTA cell balances the 2x3 mistakes grid. 2. Functional: YES - no overflow at either viewport, leave-panel column readable at 240px, mobile stacks cleanly with rail hidden. 3. Earns next scroll: YES - the dark cell hands scanners a door to the map at the exact decision moment. 4. Helpful: YES - two-col layout puts chapters and the deliverable side by side; nothing decorative-only. Gates: bin/hugo-build green. bin/qtest --changed green - all diffs within the 0.03 landing tolerance, so no baseline changes in this commit (desktop 3 runs, mobile 1 run, unit+color+random extras all 0 failures; final clean run: '1 screenshot compared, no failures', 'qtest: green in 83s'). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course): L4-visual V3 - dark hero course-artifact card replaces the cover figure 40.25 brief, commit V3 of 3 - the ONE bold move, kept separate and revertable (drop this commit to restore the cover-image hero). layouts/course/list.html: hero content wraps in .course-hero__main; the cover <figure> is REMOVED (never both) and replaced by an obsidian .course-hero-card aside - ruby 'FREE COURSE' eyebrow, the page title in Space Grotesk, stat chips (5 modules / 25 lessons / 6 artifacts, derived in-template from data/course_sequence.yaml with the same logic as the course-stat shortcode - single source, canon untouched), and a leave-with line reusing the hero lede's contracted 'signed paid pilot - a real customer paying real money' phrasing. og:image still serves cover.png via frontmatter metatags. On >=980px the hero breaks out to min(1080px, 100vw-48px) as a two-column grid (content left, card right); below 980px the card stacks under the CTAs in the cover's old slot. JetVelocity tokens only: obsidian #0d1117, ruby #cc342d glow, purple #a855f7 glow, Space Grotesk. No blue, no orange. Visual score (inspected 1280x800 + 390x844 in chrome-devtools): 1. Great look: YES - the obsidian island with ruby+purple radial glows gives the first fold a brand-anchored artifact; chip row is crisp. Known nit: card title duplicates the H1 verbatim (title copy is contracted; demo's variant title is killed demo-copy). 2. Functional: YES - zero horizontal overflow at both viewports; contrast holds (white/#e7e7ee on #0d1117); stats readable. 3. Earns next scroll: YES - first fold now carries a visual hook (Pew 3-second rule) instead of pure text + below-fold cover. 4. Helpful: YES - the card encodes real orientation data (module/ lesson/artifact counts + the end-state); it replaces, not adds. Gates: bin/hugo-build green. bin/qtest --changed: intended failures ONLY on the two landing screenshots (desktop 0.228 hero region, mobile 0.109 hero-card region) - both macos baselines updated in this commit; css_orphan_guard, color_system and all other runs 0 failures. No non-landing baseline shifted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(course-landing): L4 fix round - output pill, module-card void, endcap gap Fixes the 1 P2 + 2 P3 findings from the L4-visual cold critique (29/36, beats the 25/36 gate): - P2: module-card "OUTPUT:" pill was position:absolute top-right, detached from the sentence it labels (read as a broken data binding). Restyled as an inline ruby lead-in attached to its line. - P3: desktop module cards 4 and 5 had a ~500px empty void under the "You leave with" panel because the shared grid row height tracked the much-taller chapters column. align-self:start alone doesn't shrink the row - collapsed just those two cards to single-column so the row height tracks the panel's own content. - P3: mobile had a ~170px dead black gap between the endcap card and the footer logo - endcap bottom padding (38px) + footer.css top padding (130px) collide with no visual seam since both are black. Scoped the fix to course pages via body:has(.course-endcap), so the shared footer.css rule other pages depend on is untouched. Verified via chrome-devtools at 1280x800 and 390x844: pill reads attached, void is gone on modules 4/5, gap collapses to normal section spacing, modules 1-3 (shorter chapter lists) unaffected, zero console errors. 4-criteria score: great look (yes - fixes read as intentional, not patched), functional (yes - no zoom, no overflow), earns scroll (yes - card rhythm reads clean start to finish), helpful (yes - removes two "looks broken" signals a reader would bounce on). bin/hugo-build: exit 0, 8 validators passed. bin/qtest --changed: green in 151s, 0 failures - both course/landing screenshot diffs (desktop + mobile) fell under the 0.03 tolerance, no baseline update needed. * docs(2605): 40.26 L5-condense spec - density directive, expander moves, guards Records Paul's 2026-08-01 directive: landing's one job is attract + route to Lesson 1.1; shuffle demo 1 density is the target; native <details> expanders allowed (un-kills 40.25's modules-collapse item, which assumed JS was needed). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course-landing): L5 module cards - lesson lists into native <details>, compact card face Per 40.26: visible card = badge, title, Output line, one-line leave-with, Start Module N link, Mia walkthrough row. Lesson list + Start-here router + template rows move inside a closed-by-default <details><summary>N lessons</summary> (still on-page for SEO/anchors). No JS. V2.3 two-col grid deleted (no second column left to balance; also removes its module-4/5 void workaround). Landing journey test updated: opening the expander is now part of the flow. 4-criteria (1280x800 + 390x844, closed + open states): (1) great look YES - cards read as compact tiles, expander box matches the card system; (2) functional YES - opens cleanly both viewports, lesson links tappable, zero console errors; (3) earns next scroll YES - all 5 modules now fit ~3 screens instead of a wall; (4) helpful YES - Output + leave-with orient, detail on demand. Gates: hugo-build exit 0, qtest --changed green (viewport baselines unchanged - hero untouched). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course-landing): L5 NOT-cover - two-col exclusion list + one why-details Per 40.26: the seven exclusions become a tight two-column list; the why-excluded explanations (with their outbound links, all kept) move into one closed <details>Why these are out</details>. FAQ checked - it does not carry these, so nothing duplicated. Labels inside the details are cut-only shortenings of the original bold leads. 4-criteria (1280x800, closed + open): (1) YES - list scans in one glance, expander box matches the module-card system; (2) YES - opens cleanly, links intact; (3) YES - section shrank from a 7-paragraph wall to half a screen (page 8506px -> 8235px); (4) YES - qualify-out info stays one click away. Gates: hugo-build exit 0, qtest --changed green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course-landing): L5 prose diet - router merge, module-map preamble halved, stub merge Per 40.26 move 3, cut/merge only: the two post-intro router lines merge into one paragraph; the module-map preamble drops the Founder-OS elaboration and artifact-count restatement (hero card carries the stat; pack-index link kept); the Already-started-building stub drops its throat-clearing opener and merges to two routing sentences. Protected content untouched: hero + Free line, checkpoint sentence, Take/Skip-if (YC in place), 95-word Who-built, mistake cards, stub H2s byte-identical, endcap. Prose words (tags stripped): 1655 -> 1636. Visible-by-default words on the rendered page: 1226 vs 1770 with all expanders open (-31% on screen). 4-criteria (1280x800 + 390x844 full-page walk): (1) YES; (2) YES - anchors, Mia links, mistake deep links all visible and live; (3) YES - page now ~8035px at 1280w, five compact module tiles; (4) YES - density tracks shuffle demo 1. Gates: hugo-build exit 0; qtest correctly reports no visual-affecting changes (markdown-prose-only diff). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(2605): 40.26 amendments - demo 1 = ideal reference (persisted capture), decided items Records Paul's demo-1-as-ideal directive with the durable full-page capture (shuffle URLs are ephemeral), the modules-3-5 group decision (anchor-safe, rg-verified), the hero-card title cut, the sanctioned verdict chip, and the skips with reasons (gradient H1 kill condition, section-order conflict, worktree-vacuous dtest). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course-landing): modules 3-5 grouped behind one card-summary details (demo 1 #8) Modules 1-2 stay visible compact cards; 3-5 collapse into one native <details> whose summary renders as a card: 'MODULES 3-5 · Design, build, first customer' + ruby chevron (site-wide summary::before triangle suppressed for this element only). Anchor-safe: zero inbound links to #module-2..5 (rg-verified); ids remain in DOM and fragment navigation auto-expands details. Summary title is a 4-word cut-merge of the three module titles. No JS. 4-criteria (1280x800, closed + open): (1) YES - reads as one more card in the rail, chevron affords expansion; (2) YES - opens to the three full cards, each with its own lesson expander; (3) YES - page 8035px -> 6834px, module map now ~2 screens; (4) YES - matches the ideal reference's collapsed-group pattern. Gates: hugo-build exit 0, qtest --changed green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(course-landing): hero-card title cut, verdict chip, CSS convergence on demo-1 component spec Per 40.26 amendments: (1) hero course-window card drops the duplicated H1 title - now eyebrow + stat chips + leave-with (cut-only, cold-critic fix); (2) hero chip row gains 'First verdict in 2-3 weeks' (the one sanctioned copy addition; on-page number, two independent panel recommendations); (3) course-list.css converges on docs/design-system/ course-landing-components-2026-08.md: chips -> gray-100 uppercase 12px/600 radius-2 (Free keeps ruby tint), primary CTAs -> spec shadow + hover lift (hero + endcap, old endcap shadow rule deleted), module-card Output -> ruby-tint panel, leave-with -> border-top footer (green panel dropped), badge -> gray-400, card radius 16, timeline rail -> 1px gray-200 with 16px obsidian nodes. Intentional hero change: macos landing baselines (desktop 0.11 / mobile 0.358 diff vs old) re-recorded and committed here; linux pair left for CI. 4-criteria (1280x800 + 390x844): (1) YES - hero reads like the ideal reference, one loud element (ruby CTA); (2) YES - chips wrap 3+2 desktop, stack clean at 360/390, zero console errors; (3) YES - verdict chip gives the first fold a concrete promise; (4) YES - all changes converge on measured spec values, nothing decorative added. Gates: hugo-build exit 0; qtest re-run post-commit (baselines compare vs HEAD). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(2605): 40.26 result capture - final rendered landing at 1280w for side-by-side vs demo 1 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Aug 14, 2026
…, link the claims Completes seo-review-2026-08-13.md §8 actions 7-9 and the proof-wiring half of 20.09 §11. THE REVIEW COUNT WAS WRONG. Action #8 said to verify "4.8/5 by 32 clients" against the live Clutch profile, because reviewCount had no source anywhere in the repo - data/company.yaml:11 cites a rating with no count. Clutch shows **4.8 out of 5 from 9 reviews**. The rating was right; the count was overstated ~3.5x and was published in structured data on ~1,147 URLs. Fixed everywhere it appeared: - enhanced-organization-schema.html: reviewCount 32 -> 9, with the source URL and verification date in a comment so the next person does not have to re-derive it. - home.html: "4.8/5 by 32 clients" -> "4.8/5 on Clutch", linked to the profile. - vibe-code-rescue.html: "Thirty-two clients rated us 4.8 out of 5" -> linked "4.8 out of 5 on Clutch"; hero chip relabelled "Rated on Clutch". A linked rating with no count beats a bigger unverifiable number - that is 20.09 §11's whole thesis. Note data/course_banned_strings.yaml:65 already bans "4.8/5" in course content as a "volatile third-party review score"; the course side had learned this and the marketing side had not. Action #7 - deleted comprehensive-service-schema.html:101-157: the fabricated reviews by "Technology Executive" and "Startup Founder" plus the 4.9/23 aggregateRating that contradicted the site-wide 4.8. Verified in a production build: /services/fractional-cto/ now carries only the sourced 4.8/9 and no invented authors. Action #9 - keepQuotes = true. Verified against a production build: the head now emits rel="canonical", name="description" and type="application/ld+json" quoted. Homepage 124,256 -> 125,988 bytes (+1.4%), inside the threshold. Also dropped "highest in the industry for development agencies" from about-us - an unfalsifiable competitive superlative with no source. The 95% retention figure stays; it is used consistently and is an internal metric. Proof wiring: "weekly reports in plain English" on the homepage now links to the published sample report template. The differentiator was already built and published inside the course - it just was not connected to the claim. vibe-code-rescue needed NO cliche work: it scored zero banned-phrase hits and is the strongest copy on the site (concrete symptoms, real prices, sourced founder quotes). Its only defect was the review count, fixed above. Gates: hugo-build 8/8; test:unit 277 runs 0 failures; qtest 1 screenshot (nav/services) - read it, all six dropdown blurbs and the Clutch link render correctly, no overflow. KNOWN GAP, not introduced here: the homepage services baseline is stale. The new "weekly reports in plain English" link is ~0.24% of the frame and the default screenshot tolerance is 2% (application_system_test_case.rb:87), so the gate passed without re-recording. Small colour/link changes are invisible to this suite by construction. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Aug 14, 2026
…hey were right about (#454) * audit response: disprove third-party SEO claims, groom schema + positioning fixes A third-party AI-SEO tool scored the site 60/100 "Multiple Organ Failure". Verified every claim against the live site and GSC: four of five are false. Documentation only - no code, config, or content changed. The remediation items are groomed and scheduled later. seo-review-2026-08-13.md §8 (new): - Claim-by-claim verdict. Canonical tags, structured data, meta descriptions and host redirects are all correct; GSC returns matching user_canonical and PASS on rich results. - Root cause of the false negatives: minifyOutput=true drops quotes on space-free attribute values (rel=canonical, type=application/ld+json) and the tool's regex parser requires quotes. The tell is that attribute-value checks failed while element-content checks (title, H1) passed. - What the audit missed: comprehensive-service-schema.html:101-157 publishes invented reviews authored by "Technology Executive" and "Startup Founder", plus an aggregateRating that contradicts the site-wide one. Google fake-review policy and FTC exposure; a manual action would be domain-wide. - Three new rows in the §6 action table (delete fabricated reviews, verify the unsourced Clutch review count, add keepQuotes), with keepQuotes explicitly recorded as cosmetic-for-third-party-tools and NOT an SEO fix. 20.09-content-plan-revision-aug-2026.md §11 (new, P4): - The audit's one accurate criticism, substantiated. The hero blames devshops while the copy below uses commodity-devshop language - one sentence in app-web-development/index.md:29 is near-identical to competitor Rubyroid Labs. - These are not industry-standard phrases: thoughtbot and SumatoSoft use none of them, and SumatoSoft states JT's own positioning more plainly. - JT shows less checkable proof than the firms it blames; "4.8/5 by 32 clients" is not even linked to the Clutch profile. - Every proof artifact 90.10 §5 requires already exists inside the course, so the fix is wiring assets to claims, not writing new copy. - Justified against §1's no-content-sprint constraint: zero new posts. .okf/: build/hugo-build.md gains the minified-attribute trap (incl. that config/test/hugo.toml disables minification, so the suite is blind to it by construction); log.md and build/index.md updated. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * copy: replace commodity-agency language with the actual mechanic (SPRINT-001) The homepage hero blames devshops ("Your dev shop stopped delivering") while every card below it used the same language as the devshops we compete against. One sentence in app-web-development was near-identical to Rubyroid Labs, named in 90.10 §8b as a dangerous competitor. Full finding: 20.09 §11. TDD, and the test earned its keep immediately: RED - test/unit/marketing_copy_test.rb, a ratchet for marketing surfaces (same idea as data/course_banned_strings.yaml, which only covers content/course/**). First run found 28 violations - roughly 18 more than a manual grep had, in files nobody had flagged: 5 more "empower" in the use-case body, a second "trusted technology partner", "top-caliber" in services.html, "empowering" in careers.html. GREEN - 28 -> 0. Every blurb rewritten in lockstep across all 3-4 copies: config/_default/hugo.toml menu names, content frontmatter descriptions, home.html and page/services.html hardcoded prose. No data binding exists between them - home.html:472 had ALREADY diverged from config, which is what duplicated copy does when nobody is watching. The rewrite rule: replace the promise with the mechanic. "Get on-demand access to a CTO to help guide your technical vision" -> "A senior engineer reviews your codebase and your team, then tells you in plain English what to fix first. $5K-$15K/month, starting in days." Self-checked against 90.11 §3 banned structural patterns: cut a rule-of-three in the CTO card, trimmed triads inherited from existing copy, dropped a negative-parallelism close and a cute-flourish close, and used the "48 hours" anchor once rather than stamping it on three cards. Two false positives fixed by making the gate precise, not weaker: menu `identifier =` and `cover_image:` asset filenames legitimately keep banned words, since renaming them would mean redirect bridges or asset churn. "Empower an Existing Engineering Team" -> "Extend an Existing Engineering Team" as a display title only. The slug stays - a URL change would need a redirect bridge, which the repo forbids. Gates: marketing_copy_test RED->GREEN; bin/rake test:unit 277 runs 0 failures; bin/hugo-build 8/8 validators. bin/qtest --changed flagged 3 screenshots (homepage/_services, services/_overview, services/_services) - exactly the edited sections. Read both renders: copy is shorter (CTO 5->4 lines, App/Web 4->3), grid pulls up ~28px, link raggedness tightened from 35px to 22px spread, no clipping or overflow. Accepted; macOS baselines updated here. Linux baselines still stale - the dtest leg runs before the PR opens. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * test: record Linux baselines for the 3 changed service sections FORCE_SCREENSHOT_UPDATE=1 bin/dtest re-recorded all 45 Linux baselines, not just the 3 that changed - the other 42 are sub-tolerance Rosetta pixel drift that bin/dtest normally discards via `git checkout -- .../linux` on a green run. Committing all 45 would bake emulated-Docker drift into the baselines. Kept only the 3 the copy change actually moved (homepage/_services, services/_overview, services/_services) and restored the rest. Verified the Linux render against the macOS one: same copy, same layout, wider font metrics wrap the intro paragraph to 5 lines instead of 4, which is the expected platform difference. Linux suite: 34 runs, 87 assertions, 0 failures. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * schema+proof: delete fabricated reviews, correct a false review count, link the claims Completes seo-review-2026-08-13.md §8 actions 7-9 and the proof-wiring half of 20.09 §11. THE REVIEW COUNT WAS WRONG. Action #8 said to verify "4.8/5 by 32 clients" against the live Clutch profile, because reviewCount had no source anywhere in the repo - data/company.yaml:11 cites a rating with no count. Clutch shows **4.8 out of 5 from 9 reviews**. The rating was right; the count was overstated ~3.5x and was published in structured data on ~1,147 URLs. Fixed everywhere it appeared: - enhanced-organization-schema.html: reviewCount 32 -> 9, with the source URL and verification date in a comment so the next person does not have to re-derive it. - home.html: "4.8/5 by 32 clients" -> "4.8/5 on Clutch", linked to the profile. - vibe-code-rescue.html: "Thirty-two clients rated us 4.8 out of 5" -> linked "4.8 out of 5 on Clutch"; hero chip relabelled "Rated on Clutch". A linked rating with no count beats a bigger unverifiable number - that is 20.09 §11's whole thesis. Note data/course_banned_strings.yaml:65 already bans "4.8/5" in course content as a "volatile third-party review score"; the course side had learned this and the marketing side had not. Action #7 - deleted comprehensive-service-schema.html:101-157: the fabricated reviews by "Technology Executive" and "Startup Founder" plus the 4.9/23 aggregateRating that contradicted the site-wide 4.8. Verified in a production build: /services/fractional-cto/ now carries only the sourced 4.8/9 and no invented authors. Action #9 - keepQuotes = true. Verified against a production build: the head now emits rel="canonical", name="description" and type="application/ld+json" quoted. Homepage 124,256 -> 125,988 bytes (+1.4%), inside the threshold. Also dropped "highest in the industry for development agencies" from about-us - an unfalsifiable competitive superlative with no source. The 95% retention figure stays; it is used consistently and is an internal metric. Proof wiring: "weekly reports in plain English" on the homepage now links to the published sample report template. The differentiator was already built and published inside the course - it just was not connected to the claim. vibe-code-rescue needed NO cliche work: it scored zero banned-phrase hits and is the strongest copy on the site (concrete symptoms, real prices, sourced founder quotes). Its only defect was the review count, fixed above. Gates: hugo-build 8/8; test:unit 277 runs 0 failures; qtest 1 screenshot (nav/services) - read it, all six dropdown blurbs and the Clutch link render correctly, no overflow. KNOWN GAP, not introduced here: the homepage services baseline is stale. The new "weekly reports in plain English" link is ~0.24% of the frame and the default screenshot tolerance is 2% (application_system_test_case.rb:87), so the gate passed without re-recording. Small colour/link changes are invisible to this suite by construction. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * test: record Linux nav baseline for the rewritten service dropdown Same FORCE_SCREENSHOT_UPDATE triage as the previous baseline commit: the flag re-recorded all 45 Linux baselines, so only nav/services.png - the one the menu rewrite actually moved - was kept and the rest restored. Linux suite: 34 runs, 87 assertions, 0 failures. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs+okf: close audit actions 7-9, record the tolerance false-green seo-review §8.2b records the outcome: the Clutch verification found the review count was wrong (9, not 32), not merely unsourced. OKF test-gates gains two caveats found while shipping this - the 2% tolerance that lets small text and colour changes pass without re-recording a baseline, and the FORCE_SCREENSHOT_UPDATE flag that re-records all 45 Linux baselines instead of the few a change actually moved. /okf:validate .okf --strict - conformant. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: correct the review count the first pass missed, and ratchet it PR review caught that "Based on 32 client reviews" was still rendering in themes/beaver/layouts/partials/seo/../page/testimonials.html - the false count survived the first fix because it was worded three different ways in three files ("4.8/5 by 32 clients", "Thirty-two clients rated us", "Based on 32 client reviews") and my first grep only matched two of them. It now reads "Based on verified Clutch reviews", linked to the profile. Encoded in the gate so it cannot come back: marketing_copy_test gains "32 client", "by 32" and "thirty-two clients" as a factual ratchet (not a voice rule), plus EXTRA_SURFACES so the shared testimonials partial is scanned - it renders the rating block but is not a marketing prose page, so the glob patterns missed it. Also matched the repo's external-link convention: the Clutch links had rel="noopener" without target="_blank", which makes the rel pointless and sends visitors off-site mid-page. clients/single.html pairs both; these now do too. Verified the rendered JSON-LD still parses after adding a Hugo comment inside the schema literal - both blocks valid (Organization, FAQPage). Baselines: services/_testimonials-header updated on both platforms. The section is captured by element bounding box, so changing the label's length changes the capture region - that is why it moved on a block I did not otherwise touch, and why CI caught it at 0.0207 when macOS wrapped it under the 2% line locally. Gates: marketing_copy_test green; test:unit 277 runs 0 failures; hugo-build 8/8. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * test: decouple asset-pipeline assertions from the minifier's quoting style CI's Asset Pipeline job failed on three integration tests after keepQuotes was enabled. I broke them, and the cause is the same defect the whole audit investigation was about. tdewolff drops quotes on attribute values with no special characters. So the production HTML emitted `rel=stylesheet`, `as=style` and `crossorigin=anonymous` bare, while `integrity="sha256-..."` stayed quoted because base64 contains / and +. These three tests matched the BARE form as a literal: prod_html.include?("crossorigin=anonymous") %r{<link[^>]*rel=stylesheet[^>]*integrity=[^>]*>} %r{<link[^>]*rel=preload[^>]*as=style[^>]*integrity=[^>]*>} Turning on keepQuotes made every one of them miss - exactly how the third-party audit tool concluded the site had no canonical tag and no structured data. The repo's own suite had the same coupling. Fixed by asserting the shape rather than the minifier setting, per the repo's testing rule ("if a test breaks when you change a knob unrelated to behaviour, the test is testing config"). New `attr(name, value)` helper matches quoted or unquoted. The behaviour under test is unchanged: SRI and crossorigin must be present on production assets, and the assertions still fail if either is actually missing. Note the three tests that kept passing (integrity="sha256-) are the ones whose values were quoted either way - which is the same tell that identified the audit tool's parser: attribute-VALUE matches break, element-content matches survive. Local: 11 runs, 22 assertions, 0 failures (CI was 3 failures). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * okf: record that our own suite carried the minified-attribute defect The keepQuotes trap was documented as an external-tool problem. It was also ours: three integration tests matched unquoted attribute literals and broke when the flag went on. Adds the tell, the fix, and the command to run when touching minify config. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.