Skip to content

Fix: JetThoughts was founded 2008-09-01, not 2011 - #456

Merged
pftg merged 5 commits into
masterfrom
fix-founding-date-2008
Aug 14, 2026
Merged

Fix: JetThoughts was founded 2008-09-01, not 2011#456
pftg merged 5 commits into
masterfrom
fix-founding-date-2008

Conversation

@pftg

@pftg pftg commented Aug 14, 2026

Copy link
Copy Markdown
Member

JetThoughts was founded 2008-09-01. The site carried 2011, which also made every derived tenure claim three years short.

Two separate defects

config/_default/hugo.toml had a foundingYear param commented "Single source for tenure claims" — but it was wrong, and most claims bypassed it with hardcoded strings. Fixing the param alone would have left "since 2011" on the homepage, the rescue page, three blog posts, and two course pages.

So the fix corrects the value and makes the copies derive from it.

Now derived, not hardcoded

Surface Was Now
Homepage services intro + hero counter "since 2011", data-count="15" derives → 18
Rescue page hero chip + Why-JetThoughts "since 2011" ×2 derives
Organization schema foundingDate "2011" 2008-09-01 (full ISO date)
Service schema "Years of Experience" hardcoded "13+" derives → 18+ (13 matched neither year)

Literal fixes where Hugo can't interpolate into body prose: content/_index.md (×3), about-us, and the first-person JT claims in blog/course content.

What serena caught that grep didn't

This is the part worth reviewing. A regex sweep across all file types found the wrong year and the wrong review count baked into doctrine files that instruct future work — anyone following them would have re-introduced both:

  • PRODUCT.md — canon said "founded 2011 (tenure claim is 'since 2011')", and its Evidence-on-Hand list approved "4.8/5 rating from 32 clients"
  • docs/business/vision-mission.md — same two errors
  • 2607/warm-intro-referral-kit.md — the tenure instruction read 'Tenure claim is "since 2011" (from foundingYear = 2011 - verifiable)'. Neither verifiable nor correct.
  • 2607/offer-one-pager.md — the source document the rescue landing page was written from
  • 2605/50.02-pilot-outreach-campaign-kit.md — the claims whitelist
  • Plus site content my greps missed: use-cases/startup-mvp-prototyping-development (13+ ×2), services/talent-recruiting-training (13+), and two blog posts claiming JT has "15+ years of Rails expertise"

Deliberately NOT changed

"32 clients" means two different things. In warm-intro-referral-kit and assumptions-register it means total clients served — plausible for an 18-year-old firm — not Clutch reviews. The site's old "4.8/5 by 32 clients" conflated the two, which is precisely how an unsourced number looked sourced. I corrected the review-count usages and left the client-count ones.

⚠️ Flagging, not fixing: the 32-clients-served figure has no in-repo source either.

Also unchanged: "on PyPI since 2011" (a Python package, not us), "15+ years" hire-pool and salary-table references, fractional-CTO staff experience (independent of company age), and historical review records / archives / .okf/log.md, which should keep saying what was true at the time.

Ratchets

marketing_copy_test bans since 2011 / founded in 2011. course_banned_strings gains the same two; its existing tenure bans ("since 2005", "20 years") stay valid under a 2008 canon — only their stated reasons were stale.

Deliberately not banning 15+ years: it can't distinguish company tenure from staff experience, and it false-positived on services/fractional-cto immediately. A ban that can't tell those apart is noise.

Judgement call → RESOLVED

Paul's personal experience read "15+ years", which contradicted founding an already-seasoned career in 2008. I first set it to 18+ as the conservative floor; Paul confirmed his first professional role was 2004, so it is now 22+. See the scope-grew section below.

Verification

Production build confirms: foundingDate: 2008-09-01, 18+ years, 18+ Years Industry Experience, service schema "18+", homepage data-count="18", since 2008 ×3.

  • bin/hugo-build — 8/8 validators
  • bin/rake test:unit — 277 runs, 0 failures
  • hugo_pipeline_test — 11 runs, 0 failures
  • bin/qtest --changed — 53 screenshots, no failures

⚠️ Note on that last one: the visible changes here (1518, 20112008) are two-character edits, far under the 2% screenshot tolerance — the visual gate could not have caught them either way. The production-build check is the real verification.

🤖 Generated with Claude Code


Scope grew after review — four more findings

Founder experience ≠ company tenure

Paul's first professional role was 2004, so 22+ years — distinct from company tenure (2008 / 18 years). about-us and authors.yaml corrected. The "18+ years delivering startup MVPs" in the about-us description stays: that one is the company.

Real review counts, audited

Platform Rating Reviews
Clutch 4.8 9
GoodFirms 5.0 1
Google 5.0 1

Real total: 11 across three platforms — "32" is unsupported on any reading. Clutch is the one worth citing (deepest source, public sub-scores: Quality 4.9 · Schedule 4.9 · Cost 4.7 · Refer 5.0). Recorded in the claims canon.

Notably, Clutch independently lists "Year founded: 2008" — the review platform had our founding date right while we did not.

The ratchet had a hole

A Lighthouse/snapshot sweep found "Take You to the Next Level" live in the careers <h1> — a phrase marketing_copy_test bans and reported clean on.

Two compounding bugs. The template wraps prose, so the phrase straddled a line break and line-by-line matching never saw it. Then scrub ate the evidence: Level?</span contains a slash, and stripping slash-tokens wholesale deleted the word along with the tag.

Fixed both — scrub now strips Hugo expressions and HTML tags before path tokens, and a new wrapped_hits pass matches the whitespace-collapsed file. Verified by watching it go RED on the careers h1 before the copy changed.

A test was enforcing the banned phrase. testimonial_shortcode_test pinned the literal string "Looking for a Team to Take You to the Next". Two gates cannot disagree about the same string. Its own comment says the intent is "the page renders successfully", so it now asserts shape — exactly one non-empty h1.

Three more defects from the same sweep

  • Nested <main>careers.html carried role="main" inside baseof's <main>. Two landmarks on one page, and almost certainly the Agentic Browsing score of 50 when every other page scores 100.
  • "John Doe" hardcoded as testimonial image title while frontmatter attributes the quote to a real person. Now reads from .Params.testimonial.name.
  • Careers h1 rewritten off the cliché.

Channel voice model

90.11 §1b — each channel gets its own register (website / blog / course / LinkedIn), all share the anti-slop core. Records the enforcement asymmetry honestly: word-level bans are mechanised, structural patterns are review-only, and review under-counts.

Lighthouse, live site, mobile

Page SEO Best Practices A11y Agentic
/ 100 100 94 100
/services/vibe-code-rescue/ 100 100 93 100
/about-us/ 100 100 93 100
/careers/ 100 100 91 50 → fixed here

Zero console errors on every page. Careers agentic score re-checks after deploy.

pftg and others added 2 commits August 14, 2026 12:41
The site carried 2011 as the founding year, which also made every derived
tenure claim three years short. Corrected to 2008-09-01 and, more importantly,
made the hardcoded copies derive from the single source so it cannot drift
again.

There were two separate defects. The canonical value in
config/_default/hugo.toml was wrong, AND most tenure claims bypassed it with
hardcoded strings - so fixing the param alone would have left "since 2011" on
the homepage, the rescue page, three blog posts and two course pages.

Now derived from site.Params.foundingYear / foundingDate:
- home.html services intro and the hero counter (rendered 15, now 18)
- vibe-code-rescue hero chip and Why-JetThoughts paragraph
- organization-data.html + enhanced-organization-schema.html foundingDate,
  now the full ISO date 2008-09-01 rather than a bare year
- comprehensive-service-schema.html "Years of Experience" (was hardcoded
  "13+", which matched neither 2011 nor 2008)

Literal fixes where Hugo cannot interpolate into body prose: content/_index.md
(3), about-us, and the blog/course first-person claims.

Ratchets updated so the old year cannot return: marketing_copy_test bans
"since 2011" / "founded in 2011"; course_banned_strings gains the same two and
its existing tenure entries had their reasons corrected - those bans ("since
2005", "20 years") stay valid under a 2008 canon, only their stated reason was
stale.

Two judgement calls worth reviewing:

1. Paul's personal experience read "15+ years" in about-us and authors.yaml.
   Founding an already-seasoned career in 2008 makes that internally
   contradictory, so both now read 18+. If the real figure is higher, correct
   it - I picked the conservative floor implied by the founding date.
2. NOT changed: "on PyPI since 2011" in a course SVG (a Python package, not
   us), and "15+ years of industry experience" for fractional CTOs in
   services/fractional-cto - that is staff experience, independent of when the
   company was founded. The ratchet deliberately does not ban "15+ years" for
   the same reason: it cannot tell company tenure from staff experience.

Verified in a production build: foundingDate 2008-09-01, "18+ years", "18+
Years Industry Experience", service schema value "18+", homepage counter
data-count="18", "since 2008" x3.

Gates: hugo-build 8/8; test:unit 277 runs 0 failures; hugo_pipeline_test 11
runs 0 failures; qtest 53 screenshots no failures - though note the visible
changes here (15->18, 2011->2008) are 2-character edits far under the 2%
screenshot tolerance, so the visual gate could not have caught them either
way. The production-build check above is the real verification.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…h kits

serena's regex sweep found what grep missed - the wrong year and the wrong
review count were not just on the site, they were baked into the doctrine
files that instruct future work. Anyone following PRODUCT.md or the 2607 kits
would have re-introduced both.

Canon corrected:
- PRODUCT.md: founded 2008-09-01, tenure derives from site.Params.foundingYear.
  Its Evidence-on-Hand list also carried "4.8/5 rating from 32 clients" as an
  approved claim - now "4.8/5 on Clutch" with an explicit rule not to state a
  review count, because 32 was unsourced and the real figure is 9.
- docs/business/vision-mission.md: same two corrections.
- 2607 warm-intro-referral-kit: the tenure instruction itself said 'Tenure
  claim is "since 2011" (from foundingYear = 2011 - verifiable)'. It was
  neither verifiable nor correct.
- 2607 offer-one-pager (the source the rescue landing page was written from),
  customer-profile-four-forces, objection-followup-bank.
- 2605 pilot-outreach-campaign-kit claims whitelist.

Site content serena caught that my greps had not:
- use-cases/startup-mvp-prototyping-development (13+ x2)
- services/talent-recruiting-training (13+)
- two blog posts asserting JT has "15+ years of Rails expertise"

Deliberately NOT changed, because they are different claims:
- "32 clients" in warm-intro-referral-kit and assumptions-register means TOTAL
  CLIENTS SERVED, not Clutch reviews - a company of 18 years plausibly has 32
  clients. The site's old "4.8/5 by 32 clients" conflated the two, which is
  how an unsourced number looked sourced. Flagging rather than editing: the
  32-clients-served figure has no in-repo source either.
- "on PyPI since 2011" (a Python package), the 15+ years hire-pool and
  salary-table references, and fractional-CTO staff experience.
- Historical review records (40.21, 40.24, archives, .impeccable critiques)
  and 20.09 §11 / .okf/log.md, which document the defect and should keep
  saying what was true at the time.

Gates: hugo-build 8/8; test:unit 277 runs 0 failures; marketing_copy_test green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@pftg, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 71 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c236cf69-54c1-4925-99e1-a05ead93845b

📥 Commits

Reviewing files that changed from the base of the PR and between 068353b and cb8a973.

📒 Files selected for processing (35)
  • .okf/build/hugo-build.md
  • .okf/content/claims-canon.md
  • .okf/content/index.md
  • .okf/content/voice-rules.md
  • .okf/log.md
  • PRODUCT.md
  • config/_default/hugo.toml
  • content/_index.md
  • content/blog/2025/complete-guide-ruby-rails-ai-integration-2025.md
  • content/blog/asked-simple-admin-panel-built-spaceship/index.md
  • content/blog/cheap-developers-expensive-without-cto-review/index.md
  • content/blog/dev-shop-sla-requirements-checklist/index.md
  • content/blog/ruby-on-rails-development-cost-guide-2025/index.md
  • content/course/tech-for-non-technical-founders-2026/first-paying-customer-operating-kit/index.md
  • content/course/tech-for-non-technical-founders-2026/how-this-course-works/index.md
  • content/pages/about-us/index.md
  • content/services/talent-recruiting-training/index.md
  • content/use-cases/startup-mvp-prototyping-development/index.md
  • data/authors.yaml
  • data/course_banned_strings.yaml
  • docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md
  • docs/business/vision-mission.md
  • docs/projects/2605-tech-for-non-technical-founders/50-59-execution/50.02-pilot-outreach-campaign-kit.md
  • docs/projects/2607-vibe-code-rescue/rescue-sprint/customer-profile-four-forces.md
  • docs/projects/2607-vibe-code-rescue/rescue-sprint/objection-followup-bank.md
  • docs/projects/2607-vibe-code-rescue/rescue-sprint/offer-one-pager.md
  • docs/projects/2607-vibe-code-rescue/rescue-sprint/warm-intro-referral-kit.md
  • test/unit/marketing_copy_test.rb
  • test/unit/testimonial_shortcode_test.rb
  • themes/beaver/layouts/home.html
  • themes/beaver/layouts/page/careers.html
  • themes/beaver/layouts/page/vibe-code-rescue.html
  • themes/beaver/layouts/partials/seo/comprehensive-service-schema.html
  • themes/beaver/layouts/partials/seo/enhanced-organization-schema.html
  • themes/beaver/layouts/partials/seo/shared/organization-data.html

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

pftg and others added 3 commits August 14, 2026 12:48
…stamp

maintain pass for the 2008 founding-date correction.

The bundle had no concept stating the founding date, tenure rule, or rating
claims - and this session proved that absence was the defect. The canon lived
scattered across PRODUCT.md, docs/business/vision-mission.md and five 2607/2605
outreach docs, each free to drift, which is exactly how "since 2011" survived
for years alongside a "13+ years" that matched neither year.

New concept content/claims-canon.md, modelled on course-canon.md: the canonical
table (founding 2008-09-01, derive tenure, 4.8/5 on Clutch with no review
count, 95% retention, 5-year relationships, 8+ years developers), the rules
behind them, where they are ratcheted mechanically, and the list of docs that
repeat the canon so the next correction sweeps the instruction layer too.

Records the "32 clients" ambiguity explicitly - false as a review count, but
plausible-and-unsourced as total clients served. Conflating the two is how an
unsourced number passed as sourced.

Also migrates build/hugo-build.md off the v0.1 `timestamp` field I added on
2026-08-13 to the v0.2 `generated` family, with an honest actor - I edited that
concept twice this session, so the stamp is mine, not a back-stamp.

/okf:validate .okf --strict - conformant, zero errors.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… sweep found

Paul's experience: first professional role 2004, so 22+ years - distinct from
company tenure (2008/18 years). about-us and authors.yaml corrected; the "18+
years delivering startup MVPs" in the about-us description stays, because that
one IS the company.

Review counts, audited across every public platform. The real total is 11, not
32, on any reading:
  Clutch 4.8 (9) · GoodFirms 5.0 (1) · Google 5.0 (1) · Techreviewer aggregates
Clutch is the one worth citing - deepest single source, public sub-scores.
Recorded in the claims canon. Clutch also independently lists "Year founded:
2008", so the review platform had our founding date right while we did not.

THE GATE HAD A HOLE. A lighthouse/snapshot sweep found "Take You to the Next
Level" live in the careers <h1> - a phrase marketing_copy_test bans and
reported clean on. The template wraps prose, so the phrase straddled a line
break and line-by-line matching never saw it. Worse, `scrub` then ate the
evidence: "Level?</span" contains a slash, and stripping slash-tokens wholesale
deleted the word with the tag.

Fixed both: scrub now strips Hugo expressions and HTML tags BEFORE path
tokens, and a new wrapped_hits pass matches against the whitespace-collapsed
file so a phrase split across lines is still caught. Verified by watching it go
RED on the careers h1 before the copy was changed.

A test was also ENFORCING the banned phrase: testimonial_shortcode_test pinned
the literal string "Looking for a Team to Take You to the Next". Two gates
cannot disagree about the same string. Its own comment says the intent is "the
page renders successfully", so it now asserts the shape - exactly one non-empty
h1 - per the repo rule about not testing configuration.

Three more defects from the same sweep:
- Nested <main>: careers.html carried role="main" inside baseof's <main>, two
  landmarks on one page. Removed. This was almost certainly the Agentic
  Browsing score of 50 - every other page scores 100.
- "John Doe" hardcoded as the testimonial image title while the frontmatter
  attributes the quote to a real person; now reads from
  .Params.testimonial.name.
- Careers h1 rewritten off the cliche.

Lighthouse (mobile, live site) after: home SEO 100 / BP 100 / a11y 94 ·
vibe-code-rescue 100/100/93 · about-us 100/100/93 · careers 100/100/91. Zero
console errors on every page. Careers agentic-browsing re-checks after deploy.

Gates: hugo-build 8/8; test:unit 277 runs 0 failures; qtest 53 screenshots no
failures; marketing_copy_test RED->GREEN on the wrapped phrase.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Each channel gets its own voice; all channels share the anti-slop core. One
house voice flattened across four channels is how the site ended up sounding
like a whitepaper below a hero that sounded like a person.

90.11 gains section 1b: a register table for website / blog / course /
LinkedIn with each one's signature move, then the explicit list of what never
varies - banned words, banned structural patterns, the who/show/practitioner
tests, sourced numbers. A shorter register is not a licence to slop; marketing
copy is where tells hide best because nobody reads a 20-word card closely
enough to spot a rule of three inside it.

Also records the enforcement asymmetry honestly: word-level bans are
mechanised, the structural patterns where this guide says the real tells live
are still review-only, and review under-counts - a test found ~18 more than a
careful read, and a wrapped phrase hid from the gate entirely until the matcher
was fixed. Treat any review-only rule as advisory until it has a test.

.okf/content/voice-rules.md mirrors the model and links the claims canon.

/okf:validate .okf --strict - conformant.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@pftg
pftg merged commit ddbeba6 into master Aug 14, 2026
6 checks passed
@pftg
pftg deleted the fix-founding-date-2008 branch August 14, 2026 11:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant