Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .okf/build/hugo-build.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ description: Canonical build + validation entry point; runs Hugo plus the course
resource: bin/hugo-build
tags: [build, hugo, validation]
generated:
by: process:okf-migrate
at: 2026-07-19T12:00:00Z
timestamp: 2026-08-13T00:00:00Z
by: claude/opus-5
at: 2026-08-14T00:00:00Z
---

`bin/hugo-build` builds the site into `_dest/public-dev/` (repo-root
Expand Down
114 changes: 114 additions & 0 deletions .okf/content/claims-canon.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
---
type: Reference
title: Company claims canon
description: The single source of truth for every factual claim JetThoughts makes about itself - founding date, tenure, ratings, retention. Any surface contradicting these is defective.
tags: [claims, canon, consistency, marketing, trust]
status: stable
generated:
by: claude/opus-5
at: 2026-08-14T00:00:00Z
sources:
- id: hugo-config
resource: config/_default/hugo.toml
title: Site params - foundingYear / foundingDate
- id: clutch
resource: https://clutch.co/profile/jetthoughts
title: JetThoughts Clutch profile
- id: product-md
resource: PRODUCT.md
title: Product canon - Evidence on Hand
---

# Canonical values

| Fact | Canon | Source |
|---|---|---|
| Founding date | **2008-09-01** | [^hugo-config] |
| Tenure phrasing | "since 2008" - **derive**, never hardcode | [^hugo-config] |
| Years of experience | `now.Year - foundingYear` (18 in 2026) | [^hugo-config] |
| Rating | **4.8/5 on Clutch**, with the profile linked | [^clutch] |
| Review count | **State none**, or "9 verified Clutch reviews" | [^clutch] |
| Founder experience | 22+ years (first job 2004) - distinct from company tenure | [^founder] |
| Client retention | ~95% | [^product-md] |
| Average client relationship | 5 years | [^product-md] |
| Developer experience | 8+ years average | [^product-md] |

# Rules

**Derive tenure, never hardcode it.** Use `since {{ site.Params.foundingYear }}`
or `{{ sub now.Year (int site.Params.foundingYear) }}+ years`. The 2026-08-14
correction found the year wrong in eight places precisely because each had
hardcoded its own copy instead of reading the param.

**A number with no in-repo source is a defect, not a detail.** `reviewCount: 32`
shipped in structured data on ~1,147 URLs for years with nothing backing it; the
real figure was 9. Before publishing a number, name where it comes from.

**Prefer a linked claim over a bigger unlinked one.** "4.8/5 on Clutch" with the
profile linked beats "4.8/5 by 32 clients" unlinked. The link is the proof, and
it cannot go stale the way a transcribed count does.

**"32 clients" is ambiguous - do not treat the two meanings as one.** As a
*review* count it is false. As *total clients served* it appears in the 2607
referral and assumptions docs and is plausible for an 18-year-old firm, though it
has no in-repo source either. The old site copy "4.8/5 by 32 clients" conflated
them, which is how an unsourced number passed as sourced.

# Verified review counts (2026-08-14 audit)

Every public review platform was checked. **The real total is 11 across three
platforms** - not 32, on any reading.

| Platform | Rating | Reviews |
|---|---|---|
| [Clutch](https://clutch.co/profile/jetthoughts) | 4.8 | **9** |
| [GoodFirms](https://www.goodfirms.co/company/jetthoughts-llc) | 5.0 | 1 |
| Google | 5.0 | 1 |
| [Techreviewer](https://techreviewer.co/companies/jetthoughts) | score 5.0 | aggregates the above |

Clutch is the one worth citing: 9 verified reviews is the deepest single source,
and its sub-scores are public (Quality 4.9 · Schedule 4.9 · Cost 4.7 · Willing to
Refer 5.0). GoodFirms and Google are single reviews - real, but too thin to lead
with.

**Clutch independently lists "Year founded: 2008"**, and its case studies span
2008-2024. The review platform had the founding date right while our own site
said 2011.

**Never claim "20 years."** Founded 2008; the honest figure is 18 and rising.

# Enforcement

These are ratcheted mechanically, not by review — manual sweeps under-count
badly (the 2026-08-14 pass found ~18 more violations by test than by careful
grep):

- [Banned-strings ratchet](/content/banned-strings-ratchet.md) covers
`content/course/**` and bans "since 2011", "founded in 2011", "since 2005".
- `test/unit/marketing_copy_test.rb` covers the marketing surfaces (config menu
names, `content/services`, `content/use-cases`, `content/pages`, the home and
page templates, the shared testimonials partial) and bans the stale tenure and
false-count spellings.
- Deliberately **not** banned: "15+ years". It cannot distinguish company tenure
from staff experience ("our fractional CTOs average 15+ years") and
false-positives immediately. A ban that cannot tell those apart is noise.

# Where this canon is repeated

Correcting a published fact means sweeping the **instruction layer**, not just
the output. In 2026-08-14 the wrong founding year and review count were baked
into docs that tell future writers what to claim:
`PRODUCT.md`, `docs/business/vision-mission.md`,
`docs/projects/2607-vibe-code-rescue/rescue-sprint/` (offer-one-pager,
warm-intro-referral-kit, customer-profile-four-forces, objection-followup-bank),
and `docs/projects/2605-.../50.02-pilot-outreach-campaign-kit.md`. Anyone
following them would have re-introduced both.

[^hugo-config]: `config/_default/hugo.toml` - `foundingYear = 2008`,
`foundingDate = "2008-09-01"`. The commented single-source-of-truth param.
[^clutch]: <https://clutch.co/profile/jetthoughts> - 4.8/5 from 9 reviews,
verified 2026-08-14.
[^product-md]: `PRODUCT.md` §Evidence on Hand - the sourced-numbers-only policy.
[^founder]: Paul Keen's first professional role was in 2004 (stated by Paul,
2026-08-14). Company tenure (2008) and founder experience (2004) are
separate claims - do not conflate them.
1 change: 1 addition & 0 deletions .okf/content/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@

* [Course structure](course-structure.md) - the 5-module spine, Going Further set, and course_sequence.yaml
* [Course canon](course-canon.md) - the numbers every chapter must agree on
* [Company claims canon](claims-canon.md) - founding date, tenure, rating; what JetThoughts may assert about itself and where it is ratcheted
* [Voice rules](voice-rules.md) - Sam voice, banned patterns, and the em-dash rule
* [Banned-strings ratchet](banned-strings-ratchet.md) - how fixed prose defects stay fixed
10 changes: 10 additions & 0 deletions .okf/content/voice-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@ Full guides: `docs/90-99-content-strategy/strategy-analysis/90.11-voice-guide.md
and the course-specific rules in `CLAUDE.md`. This concept records the
rules that recur in review sprints.

**Channel registers (Paul, 2026-08-14).** Each channel gets its own voice; all
channels share the anti-slop core. Website is plain and load-bearing with every
claim showing a mechanic or linking proof; blog teaches with worked examples;
course is patient and second-person with first-mention glossing (this concept);
LinkedIn is first-person and committed - Register B, hammering one idea. What
never varies: the banned words, the banned structural patterns, the
who/show/practitioner tests, and sourced numbers
([claims canon](claims-canon.md)). A shorter register is not a licence to slop.
Full table in 90.11 §1b.

# Core rules

- **Write for Sam, not Paul.** Sam is an idea-stage non-technical founder.
Expand Down
27 changes: 27 additions & 0 deletions .okf/log.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Bundle Update Log

## 2026-08-14 (canon) - the founding year was wrong, and so was the instruction layer

* **Update**: new concept [company claims canon](/content/claims-canon.md);
`content/index.md` refreshed; `build/hugo-build.md` migrated off the legacy
`timestamp` field to `generated`.
* **The finding**: JetThoughts was founded **2008-09-01**, not 2011. The site
had carried 2011 for years, which also made every derived tenure claim three
short (a hardcoded "13+ years" in service schema matched *neither* year).
Two defects, not one: the canonical `foundingYear` param was wrong AND most
claims bypassed it with their own hardcoded copy, so fixing the param alone
would have left "since 2011" in eight places.
* **The bigger finding**: the wrong year and the false "32 clients" review count
were baked into the **instruction layer** - `PRODUCT.md` canon,
`docs/business/vision-mission.md`, four 2607 rescue-sprint docs, and the 2605
outreach claims whitelist. One literally read *'Tenure claim is "since 2011"
(from `foundingYear = 2011` - verifiable)'*. It was neither. Anyone following
those docs would have re-introduced both.
* **The rule**: when correcting a published fact, sweep the instruction layer,
not just the output layer. And derive - never hardcode - anything with a
canonical param behind it.
* **Tooling note**: serena's `search_for_pattern` regex found seven files that
targeted greps missed. qmd was the wrong instrument for an exact-literal hunt
(semantic/BM25 over markdown returns topically-related docs, not literal
matches) - use qmd for "what do we say about X", serena for "find every
occurrence of this string". Recorded in [test gates](/build/test-gates.md)'s
sibling lesson about mechanical ratchets beating manual review.

## 2026-08-14 (claims) - the number nobody had a source for was wrong

* **Update**: `.okf/build/test-gates.md` gains the 2% tolerance false-green and
Expand Down
5 changes: 3 additions & 2 deletions PRODUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,13 @@ The visitor typically lands from a personal outreach reply, a Reddit/IndieHacker

- **JetVelocity design system** (binding, canonical: `.stitch/design.md`): obsidian dark, Ruby red `#cc342d` as the brand accent ink, neon purple `#a855f7`. Ruby red is the accent, not decoration.
- Voice: plain-English practitioner, Rob Walling directness + Rand Fishkin vulnerability for founder-facing copy; no therapist voice, no slogans.
- Name/assets: JetThoughts, founded 2011 (tenure claim is "since 2011" — never "20 years").
- Name/assets: JetThoughts, founded **2008-09-01** (tenure claim is "since 2008" — never "20 years"). Derive tenure from `site.Params.foundingYear`; never hardcode the year. Corrected 2026-08-14 — the site and these docs carried 2011 for years.

## Evidence on Hand

Confirmed policy (2026-07-26): **sourced numbers only — nothing beyond these** on any marketing surface:
- 4.8/5 rating from 32 clients · 5-year average client relationships · 95% client retention · shipping Rails since 2011 · developers average 8+ years experience.
- 4.8/5 rating on [Clutch](https://clutch.co/profile/jetthoughts) · 5-year average client relationships · 95% client retention · shipping Rails since 2008 · developers average 8+ years experience.
- **Do not state a review count.** "32 clients" was published for years with no source; the live Clutch profile shows 9 (verified 2026-08-14). Link the profile instead — a linked rating beats a bigger unlinked number.
- **Real verbatim founder quotes** from `docs/projects/2607-vibe-code-rescue/rescue-sprint/voice-of-customer.md` are allowed, appropriately attributed/anonymized.
- **Absence that must not be fabricated** (repo-derived): no completed Vibe-Code-Rescue case study of our own exists yet — first engagement's case study is an Oct 2026 milestone. Surfaces must not imply one. Market examples (e.g. the $40K YC rescue) are third-party evidence and must be labeled as such.

Expand Down
9 changes: 7 additions & 2 deletions config/_default/hugo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,13 @@ disableKinds = []
[params]
email="info@jetthoughts.com"
phone="+1 754 216 9568"
# Single source for tenure claims; matches foundingDate in organization schema.
foundingYear = 2011
# Single source for tenure claims. JetThoughts was founded 2008-09-01
# (corrected 2026-08-14 - the site had carried 2011 for years, which also
# made every derived "N+ years" claim three years short). Anything stating
# tenure must derive from this, not hardcode a year: `since {{ site.Params.foundingYear }}`
# or `{{ sub now.Year (int site.Params.foundingYear) }}+ years`.
foundingYear = 2008
foundingDate = "2008-09-01"
description="JetThoughts's expert team of developers and consultants has helped clients launch highly tailored projects, and we'd love to help you, too."
testimonials_heading = "Most clients stay over 3 years. Some stayed beyond 6."
testimonials_description = "Don't just take our word for it. See what our clients say about our services."
Expand Down
6 changes: 3 additions & 3 deletions content/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ layout: index
description: "We rescue and stabilize Ruby on Rails projects for non-technical founders. Weekly plain-English reports, you own the code, 48-hour start. Free code audit ✓"

headline: Your dev shop stopped delivering. We rescue and stabilize.
excerpt: Senior Ruby on Rails and React teams shipping since 2011. Weekly reports in plain English. You own the code after every milestone.
excerpt: Senior Ruby on Rails and React teams shipping since 2008. Weekly reports in plain English. You own the code after every milestone.

metatags:
image: og-home.jpg
Expand All @@ -27,7 +27,7 @@ faqs:
answer: "JetThoughts ships functional MVPs in 8-12 weeks. Our senior developers (8+ years experience) use proven Rails and React stacks, test-driven development, and fractional CTO oversight, so the code you launch with is code you can keep building on."

- question: "How do I find a reliable Rails development team for my startup?"
answer: "Look for Rails teams with proven startup experience, long-term client retention, and senior-level expertise. JetThoughts has shipped Ruby on Rails products since 2011, keeps 95% of clients, and offers flexible engagement models (fractional teams, full teams, or augmentation). Our Rails developers average 8+ years of experience."
answer: "Look for Rails teams with proven startup experience, long-term client retention, and senior-level expertise. JetThoughts has shipped Ruby on Rails products since 2008, keeps 95% of clients, and offers flexible engagement models (fractional teams, full teams, or augmentation). Our Rails developers average 8+ years of experience."

- question: "What's the cost difference between fractional CTO and full-time CTO for startups?"
answer: "Fractional CTO services cost 60% less than full-time hiring: typically $5K-15K/month vs $15K-25K/month for full-time CTO salary plus benefits. Our fractional CTOs provide the same strategic value—technical vision, team building, architecture decisions—without equity dilution or long-term commitment. Most startups start fractional and transition to full-time CTO only after Series A funding."
Expand All @@ -39,7 +39,7 @@ faqs:
answer: "Yes, our Emergency CTO Leadership service provides immediate technical stabilization when critical team members leave or technical crises arise. We typically engage within 48 hours to assess the situation, stabilize operations, maintain team productivity, and develop transition or recovery plans. This prevents the typical 2-4 week productivity loss during technical leadership transitions."

- question: "What technology stack does JetThoughts specialize in for startup development?"
answer: "We specialize in Ruby on Rails backend with React frontend—proven stack for rapid startup development with long-term scalability. Our team has shipped Rails products since 2011, with expertise in modern JavaScript frameworks (React, Next.js), PostgreSQL databases, cloud deployment (AWS, Heroku, DigitalOcean), and CI/CD automation. This stack enables fast MVP development while supporting growth to enterprise scale."
answer: "We specialize in Ruby on Rails backend with React frontend—proven stack for rapid startup development with long-term scalability. Our team has shipped Rails products since 2008, with expertise in modern JavaScript frameworks (React, Next.js), PostgreSQL databases, cloud deployment (AWS, Heroku, DigitalOcean), and CI/CD automation. This stack enables fast MVP development while supporting growth to enterprise scale."

- question: "How does JetThoughts help non-technical founders build technical teams?"
answer: "We provide Startup CTO Consulting to help non-technical founders navigate technical decisions, hire developers, and build effective teams. Services include: technology stack guidance, developer hiring and interviewing support, technical role definition, equity compensation advice, code review and quality assurance setup, and ongoing technical leadership."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1187,4 +1187,4 @@ At JetThoughts, we've helped 200+ clients integrate AI into production Rails app

---

**About the Author**: The JetThoughts team has 15+ years of Rails expertise and has deployed AI features for clients ranging from early-stage startups to Fortune 500 companies. We specialize in TDD, performance optimization, and production-grade AI integration.
**About the Author**: The JetThoughts team has 18+ years of Rails expertise and has deployed AI features for clients ranging from early-stage startups to Fortune 500 companies. We specialize in TDD, performance optimization, and production-grade AI integration.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Third, test the brief before sending it to a human. Paste it into Claude or Chat

You don't have to switch shops to try any of this - the change is in the next spec you send. If you hand the same team a page with no blank spaces and the spaceship still shows up, that's a different problem, and [there's a separate guide for that conversation](/blog/fire-dev-shop-guide/).

At JetThoughts we've been building Ruby on Rails apps (the web framework we work in) since 2011, and a steady share of that work is taking over projects where the spaceship already landed. If you're staring at one now, we do a free 45-minute code audit: one senior developer reads your codebase - all the code behind your product - and writes you a one-page assessment of what to keep and what to delete. No contract and no follow-up calls after.
At JetThoughts we've been building Ruby on Rails apps (the web framework we work in) since 2008, and a steady share of that work is taking over projects where the spaceship already landed. If you're staring at one now, we do a free 45-minute code audit: one senior developer reads your codebase - all the code behind your product - and writes you a one-page assessment of what to keep and what to delete. No contract and no follow-up calls after.

## Further reading

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ It's also the wrong tool when trust has already collapsed. A developer or shop t

## Where JetThoughts fits

Our developers average 8+ years of experience, and we've been building Rails apps (Rails is the web technology we specialize in) since 2011 - long enough that every change we ship goes through the same review described above, because we've read too many inherited projects where it didn't happen. If you want the check done for you: a senior JetThoughts engineer reads your repository and sends a plain-English, one-page assessment of what your recent merges actually contain. [Start with the services page](https://jetthoughts.com/services/) - no pitch deck, just the read.
Our developers average 8+ years of experience, and we've been building Rails apps (Rails is the web technology we specialize in) since 2008 - long enough that every change we ship goes through the same review described above, because we've read too many inherited projects where it didn't happen. If you want the check done for you: a senior JetThoughts engineer reads your repository and sends a plain-English, one-page assessment of what your recent merges actually contain. [Start with the services page](https://jetthoughts.com/services/) - no pitch deck, just the read.

For more on watching a team you can't technically evaluate, see [how to know what your team is doing](/blog/how-know-what-your-team-doing-remote-startup/), and if your product is being built with AI coding tools, [the quality tax on AI-built apps](/blog/quality-tax-ai-mvp-cost/) covers the review gap from that angle.

Expand Down
Loading
Loading