Skip to content

Update robots.txt - #9

Merged
pftg merged 1 commit into
masterfrom
dg-robots-txt
May 24, 2024
Merged

pftg merged 1 commit into
masterfrom
dg-robots-txt

Conversation

@dgorodnichy

Copy link
Copy Markdown
Collaborator

No description provided.

@pftg
pftg merged commit 1d5bb2a into master May 24, 2024
@pftg
pftg deleted the dg-robots-txt branch May 24, 2024 10:11
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>
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.

2 participants