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
17 changes: 17 additions & 0 deletions .okf/build/test-gates.md
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,23 @@ found the founding year wrong in eight places because each kept its own copy.
Full fault-injection matrix, including what nothing guards:
`docs/20-29-testing-qa/20.11-gate-fault-injection-2026-08-22-reference.md`.

## Inject BOTH directions, or the gate is half-tested (2026-08-22)

Planting the defect and watching it fail proves the gate can fire. It does not
prove the gate can stay quiet. Plant a legitimate LOOKALIKE and watch it PASS.

The missing half cost four false positives in one day: a marker accused this
repo's own real `jt_site` case study of being fabricated; an AI-tell rule fired
on "anyone on **the team** could remember"; a phrase marker flagged a quoted
exhibit inside a ```diff fence as our own claim; a single-line `<img>` grep
reported a working diagram as missing because Hugo wraps the tag across lines.
Each verdict was trusted, and correct work was nearly changed to satisfy it.

**When a gate accuses something, reproduce the accusation by hand before
believing it.** The fabrication ratchet's phrase scan now strips fenced code for
exactly this reason, and was verified both ways on a throwaway probe post:
legitimate exhibit PASS, same phrase in prose FAIL.

# A green visual run means nothing without its `[snap_diff]` line

The gem resolves every baseline with `git show HEAD:<path>`. Anything that
Expand Down
20 changes: 20 additions & 0 deletions .okf/content/voice-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,26 @@ Full table in 90.11 §1b.
from the writer brief reached published HTML on five posts. Report cadence
in the handback, never in the file.

# Slop is found by cold eyes, not by a score or a grep (2026-08-22)

A `bin/check-post-voice` was written and deleted the same day, on Paul's call. A
regex catches "Not X. Not Y." and misses prose that is fluent, on-pattern and
lifeless - and a passing run reads as "the voice is fine", the same false
confidence as a link checker reporting green over a tenth of a site.

What a four-lens panel caught that no script could: **section-level rhythm**.
Every H2 in three posts landed on a one-sentence aphorism paragraph -
"evidence, evidence, punchline, white space, next heading" - and all three posts
opened on the identical two-beat reveal. Sentence lengths varied; the
choreography did not. Read two consecutive sections aloud; if they land the same
way, one has to change SHAPE, not wording.

The panel: ICP cold read, voice/AI tells, competitor standard (the reviewer
fetches two current competitor posts), claim verification. Different agent type
than the writer, briefed with goal and artifact rather than conclusions, each
required to name something it would cut. Three approvals means the panel was not
asked a real question.

# Banned structural patterns (reject on sight)

Slogany reveal-twist flips ("X wasn't Y - it was Z") **unless the text names WHO
Expand Down
46 changes: 46 additions & 0 deletions .okf/log.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,52 @@ make it green: restructure same-day entries under one heading, and add
`timestamp` to the 23 concepts missing it (anchored to each file's last commit
time, which is verifiable - never invented).

## 2026-08-22 - four cold-eyes reviewers found what a script had just passed

Three posts shipped having passed every check their author could run, including
a purpose-built `bin/check-post-voice`. Paul read them as slop and overruled the
script: "it's hard to have determined automate to detect ai slops, you need to
run different agents from cold eyes review". Deleted the same day it was written.

The category error is worth naming because it was made hours after the opposite
lesson was written down. Correctness is not greppable - established that morning,
recorded in [claims-canon](/content/claims-canon.md) - and then a regex was built
for SLOP, which has the same property. Worse, a green PASS from it reads as "the
voice is fine", which is the exact false-confidence failure the same day's blog
post is about.

A four-lens panel then found, in posts a script had passed:

- **Section-level rhythm.** Every H2 landing on a one-sentence aphorism -
"evidence, evidence, punchline, white space, next heading" - five times a post,
three posts. Plus an identical two-beat opening reveal in all three. Sentence
lengths varied; the choreography did not. This is the actual slop and no
pattern-matcher can see it.
- **Numbers I was confident about.** `[snap_diff] 287 screenshots compared` took
287 from the unit-test run count; a link total came from today's build while
describing a fix that landed at 114,050; a tool output was reproduced inside a
fence with one field edited. Not fabrication - real measurements from the wrong
run, which is why they survived self-review.
- **Cited but never spent.** Two of three posts listed a footer source the body
never engages; one had its claim on the cover image while the post never told
the story.
- **A command that reports success having checked nothing.**
`content/blog/**/index.md` matches nothing in bash without `shopt -s globstar` -
published in a post about checks that check nothing.
- **Attribution unchecked while the quote was checked.** "Responsible Statecraft
traced it" - they reported it, NewsGuard traced it. "Both publish their error
bars" - one does.

Also corrected at source: `Rakefile` and this bundle's test-gates both said the
link gate was green "for a year"; git says it shipped 2026-07-21, one month
before it was caught.

Rules written where writers will hit them:
[voice-rules](/content/voice-rules.md) gains the cold-eyes section,
[test-gates](/build/test-gates.md) gains the both-directions injection rule,
and CLAUDE.md's blog section lost two bullets that routed future sessions into
the rejected method.

## 2026-08-22 - the codeblocks drift was STALE BASELINES; five theories closed at once

**`rendering-stack`**: re-recorded `linux/` on master (`dc11791ab`, all 55) and
Expand Down
2 changes: 1 addition & 1 deletion STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
| LinkedIn (primary demand lane) | **LIVE** — 3 posts published (2026-08-13/18/19), first metrics read 2026-08-20; ICP-E lane on disk: 1 posted + 4 approved (of 10 planned), validation clock running | Post an approved draft (week1-tue / week1-wed) at Stream 0 cadence (3-4/wk) | [`metrics-ledger`](linkedin-posts/metrics-ledger.md) · [`plan`](docs/workflows/linkedin-icp-validation-plan.md) |
| 2608 site design system (v2 `/next/` rail) | Paused 2026-08-22 mid-flight; 3 pilots built + voted | Apply the [repositioned pilot copy](docs/projects/2608-site-design-system/20-29-strategy/20.09-repositioned-pilot-copy.md) (2608's own 20.09 — not the content plan); then Paul's 5 decisions | [`2608 README`](docs/projects/2608-site-design-system/README.md) |
| Positioning / homepage offer (2608 niche research + [ADR-0007](docs/adr/0007-homepage-main-offer-and-copy.md)) | **Paused 2026-08-22** — 8 research lanes complete, copy drafted + panel-voted, nothing shipped to the live site; landed on master via [#606](https://github.com/jetthoughts/jetthoughts.github.io/pull/606) | Resume via the HANDOFF — read its corrections first: the staffing constraint was briefed backwards, so every lane's discards need re-reading before acting on a shortlist | [`HANDOFF`](docs/projects/2608-niche-research/HANDOFF.md) |
| Blog / SEO (2510) | Constrained by 20.09 §1 (outreach first). R-queue empty/retired; replacement queue is §13 (restocked 2026-08-21) | Per §1: LinkedIn cadence + sourcing outrank a new post; when drafting, take §13 N-queue | [`20.09 §13`](docs/projects/2510-seo-content-strategy/20-29-strategy/20.09-content-plan-revision-aug-2026.md) |
| Blog / SEO (2510) | **Pipeline rebuilt and 3 posts shipped 2026-08-22.** It previously had no invokable way to produce a post - `/blog-next` never writes and the delivery half existed only as agents. Now three skills: `/blog-operator` (the door, REPAIR > UPGRADE > WRITE > RESTOCK), `/blog-next`, `/blog-write`. Live: [what-senior-developers-catch-that-ai-misses](content/blog/what-senior-developers-catch-that-ai-misses/index.md), [how-to-audit-content-you-didnt-write](content/blog/how-to-audit-content-you-didnt-write/index.md), [when-did-a-test-last-fail-on-purpose](content/blog/when-did-a-test-last-fail-on-purpose/index.md), plus an upgrade to claude-code-xp-team-workflow. Fabricated case studies purged from 14 posts; two ratchets live in `marketing_copy_test.rb` (fabrication baseline 9, uncited baseline 38). §1 outreach constraint still stands - Paul drove these directly. | **§13h**: verify the uncited technical guides, highest-traffic first (crewai 6,458 impr, propshaft 6,194, solid-cache 4,891) - re-rank before starting, the table decays. **N9** still parked: the AI code-search benchmark, design owed before any runs. | [`20.09 §13h`](docs/projects/2510-seo-content-strategy/20-29-strategy/20.09-content-plan-revision-aug-2026.md) |
| 2605 course | v2 live; measuring. Diagnosis: **arrival, not content**; course SEO/AEO **closed** (Paul 2026-08-21) | LinkedIn arrival-test cards **LI-0…LI-D** in [`content-plan`](linkedin-posts/content-plan.md); no new funnel posts on the unproven bridge | [`TASK-TRACKER`](docs/projects/2605-tech-for-non-technical-founders/TASK-TRACKER.md) |
| 2607 campaign tasks | Cold-public-sourcing premise tested and **failed** (3 sweeps, 4 venues, 0 verified-fresh rows; Reddit still un-openable) | Sept-restart Paul decision: retire the cold lane or buy Reddit API access (backlog §c) | [`2607 backlog`](docs/projects/2607-vibe-code-rescue/backlog.md) |
| Test/CI hygiene | **Gates rebuilt 2026-08-22.** Fault-injecting 8 realistic defects caught **3**; now catches **8** ([#576](https://github.com/jetthoughts/jetthoughts.github.io/pull/576), audit in [`20.11`](docs/20-29-testing-qa/20.11-gate-fault-injection-2026-08-22-reference.md)). Link job was excluding 90% of links — 114,050 checked now vs 15,642, and it found 5 real site defects ([#574](https://github.com/jetthoughts/jetthoughts.github.io/pull/574)). `bin/dtest` was comparing **nothing** from a worktree ([#578](https://github.com/jetthoughts/jetthoughts.github.io/pull/578)). CI Linux screenshot job green (run 32565008850) | **Paul decides the dtest arch policy** (below); otherwise nothing queued | [`test-gates`](.okf/build/test-gates.md) |
Expand Down