SEO: GSC re-baseline closes 20.09 §10 Q1; fractional-CTO cluster cannibalised - #471
Merged
Merged
Conversation
…ibalised 90d GSC pull (2026-05-21 → 08-18, sc-domain:jetthoughts.com): 433 clicks / 438,152 impressions / 0.10% CTR / position 16.4. Confirms seo-review-2026-08-13 §1-§5 and changes no recommendation in §6. Closes 20.09 §10 Q1. The question held a full re-plan on a "fresh GSC export" that "is not in the repo" — the MCP serves it live, already documented in .okf/workflows/analytics-access.md since 08-13. The blocker had already been removed. Two of §8's Tier-2 questions answered early: - Founder-post clicks = 0 over 90d. All 27 "founder" queries ≈100 impressions / 0 clicks; the six §3 P1 posts 176 / 0; all "vibe" queries 165 / 0; course (60+ URLs) ~800 / 2 — at good positions (5-13). A demand finding, not a quality one, and the evidence base for §7's "sales enablement need not rank". - NEW: the fractional-CTO cluster carries the same cannibalization defect §4 caught on Rails 8 auth. Nine pages compete; Google's chosen result for the head term "fractional cto" (333 impr, the site's highest-volume commercial query) is a 159-line 2024 diary post at position 73 — not either service page. Three long-form siblings (~2,900 lines) got zero impressions in 90d. Deliberately NOT scheduled: ~570 impressions/90d at position 43-52 is ~15-30 clicks/quarter perfectly fixed. Not pipeline before Dec 1. Logged ready-to-execute (consolidate, don't write) in §9.4. Also logged for the action-#10 unsourced-numbers sweep: /services/fractional-cto/ publishes $5K-$15K/mo while /services/fractional-cto-cost/ publishes $5,000-$25,000/month; neither figure is in claims-canon. Docs + .okf only — no content/, themes/, layouts/ or CSS touched, so no build or visual gate applies. OKF validate --strict: conformant, 0 errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 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. Comment |
…ming
Updates the post idea and adds its LinkedIn companion, both re-pointed off
fractional CTO per the 2026-08-19 finding that JT has not delivered one directly.
Brief (cheap-developers-expensive-without-cto-review.md):
- Status corrected — it SHIPPED 2026-07-31; the brief still read "not yet
absorbed, draft candidate once the gate opens".
- Marked NOT a ranking target, with the evidence: the AI-supervision cluster is
invisible (vibe-coding-crisis 18 impr/0 clicks, vibe-coding-disposable 44/0)
and ZERO queries containing "ai code" exist in 90 days. Six posts already
cover this thesis; a seventh splits the same zero. LinkedIn-first instead.
- Retired secondary keyword "fractional cto code review" and the course fCTO
bridge link. The shipped post's fix section routes readers to a service we
cannot evidence; replaced with the one we do deliver and already state in
"Where JetThoughts fits" — a senior engineer reads the repo and returns a
plain-English assessment.
- New angle, non-duplicating: AI removes the *author*. With a cheap developer
there was still a person to ask why. The shipped post's own 20-minute check
("who approved the last ten PRs") breaks under AI — a founder prompting
directly may have no PRs at all — which is the proof, and the brief now
carries a replacement tactic that survives it.
LinkedIn draft (backlog-ai-without-senior-reviewer.md):
- Question-led opener, rotated deliberately: the last four drafts all open on a
flat conflict/observation claim; a fifth would be a formula tell.
- Checked against backlog-vibe-coding-disposable.md to avoid double-anchoring —
that post is rewrite cost, this one is the missing reviewer.
- 146 words. No em dashes, no credential stamp, no CTA, no JT mention, no links.
- reflect pass cut a beat-5 close carrying a second negative-positive flip plus
an aphoristic close; the first 1/10 self-score was wrong before that cut.
- Flagged in frontmatter: the post ships with no anecdote because inventing one
would be fabrication. Paul supplies a real detail or it stays as is.
Docs + linkedin-posts/ only (both outside the Hugo build) — no gate applies.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…it needs a supervisor Paul's framing replaces the earlier "AI removes the author" angle: AI is genuinely good and outperforms most Upwork freelancers, and that is precisely what makes it dangerous unsupervised. Wrong hands, big blow-up rather than slow mediocrity. The sharpened form of the point: a weak contractor warns you for free by slowing down. AI never slows down, so nothing signals that nobody is reading it. Cold-eyes panel (3 critics: slop / voice-guide / ICP reader) scored the first rewrite 4/10 and converged on three fixes, all applied: 1. Cut "I'll say that plainly, because plenty of people in my industry still won't." All three flagged it; the ICP reader said it actively COST trust - the "unlike the others in my industry" move every burned founder has heard from a vendor. 2. Cut "nobody is supervising it. They're forwarding it." Banned tweetable flip, arbitrary one-month threshold, and "forwarding" had no object. 3. REPLACED THE TACTIC - the important one. "Ask when anyone last sent the AI's work back" asked the audited party to self-report, which is the exact failure the post is about, and it assumed a "team" when the ICP founder has one contractor. It now asks for one specific past disagreement, which a non-technical founder can judge without reading code: a concrete example exists, or it doesn't. Also restored Beat 5 (the earlier reflect pass cut it without replacement) and closed on the one-person-on-your-side case the ICP reader raised. 163 words. Zero tweetable flips, no rule-of-three, no signposting, no credential stamp, no em dashes, no CTA, no JT mention, no links. Flagged in frontmatter for Paul: naming Upwork stays because he asked for it, but the voice critic's risk argument is recorded with a one-line swap if he wants the thesis without the fight. Opener is a conscious pattern break (fifth consecutive flat-conflict open) with the reason logged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…radiction
Paul flagged that two rewrites of backlog-ai-without-senior-reviewer.md shipped
with no preview link. Root cause was three separate defects, not one missing habit.
1. WRONG TRIGGER. linkedin-posts/README.md §Review board already said "ALWAYS give
Paul the link" but scoped it to "When asked to review/check LI posts". Creating
or updating a post is neither, so the rule never fired. Widened to every CREATE
and every UPDATE - a reframe or one-line edit ships with the link too.
2. NO CHECKLIST STEP. The pipeline's 20-item workflow checklist - the list an agent
actually follows when writing - had no preview-link item at all. Added as a
BLOCKING final step, one line pointing at the README rather than restating the
URLs a third time.
3. PORT CONTRADICTION. CLAUDE.md:114 and README both hardcoded
http://localhost:1313/linkedin/, which CLAUDE.md:144 directly forbids ("never
assume 1313 - that's the human default", session-random port, 2026-08-17). Any
agent following the LI line would hand back a URL pointing at Paul's own server
or nothing. All three now say <port> and reference the session-port rule.
Also generalised rather than patching the instance: the "always end page-change
handbacks with review links" rule was scoped to "a rendered page (content,
template, CSS)". LI drafts live in linkedin-posts/, outside content/, which is
precisely why the rule did not cover them. The test is now "renders locally", not
"lives in content/".
Verified rather than assumed: the mount is real (config/development/hugo.toml maps
linkedin-posts -> content/linkedin, dev-only), and both
/linkedin/ and /linkedin/icp-validation/backlog-ai-without-senior-reviewer/
return 200 on a live server.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…n't supervise it Paul: shorter, and the thesis wasn't landing. 163 -> 127 words. The defect was a missing link, not length. The draft asserted two things and never joined them: AI beats most Upwork freelancers, and AI needs supervision. The step between is the whole post - supervision only works if the supervisor outranks the thing supervised, so the cheap pool the AI already beats is by definition the pool that cannot supervise it. Hiring cheap to "run the AI" is self-defeating rather than merely cheap. That trap is now the spine. Dropped to make room: the slow-contractor-warns-you-for-free mechanism and the you-don't-need-to-read-the-code beat. Both were decent lines that served the old no-warning-signal thesis, not this one. Recoverable from git if the trap framing tests worse. Consequence worth recording: Upwork is now load-bearing rather than decorative - the pool-overlap IS the argument. That weakens the standing option to swap it for "cheap contractors" to avoid a fight in the comments; the post survives the swap but loses its bite. Frontmatter re-synced to body (the check the cold-eyes panel caught drifting last round): cta now matches the actual close, word count corrected. No panel re-run - Paul's notes were length and thesis clarity, not a voice failure, so the second-pushback trigger did not fire. Self-check clean: 0/10, no flips, no rule-of-three, no em dashes, no CTA, no JT mention. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Purpose-built exhibit per linkedin-posts/README.md "Every post carries a visual" - house style, viewBox 720x480, rsvg-convert -w 1080, .svg source kept beside .png. Shape is a LADDER, deliberately varied from siblings (the nearest exhibit, friends-politely-lying, is a contrast pair). Three rungs carry the whole thesis without reading the post: a supervisor above the AI, the AI as the bar it already set, the cheap Upwork hire below it. Basis line: hire below that line and nobody can catch what it gets wrong. Render-verified by VIEWING the PNG, then the 6-item clunkiness checklist run with the spec's "assume clunky" stance rather than glanced: - Alignment FIXED. First pass alternated card tilt -0.4/+0.4/-0.4. That reads as hand-drawn on a side-by-side pair but as a zigzag on a vertical stack; all three now share -0.3. - Hollowness FIXED. A dead band sat between the bottom card and the basis line. Cards re-spaced 108/212/316, axis extended to match. - Odd-one-out ACCEPTED not fixed: "The AI" is a short head in a wide card, so the middle rung is quieter. That is right - it is the neutral reference bar between two human rows, and padding it to match would be filler. - Sibling consistency, edge breathing room, weight/emphasis: pass. Recorded for Paul: Caveat is not installed on this machine, so exhibits fall through to Comic Sans MS. The committed siblings render identically, so this matches the feed rather than diverging - but nothing exported here will honour the house spec's Caveat until the font is installed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The board sorts approved posts by `proposed_for` (layouts/linkedin/list.html:43).
The newly-approved AI-supervision post had no such key, so it sorted ahead of
everything - the visible symptom. Auditing the rest surfaced three more:
- wk Sep 28 had Tue + Thu and NO Wednesday
- wk Oct 12 had Tue + Thu and NO Wednesday
- wk Oct 5 carried THREE posts
All three break content-plan.md's stated cadence: 2/week at 17:00 CEST,
"Wednesday every week, plus a second slot rotating Tue one week, Thu the next."
Fixed by re-slotting onto that grid while PRESERVING Paul's relative ordering -
this is a day-slot correction, not a re-ranking of his editorial sequence. Four
dates moved:
ten-interviews-recap Thu 10-01 -> Wed 09-30 (gives wk Sep 28 its Wednesday)
interview-count-poll Thu 10-08 -> Wed 10-14 (relieves the 3-post week; plan
says polls prefer Wednesdays)
why-i-wrote-it Tue 10-13 -> Tue 10-20 (displaced one slot by the above)
ai-without-senior-... unslotted -> Wed 10-21 (new)
Result: 18 posts, 9 consecutive weeks, exactly 2 per week, every week carrying a
Wednesday. Verified by ISO-week count, not by eye.
First pass got this wrong and is worth recording: filling the two empty Wednesdays
directly just converted both into 3-post weeks. Only checking counts per ISO week
across the WHOLE queue - rather than per defect - showed the surplus post had to
move out of wk Oct 5 rather than more posts moving in.
Left for Paul: the AI post sits at the tail (Oct 21, ~9 weeks out) because placing
it early would push all 17 others back a slot and re-rank his sequence. It is also
the most time-sensitive item in the queue. One-line swap if he wants it early.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ranked on decay markers actually present in each post, not on topic feel. Six of
eighteen carry something that expires; twelve are evergreen tactics.
Perishable, now first (decay driver quoted):
1. reaction-claude-code-trust - names a product AND a model AND a feature
("Claude Code... Opus model and team mode"). Fastest-rotting thing in the queue.
2. ai-without-senior-reviewer - "AI writes better code than most freelancers you'll
find on Upwork" is a MOVING comparison; it gets less true as models improve.
Was dead last at Oct 21, now second.
3. bip-vendors-still-burning-founders - explicit year-stamp plus two named vendors
("what changed in 2026... Lovable or v0").
4. backlog-vibe-coding-disposable - rests on "when you ask the AI to fix something,
it doesn't edit your existing code", a model-behaviour claim already eroding.
5. reaction-vibe-coding-front-back - opener indexes to a live argument ("the vibe
coding argument online is exhausting"); dies when the discourse moves.
6. bip-build-your-own-tools-with-ai - build-in-public about a thing built now.
Evergreen (Mom Test, pricing tactic, polls, staging question, the $40k story) moved
back in their existing relative order. Nothing was re-written, only re-slotted.
Grid preserved from the previous pass: 9 weeks, exactly 2 posts/week, every week
carries a Wednesday, all 3 polls on Wednesdays per content-plan. 18 posts, 18
distinct slots, verified.
TRADE-OFF PAUL SHOULD SEE: four of the six perishable posts are personal-lane
(reaction/build-in-public), so front-loading them pushes the first four weeks to
~50% personal against content-plan.md's ~20% target. I interleaved value posts to
avoid an all-personal opening week, but the tension is structural - the fast-rotting
material IS the personal material. Shipping order now optimises for freshness over
pillar mix. Say the word and I will rebalance toward the 20%.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul: match reference-examples.md (Cutler / Rossi / Holub / Paolino, captured 2026-08-13). Three deviations found against that doc, all fixed. 1. It was a REDEMPTION ARC, not a take. "I walked away / X pulled me back / here's what I learned" is a personal timeline; all four reference writers open on a claim about the WORLD and bring first-person in as evidence. Applied Rossi's documented move - name the narrative, then disagree with it. The post now opens on what the AI-agent argument is stuck on. The timeline survives as backing rather than as the structure. 2. TIDY LESSON-WRAP, explicitly banned in reference-examples §"What they all avoid". "Consistency is boring, and it's the only thing I actually care about. I don't need clever. I need to not babysit it." editorialises the takeaway for the reader AND carries a parallel-stem flip pair. Replaced with one flat first-person line that states the position and stops. 3. NO CLOSING QUESTION now, deliberately. Holub and Paolino land on the sharpest observation and stop; the doc permits a closing question only when genuine. There wasn't one here. Deliberately NOT restated: "reliability is the line". reference-examples flags that exact bridge phrasing as a marketer's sentence Paul rejected on 2026-08-13, so the point is carried by the concrete instead - couldn't predict it, diffs hold run after run, check behind. Shown, not announced. Kept every concrete technical noun (Opus, team mode, diffs, workflow); the doc names that specificity as Paul's register, closer to Holub than to a LinkedIn insight post. 102 words, up from 75 - the Rossi opener costs a sentence. Flagged not fixed: this sits at slot 1 and the AI-supervision post at slot 2, and both now open on a flat claim about AI. That is a consequence of ranking by decay, not of this rewrite. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul asked whether "X, not A, but B" is AI slop. It is, and it is banned by name in
our own voice guide - which the revoice one commit earlier violated.
voice-guide 90.11:223: `"It's not X - it's Y" / "Not just A, but B"` -> "Pick one
framing and commit." The shipped line was "not because the code was bad but because
I couldn't predict it". Now: "because I couldn't predict what they'd do."
It was also redundant, which is the better reason to cut it. The opener already
negates the code-quality assumption ("stuck on whether they're smart enough. That
was never what decided it for me"), so the middle paragraph re-negated a belief the
post had dismissed one line earlier.
Swept the other 17 approved posts for the same family (not just / not merely /
isn't just / it's not / that's not). Two hits, both fine on inspection: bare
negations that kill a wrong inference and stop, with no "but Y" completion -
staging-question's "it's not because the team is lying" and friends-politely-lying's
"That's not proof of anything". No other post carries the banned shape.
97 words.
RAISED, NOT RESOLVED - a genuine conflict between two voice docs: reference-examples.md
quotes Holub approvingly using this exact construction ("Product work is not a
distraction from the work; it is the work"), so the guide bans a shape the reference
file models. Proposed test, for Paul to rule on: the shape earns its place only when
the negated half is a belief the reader actually holds. Holub negates a live
assumption; slop negates a strawman for rhythm. Not applied - editing the voice guide
is a positioning call.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul sent the version he would write. It replaces the assistant draft wholesale.
Only English was cleaned (ESL typos, articles, tense). Nothing re-framed or
re-structured back toward the previous version.
His draft carried three things mine had invented away, all kept:
- "cancelled my AI subscriptions" - a concrete ACTION. Mine said "walked away",
which is a summary of an action, not the action.
- The agents MAKING EXCUSES for not following the workflows. Specific and vivid;
I had nothing like it.
- The payoff is ECONOMIC - burned tokens, hit rate limits, nothing to show for it.
My thesis was abstract predictability. His is what actually costs him money and
sleep, and "sleep at night" is his image, kept.
This is the anecdote gap I flagged twice on the sibling post, closing in the other
direction: the assistant cannot invent Paul's specifics, and when he supplies them
they beat the drafted abstraction outright. The correct move was to delete my
framing, not to merge it with his.
One ambiguity resolved and flagged in frontmatter: "to stop reach limit junkies"
reads either as Paul-as-junkie or agents-as-junkies. Taken as the agents, since his
closing line blames them for spending tokens and hitting limits. Flip on request.
Structurally his opener is Paolino's move from reference-examples ("say the real
thing you did, plainly") rather than the Rossi narrative-counter I had imposed -
still an influencer shape, and it incidentally clears the flagged clash where
slots 1 and 2 both opened on a flat claim about AI.
79 words. No em dashes, no negative parallelism, no CTA, no closing question.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul: "now apply the influencers voices on it". Every fact, noun and image in the body is still his. Three changes, each traceable to reference-examples.md. 1. ADDED the Holub move - flat contrarian conviction - which the draft lacked. The doc pins Paul's register as "blunt, concrete/technical, first-person, opinionated, a little against-the-grain, closer to Holub than to a LinkedIn insight post". His draft was the first three and none of the last two: a clean personal update that took no position. New line, built only from his own material: "An agent that spends your tokens and gets nowhere is worse than no agent." The against-the-grain part is that the public argument is about capability while his objection is economic. 2. COMPRESSED the return beat. "One thing brought me back: Opus family models and team mode." followed by "It stopped making excuses..." was a throat-clear ahead of the point. Merged into "Opus family models and team mode brought me back." Per the doc: influencers compress, they don't recap the sequence. 3. TIGHTENED the grievance to keep the agents as the subject doing the damage - "and I still had to rebuild" became "and still made me rebuild". KEPT against a stricter reading: "Now I sleep at night". Holub and Paolino usually land flat and a purist pass would cut an emotional closer. It stays because it is Paul's own line, it names a consequence rather than a feeling, and the new conviction line now does the flat-landing work. Noted in frontmatter that deleting that sentence gives the pure Holub ending if he wants it. 90 words. No em dashes, no negative parallelism, no banned closer, no CTA. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul: "i'd stick with Holub and rewrite/remove if they would." Deleting the closer alone was not the right move. That lands the post on "...without me installing extra tools" - a feature detail and the flattest line in the piece. reference-examples says Holub and Paolino "land on the sharpest observation and stop", so the conviction moved from the middle to the end. Three beats now: grievance, resolution, conviction. No question, no emotional wrap, no lesson addressed to the reader. 68 words, down from 90. Accepted cost: the conviction explains why he LEFT, so placed after the came-back beat it reads as a standing principle rather than his reasoning at the time. That is the right register for Holub regardless - a claim about agents in general, not a report of what he was thinking in the moment. Paul's two closer corrections from the previous round are preserved one commit back and were both right: "sleep well" not "sleep at night" (the original implied he did not sleep before, which is manufactured drama he never lived), and cutting the welded "pile of tokens hitting the limit" down to the token waste alone. They apply again if the closer ever returns. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul: "burned by rate limiting? they burned because stuck and doing wrong stuff; and rate limiting is another issue, they stop suddenly in the middle." Correct. "The agents burned through every rate limit" welded a cause to an unrelated symptom - it reads as though the rate limit caused the burn. It did not. The agents burn tokens because they get STUCK on the wrong work; rate limits are a separate failure where they stop mid-run. Now: "The agents got stuck and burned a pile of tokens on the wrong work, and I still had to rebuild their whole context every time." The rate-limit interruption is deliberately absent rather than reworded. Paul chose the token waste when asked to pick one last round, and a third grievance in the opener pushes it toward the enumerated-loop shape reference-examples warns about. Flagged in frontmatter as available - it would go in as its own beat, never welded to the token line. Fourth conflation Paul has caught in this post in two rounds. The pattern in all four: the assistant compressed two distinct things into one phrase and the seam stopped being visible once it read smoothly. Negative parallelism, the sleep overclaim, tokens-vs-limit, and now cause-vs-symptom. Also consolidated the frontmatter notes: 152 lines -> 65. They had become an append-only log longer than most repo docs, for a 76-word post. Superseded intermediate states dropped (git holds them), decisions kept. Fixed while there: icp_test still read "does 'reliability is the line' resonate", which stopped being the thesis when Paul's economic framing replaced it. It now matches the body - the frontmatter-to-body consistency check the cold-eyes panel flagged drifting on the sibling post. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Applying the lesson from reaction-claude-code-trust: all four of Paul's corrections
there were the same defect - two ideas welded into one phrase, or a claim that was
simply untrue - and every mechanical gate passed them.
CROSS-POST CONTRADICTION (the find that spanned both). Post 2 (Aug 26) argues you
need a human who outranks the AI; post 3 (Sep 2) told the same audience "no
developer is needed". Seven days apart. Both are defensible about different stages,
neither said so. Post 3 now scopes the claim: an AI builder gets you far enough to
find out whether anyone wants it; putting it in front of paying customers still
needs someone who knows what they're reading.
Post 3 - bip-vendors-still-burning-founders:
- "The gap isn't tech, it's information" was the exact negative parallelism Paul
asked about yesterday (voice-guide 90.11:223). Committed: "The gap is information."
- "So, no judgment if you paid..." carried the revoked So-connector AND the
therapist voice the guide bans. The de-shaming survives in the next clause, which
did the job better anyway.
- Close dropped its justification ("...and it's what would help the next founder") -
it told the reader why their answer matters. The question itself is genuine, so it
stays. 161 words.
Post 2 - backlog-ai-without-senior-reviewer:
- Cut the closing question. The post had already answered it, and it deflated the
sharpest line. Now lands on "the AI is the senior one on your project" - same
Holub fix applied to post 1.
- Cut two throat-clears: "That part is real." and "That's the hard part."
- Fixed a price/skill weld: "aren't the ones bidding cheap on Upwork, because that's
the pool the AI already beats" equated cheap with worse-than-AI. Dropped the
causal clause; the claim now stands as Paul's observation rather than a derivation.
PLAIN ENGLISH promoted to voice-guide §0, above every other rule (Paul: "plain
English is one of the high critical to pursue"). Three tests - say it out loud to
one person; one idea per phrase; every claim true. Records why the middle test
matters most: a fused phrase passes word count, banned-word greps, dash checks and
slop score, so only a domain reader catches it. Carries the four-round
claude-code table as the worked example, and the resulting rule - check claims
against domain knowledge FIRST, voice gates second. Mirrored in
.okf/content/voice-rules.md with the timestamp bumped. okf validate --strict:
conformant, 0 errors.
STILL OPEN on both posts: neither carries a real Paul specific. Post 2 has no
first-person at all and runs the day after an intimate first-person post. Flagged
in the plan, not inventable by me.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two corrections from Paul, both applied.
POST 3 opener. "It still happens constantly," was slop - a vague frequency claim
standing in for an observation. His replacement: "I again found in 2026 another
Non-tech founder who wasted $40k for broken MVP." English cleaned to "In 2026 I met
another non-technical founder who had spent $40k on a broken MVP." It also absorbs
the old first line ("hand over five figures... a build that barely runs"), which was
the same claim at lower precision - five figures and $40k were two statements of one
fact. "in 2026" moved into his sentence so the post no longer says 2026 twice.
149 words.
POST 2 supervisor line. "But it still needs supervision, and supervision only works
if the supervisor is better than the thing being supervised" used "supervision"
twice as a run-up to the point. Paul: 'I'd write "But superviser should be better
than ..."'. Now "But the supervisor should be better than the AI." Object made
concrete rather than "the thing being supervised" - passive abstraction, and
voice-guide §0 (plain English first) now ranks that above elegance. 93 words.
⚠️ ANECDOTE COLLISION, flagged not resolved - needs Paul's call.
$40k now anchors TWO approved posts: this one at slot 3 (Sep 2) and
backlog-40k-mvp-chasing-fixes at slot 10 (Sep 24), which is built entirely on the
figure and repeats it as its closing line ("He paid $40k to end up as the unpaid
project manager of his own product"). Both also cite Lovable/v0 and the same
broken-MVP shape. Three weeks apart on one feed, a reader sees one story told twice.
This is exactly the double-anchoring the cross-post repetition gate exists to catch.
Applied as Paul wrote it because he owns the anecdote and "another" may genuinely
mean a different founder with a coincidentally similar bill. If it is the same
founder, the options are: give slot 3 that founder's real number, drop the figure
from slot 3 and let slot 10 keep sole ownership, or cut one post.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… log the session Paul chose Option B over my recommendation: keep the negative-parallelism shape available under a stated exception rather than banning it outright. ATTRIBUTION TEST (new, voice-guide 90.11 §3). "X is not Y; it is Z" is legal only when the text NAMES WHO holds the negated belief within one sentence of it. Holub earns it - "There are many programmers who don't seem to get that". The line cut from reaction-claude-code-trust did not: nobody was named as believing the code was bad, and deleting the negation lost nothing. Worded mechanically on purpose. "Is this a belief the reader really holds?" is unenforceable - every writer thinks their own strawman is real, and this pattern already mass-regressed here once (25+ instances across M1-M3, caught by the 4-persona panel 2026-05-28). "Is there a named population in the adjacent sentence?" is checkable in two seconds by anyone. Synced across all three surfaces that stated the ban: 90.11 §3 (both the Negative parallelism row and a new worked section), .okf/content/voice-rules.md, and the LinkedIn AI-score rubric. reference-examples.md's Holub entry now explains why that quote is the legal case rather than an exception nobody documented. PIPELINE - two rules that existed but could never fire: - story-bank.md says "before drafting, pull from here; if the detail isn't here, interview Paul" and was absent from the mandatory reads AND the 20-item checklist. Added as read #5 plus a BLOCKING checklist step. This is the session's most expensive miss: ~6 correction rounds across two posts, both of which only worked once Paul supplied real material. - reference-examples.md added as read #6, with the warning that an imitation doc endorses every property of its samples. EXHIBIT FIX, caught by the frontmatter rather than by any gate: the banned "The gap isn't tech - it's information" was removed from the vendors post body earlier today and kept shipping inside the post's SVG. Basis line now "The gap is information.", re-exported at 1080w and render-verified. Text validators cannot see artwork - sweep exhibit text whenever a body phrase changes. $40k COLLISION recorded in both affected posts' frontmatter (slot 3 Sep 2 and slot 10 Sep 24) with the three resolutions. Left unresolved deliberately: Paul wrote the slot-3 opener and "another" may mean a genuinely different founder. Session learnings logged to .okf/log.md. okf validate --strict: conformant, 0 errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…y drift $40k COLLISION - Paul confirmed it is the SAME founder in both posts. By "another" he meant the pattern keeps recurring in his network, not that he met a second person. That made slot 3's opener factually wrong as well as duplicative: "another founder who had spent $40k" reads as a new case and re-tells slot 10's anchor three weeks before slot 10 runs. Resolved by splitting on PRECISION rather than cutting either post: - slot 3 (Sep 2) owns the RECURRENCE at five-figure precision - "Non-technical founders who paid five figures for an MVP that barely runs keep turning up in my network. I met another one this year." - slot 10 (Sep 24) keeps the $40k founder and the unpaid-PM story it is named for. $40k now appears in exactly one body. Five figures was also already the exhibit's wording, so slot 3's body and artwork agree again - the earlier draft had the body at $40k and the card at "five figures". WORKING-DIRECTORY DRIFT - rule added to CLAUDE.md. The Bash cwd persists between calls, so a bare `cd content` silently breaks every later repo-relative path. It bit twice this session: a `content/_index.md` grep and a `.okf/design/` read both reported "No such file or directory" for files that exist. The failure presents as a missing file rather than a wrong cwd, which is why it cost two debugging detours instead of one. Rule: absolute paths, or `cd <repo root> && cmd` in the same call, or pass directories to the tool. If a file you know exists reports missing, run `pwd` before believing it. Both logged to .okf/log.md (now 8 entries for the session). okf validate --strict: conformant, 0 errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… repetition gate Two corrections from Paul, and the first reverses a decision I made an hour ago. $40k RESTORED. I stripped it to "five figures" citing the cross-post repetition gate. Paul: "why we cannot use $40k?" - he is right and I over-applied the rule. That gate is for CLUSTER posts competing on one topic, not for two different arguments drawing on one real case. Stripping the number made the post vaguer, which directly contradicts this session's main finding that Paul's concrete specifics beat assistant abstractions. His real cases are also finite - one-story-one-post starves the pipeline for no reader benefit. What actually must not repeat is the STORY, not the number. Slot 3 uses the founder as the latest instance of a pattern; slot 10 narrates his unpaid-PM trap and is named for the figure. Both frontmatters now say so, including an instruction to slot 10 to keep the narration and not let slot 3 grow into a retelling. NO IMPLIED COUNT. "I met another one this year" reads in mid-August as one case per half-year, which undersells how often Paul sees this. Now "The last one had spent $40k" - recency without a rate. General rule recorded: never let a time window imply a count Paul has not claimed. Opener is now: "Non-technical founders who paid for an MVP that barely runs keep turning up in my network. The last one had spent $40k." Dropped "five figures" as redundant once the exact figure returned. 156 words. .okf/log.md entry 7 REWRITTEN - it had recorded the split-by-precision decision as a durable lesson. Paul overturned it the same day, so the entry now records the correction and the reason. A wrong lesson in the log is worse than no lesson. okf validate --strict: conformant, 0 errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…hanic move
Paul asked to simplify paragraph 2 in strict influencer voice, add the $40k vs $200
comparison, then improve the rest. 156 -> 131 words.
PARAGRAPH 2, the one Paul singled out as working:
was: "What changed is that the first rough version of most app ideas is now a
weekend of work. AI app builders like Lovable or v0 cost about as much as a
streaming subscription: you describe the app in plain words and get
something you can click, without hiring anyone."
now: "That same first version is now a weekend with Lovable or v0. You describe
what you want and it builds it. Even on the priciest models, $200 covers it."
Cut the "What changed is that..." throat-clear, dropped the hedge "most app ideas",
and replaced the simile with Paul's real figure. A simile is what you write when you
lack the number; he had the number.
Recorded as a reusable rule in the pipeline (new section, "Gloss by mechanic, not by
parenthetical"): name the concrete thing in a short declarative, give the mechanic as
its own plain sentence, use the real figure over a comparison. Flagged that this
deliberately differs from the course's parenthetical-gloss rule - different register,
LinkedIn is speech.
REST OF THE POST:
- "someone who knows what they're reading" -> "someone who can read the code". The
original never said reading WHAT; a non-technical reader could take it as reading
a contract or a market.
- "the tools moved faster than the advice around them" -> "than anyone giving
advice". "The advice around them" names no one.
- "If you paid for a build you didn't need yet" -> "If you already paid for one".
- Dropped the second "$40k" - para 1 establishes it one sentence earlier, so the
comparison lands on "$200 covers it" without restating the bill.
EXHIBIT re-labelled to match: cards now read "$40k" and "$200" instead of "five
figures" and "subscription money", re-exported at 1080w and render-verified. The
200x gap is now visible without reading the post. The old frontmatter note said "no
invented dollar figures" - correct then, since neither number existed in canon; both
now come from Paul.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…working Paul: "looks like redundant and conflicting with my idea that you do not need to pay cheap non qualified devs today but use AI for this to have the same non-working app but good enough to test your idea and save ~$39k." He is right, and the sentence was mine. I had written "Putting it in front of paying customers needs someone who can read the code" to resolve a contradiction with the Aug 26 supervisor post. Two problems: 1. It is false to his own story. The $40k dev-shop build barely ran. Implying the paid route bought you a code reader contradicts the founder anecdote the post opens with - nobody was reading that code either. 2. It blunts the punch. The comparison is not cheap-and-broken versus expensive-and-working. It is the SAME non-working app at $200 or $40k. That equivalence is the whole post and my sentence talked the reader out of it. Now: "You get the same non-working app. It is good enough to test the idea, and you save about $39k." This resolves the Aug 26 contradiction better than the line it replaced. That post says AI output needs a supervisor who outranks it; this one now explicitly disclaims the AI build as non-working and scopes it to testing an idea. Neither post gives hiring advice, and the stages no longer overlap. Recorded in frontmatter as load-bearing so it does not get softened again. 124 words, down from 131. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reviewing the closing three paragraphs against the sharpened thesis. CUT "The gap is information." It was the last abstraction in the post and the two sentences before it already say the same thing concretely. It also stopped being accurate once paragraph 3 sharpened: the missing information is not "information" in general, it is the PRICE. Naming the abstraction after stating the concrete is the move this whole session has been removing. "the tools moved faster than anyone giving advice" -> "the tools got cheap faster than the advice caught up". The old clause named nobody and floated free of the thesis; the new one is about price, which is what the post is about. Kept rather than cut because the frontmatter's constructive-framing constraint needs it - without it the paragraph reads as a straight vendor attack, which the 4-critic swarm specifically fixed on 2026-08-17. "If you already paid for one" -> "If you already paid a dev shop". "One" had drifted: after paragraph 3 the nearest antecedent is the AI-built app, so the de-shaming beat was pointing at the wrong purchase. Closing question kept unchanged. It asks what the vendor SAID, which is exactly where the information gap gets created, so it earns its place after "nobody tells founders this." EXHIBIT swept in the same pass, per the rule this session added after the last miss: the basis line still read "The gap is information." It is now "The $40k one barely ran either." - the post's actual punch, and it makes the card pair legible without the body. Re-exported at 1080w and render-verified. 123 words. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1. PARAGRAPH 3 verbatim from Paul: "You get the same non-production app, but it's good enough to test the idea, and you save about $39k." His "non-production" fixes a contradiction I had shipped. Mine said "the same non-working app. It is good enough to test the idea" - if it does not work, it cannot be good enough to test. The AI build does work; it is just not production grade. One word, and the sentence stops arguing with itself. Exhibit basis line aligned: "The $40k one barely ran either" implied the AI version barely runs too, which contradicts "good enough to test". Now "The $40k one was not production either." Re-exported and render-verified. 2. CLOSE REPLACED. Paul: "I'm not following those last lines, how are they related to the post idea?" Correct - they were ORPHANED. "What did the vendor tell you before you signed? That part never gets written down." fitted this post's ORIGINAL thesis of vendor accountability (the 2026-08-17 4-critic version). The post is now a price revelation, so the old question reached the topic only through a two-step - the pitch is where the not-telling happens - that no reader is going to make. Now: "What were you quoted for your first version?" Genuine, on-thesis, trivially answerable, and it surfaces the datum actually worth having: whether founders are still being quoted five figures. De-shaming line kept. The 4-critic swarm added it because the icp_test cannot fire without an ask, and it earns more now than before - asking what someone was quoted right after revealing $200 invites them to confess being overcharged, so the line makes answering safe. LESSON recorded in frontmatter: when a post's thesis is rewritten, re-check the CLOSE against the new thesis, not just the body. A close that fitted the old argument survives every voice gate - well-written, unbanned, on-brand - and is simply about a different post. Nothing in the rubric can catch that. 116 words, down from 123. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ssion
Half of Paul's 12 corrections this session were defects no gate could see, because
every gate we own checks sentences against RULES and none checks the post against
its own argument. Four were exactly that: a welded complaint, a caveat contradicting
the post's own thesis, a self-contradiction ("non-working" vs "good enough to test"),
and a closing question that fitted the pre-rewrite thesis.
New BLOCKING checklist step in linkedin-post-pipeline.md: write the argument as one
sentence in frontmatter (`thesis:`), then read each paragraph asking only whether it
serves that sentence or contradicts it. Re-run after EVERY rewrite - that is where
the orphaned close came from. Each edit was checked locally against the paragraph it
touched, so the close was never in scope.
Applied `thesis:` to the three posts edited this session rather than backfilling all
18 - the rest get one when next touched. Ran the gate on all three:
- reaction-claude-code-trust: passes, 3/3 paragraphs serve.
- backlog-ai-without-senior-reviewer: passes, 4/4.
- bip-vendors-still-burning-founders: 5/6 serve; ONE FLAGGED. The de-shaming line
neither serves the price thesis nor contradicts it - the gate's cut-or-fix case.
Kept deliberately: it serves the ASK, not the argument. The 4-critic swarm added
it because icp_test cannot fire without one, and asking "what were you quoted"
right after revealing $200 invites a confession of being overcharged. Recorded in
frontmatter so a future mechanical pass does not cut it.
That flag is the gate working as intended - it surfaced a real judgement call rather
than a defect, and forced the reason to be written down.
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.
Fresh 90-day GSC pull answering the open question that was blocking a full content re-plan. Docs +
.okf/only — nocontent/,themes/,layouts/or CSS touched, so no build or visual gate applies.Why
20.09 §10 Q1held a full re-plan on a "fresh GSC export… not in the repo". The MCP serves that data live — already documented in.okf/workflows/analytics-access.mdsince 08-13. The blocker had already been removed and nobody noticed.What the data says
90d,
sc-domain:jetthoughts.com, 2026-05-21 → 08-18: 433 clicks / 438,152 impressions / 0.10% CTR / position 16.4.It confirms
seo-review-2026-08-13§1-§5 and changes no recommendation in §6. Junk impressions, position decay, invisible commercial pages and the zero-click founder cluster all reproduce on the 90d window.Two of §8's Tier-2 questions are answerable early:
fractional cto(333 impressions, the site's highest-volume commercial query) is a 159-line 2024 diary post at position 73 — not either service page. Three long-form siblings (1,646 + 737 + 560 lines) returned zero impressions in 90 days; the 1,646-line ROI calculator targets keyword"fractional cto cost", the exact primary of/services/fractional-cto-cost/.The recommendation is: do nothing about it before Dec 1
The whole prize is ~570 impressions/90d at position 43-52 — a perfect consolidation yields ~15-30 clicks/quarter. Not pipeline. §6's "measurement-first, then stop" applies unchanged, and grading a fix against numbers §1 already called untrustworthy is not a plan.
Logged ready-to-execute (consolidate, don't write) in §9.4 for whenever SEO reopens.
This corrects a first-pass read in the same session that recommended fixing it now; the correction is recorded in §9.4 and the OKF log rather than quietly dropped. Finding a satisfying root cause is not by itself a reason to spend the hours.
Also logged
/services/fractional-cto/publishes $5K-$15K/mo while/services/fractional-cto-cost/publishes $5,000-$25,000/month. Neither is inclaims-canon. Folded into action #10 (unsourced-numbers sweep) — which figure is right is Paul's call.Generalisation captured
20.09 §4 caught the Rails 8 auth cluster; fractional-CTO ran unaudited for two years with the same defect. When one split cluster is found, audit the others — don't fix only the flagged instance.
Verification
okf:validate .okf --strict→ conformant, 0 errors (114 pre-existing warnings; my log heading matches the file's existingYYYY-MM-DD — Titleconvention, shared by 17 other entries)80cf41329and the#470log entry survives intact (append-vs-append conflict resolved by keeping both, chronological)keyEvents = 0, so it returns noise until actions Add blog index page without styles #1/Add blog single page #2 land🤖 Generated with Claude Code