Update robots.txt - #9
Merged
Merged
Conversation
pftg
added a commit
that referenced
this pull request
Apr 23, 2026
3-agent review (ICP-E fit, SEO gaps, schedule pacing) identified: - 5 Rails posts scored 1/5 ICP-E relevance - 4 ICP-E pain points had zero posts (#3 transparency, #5 comms, #6 SLA, #7 code ownership) - #19 overlapped #5, #18 expired, #21 speculative, #14 cannibalized Dropped 4 low-ICP posts. Added 4 founder pain-gap replacements: - Weekly Dev Report Template (Pain #3, 44/50) - Dev Shop Contract: Code Ownership (Pain #7, 43/50) - How to Switch Dev Shops (transition, 42/50) - SLA Requirements Checklist (Pain #6, 41/50) Shifted ratio from 7:7:7 to 10:5:6 (Founders:Rails:AI). Swapped #9/#11 dates for Torvalds trend proximity. Published #5 (47 Startups) - trend decay risk from sitting in draft. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pftg
added a commit
that referenced
this pull request
Jul 24, 2026
…plicate archived Every open card is now agent-takeable cold: self-contained body, inputs, done-criteria, and an explicit Requires: line (Paul's browser/approval vs pure agent work). Deps wired (#18/#20/#23 -> #12, #15 -> #7, #25 -> #18+#19, #24 -> #12). #22 archived (duplicated #15+#17). #16/#23 tally overlap split. NEW cards close the funnel gaps: #24 booking -> discovery prep -> 48h audit -> scorecard -> proposal (the conversion step had no card), #25 batches 3+ for openers #9-#25 with holds, #26 warm-referral kit send (optional). 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.