From 4c703778228a5f646b98898407850c9dc9463e68 Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Thu, 20 Aug 2026 23:45:08 +0200 Subject: [PATCH 1/3] Fix 553 pages previewing blank on social; add the gate that would have caught it layouts/partials/seo/enhanced-meta-tags.html:129 falls back to https://jetthoughts.com/assets/images/og-default.jpg when no frontmatter image resolves. That file had never been uploaded. 553 pages - almost all blog posts without cover art - unfurled blank on LinkedIn and Slack. og:image is the one asset class no crawler, link-checker, or reader ever exercises, which is why it survived unnoticed. The image is a BRAND PLATE, not a campaign card. A first draft led with "Your dev shop stopped delivering" - under a share of a Puma-config post that reads as an ad rather than an article. It now carries the wordmark, a descriptive line, and canon-only figures (Clutch 4.8/5 with NO review count, 5-year average relationship, since 2008) per .okf/content/claims-canon.md. Source SVG committed alongside: the figures live inside a binary no text ratchet can read, so keeping the source in-repo keeps them greppable, and it regenerates the jpg byte-identically (md5 ecd26681b0c591a68d1315d5d578d05c). test/unit/og_image_resolves_test.rb is the reproduction test. The existing meta_tags_test.rb:136-149 asserts the tag EXISTS and that width/height are 1200x630 - an existence-plus-config assertion that cannot see a 404. This sweeps RENDERED output and resolves every same-origin social image against the build. Two review passes materially changed the work: 1. The first version checked exactly ONE url. Its regex required property= before content=, but the theme partials emit the reverse, and most values are off-origin CDN urls. 1297 tag matches collapsed to a single File.exist? wrapped in a 1757-file glob. RED->GREEN had passed honestly, because the one path it reached WAS the defect under repair - coverage and correctness are independent. 2. The comment describing that fix was itself wrong ("skipped 480 tag pages"; measured: 0 pages missed, the content-first SECOND tag was dropped, losing one distinct image). It had already propagated into two .okf/ files before review caught it. Also dropped a CGI.unescape that was a no-op on every url in the build and could only misfire (it decodes "+" as a space, a form rule wrong for paths). Root cause of a false GREEN worth recording: no local build path passes --cleanDestinationDir (bin/hugo-build:47, test/support/hugo_helpers.rb:24-38; only .github/workflows/_hugo.yml:82 cleans), so Hugo never removes an output whose source is gone. Deleting the jpg to prove RED left the tree serving a stale copy through three attempts. The tree DID rebuild each time - the "did it rebuild?" reflex diagnoses this wrong. Known gap, documented not papered over: the theme partials guard their tags with {{ if . }} / {{ with }}, so a missing resource DROPS the og:image tag rather than dangling it. A page that loses its social image entirely is invisible to this gate. Gates: rake test:unit 280 runs / 6032 assertions / 0 failures on a cleaned build dir; RED verified by removing the asset, GREEN after restore; okf validate --strict conformant (66 warnings, unchanged). Content+test only - no themes/, layouts/, or CSS touched, so the visual suites do not apply. 4-eyes: two independent reviewer passes (Opus), no blocking findings outstanding; both non-blocking items from the second pass are fixed here. Co-Authored-By: Claude Opus 5 --- .okf/architecture/index.md | 2 +- .okf/architecture/seo-meta-tags.md | 42 ++++++++++-- .okf/build/ci-gates.md | 14 +++- .okf/build/index.md | 2 +- .okf/build/test-gates.md | 41 ++++++++++++ .okf/log.md | 96 ++++++++++++++++++++++++++++ .okf/workflows/review-swarm.md | 17 +++++ .stitch/og-default.svg | 84 ++++++++++++++++++++++++ static/assets/images/og-default.jpg | Bin 0 -> 58994 bytes test/unit/og_image_resolves_test.rb | 68 ++++++++++++++++++++ 10 files changed, 358 insertions(+), 8 deletions(-) create mode 100644 .stitch/og-default.svg create mode 100644 static/assets/images/og-default.jpg create mode 100644 test/unit/og_image_resolves_test.rb diff --git a/.okf/architecture/index.md b/.okf/architecture/index.md index cb38f26b7..2ea979dbf 100644 --- a/.okf/architecture/index.md +++ b/.okf/architecture/index.md @@ -4,7 +4,7 @@ * [CSS Build Pipeline](css-pipeline.md) - PostCSS + per-bundle PurgeCSS, the site-wide token layer and its zero-delta promotion pattern, FL-Builder legacy CSS * [Blog Index / Listing Page](blog-list-page.md) - index AND tag-page templates, the shared row/filter/CTA partials, blog-list CSS bundle, and the term-kind / date-fallback traps * [Blog Cover Image Pipeline](cover-image-pipeline.md) - JetVelocity cover generation, og:image vs thumbnail rendering, and the responsive mobileWidth/mobileSizes params list covers need -* [Enhanced SEO Meta Tags](seo-meta-tags.md) - per-section title/description generation partial +* [Enhanced SEO Meta Tags](seo-meta-tags.md) - per-section title/description generation partial, its own og:image path, and the site-default social fallback * [ICP Journey SIPOC](icp-journey-sipoc.md) - pointer: Mermaid flowchart of Sam's full journey through every lesson, gate, branch, and artifact * [Operational Dependency Map](operational-dependency-map.md) - pointer: per-lesson prerequisites, template blank sources, wait times, Plan B paths diff --git a/.okf/architecture/seo-meta-tags.md b/.okf/architecture/seo-meta-tags.md index 00259d99f..4265e3a86 100644 --- a/.okf/architecture/seo-meta-tags.md +++ b/.okf/architecture/seo-meta-tags.md @@ -2,11 +2,14 @@ type: Service title: Enhanced SEO Meta Tags description: Hugo partial that generates per-section page titles, meta descriptions, robots/canonical/OpenGraph/Twitter tags, and its own resized og:image. -resource: themes/beaver/layouts/partials/seo/enhanced-meta-tags.html +resource: layouts/partials/seo/enhanced-meta-tags.html tags: [seo, hugo, meta-tags] generated: by: process:okf-migrate at: 2026-07-12T00:00:00Z +verified: + - { by: claude/opus-5, at: 2026-08-20T23:50:00Z } +timestamp: 2026-08-20T23:50:00Z --- # Overview @@ -29,11 +32,40 @@ no minimum-length enforcement. The partial also emits robots, canonical (with a `/tags/` → `/blog/tags/` rewrite for the tag taxonomy), keywords, OpenGraph (`og:type = article` for single blog pages), Twitter cards, and its -**own** `og:image` resized to 1200×630 (CDN `w=1200&h=630` or a local -`.Resize "1200x630 webp q85"`), with a site-default fallback. This is a -separate og:image path from the one in +**own** `og:image` resized to 1200×630 (CDN `w=1200&h=630&output=jpg&q=85`, +or a local `.Resize "1200x630 jpg q90"`), with a site-default fallback. This +is a separate og:image path from the one in [cover-image-pipeline](/architecture/cover-image-pipeline.md). +**JPEG is deliberate, not incidental**: LinkedIn's crawler will not render +WebP, so an og:image emitted as WebP unfurls blank there even though most +other clients handle it. + +# The site-default fallback + +When no frontmatter image field resolves, the partial falls back to a +hardcoded `https://jetthoughts.com/assets/images/og-default.jpg`. **This +asset went missing for an unknown period and was only added 2026-08-20** - +553 pages, overwhelmingly blog posts without cover art, unfurled blank on +LinkedIn and Slack the whole time. `og:image` is the one asset class no +crawler, link-checker, or reader ever exercises, so nothing surfaced it. + +It is a brand plate (wordmark + category line + canon proof chips), NOT a +campaign pitch: a fallback stands in under arbitrary technical posts, where +sales copy over a Puma-config article reads as an ad. Any figure on it is +bound by [claims-canon](/content/claims-canon.md), and because those figures +live inside a binary, **no text ratchet can see them** - the generator source +is kept in-repo so they stay greppable. + +Guarded since 2026-08-20 by `test/unit/og_image_resolves_test.rb`, which +resolves every same-origin `og:image`/`twitter:image` in RENDERED output +against the build. Known gap: the two theme partials +(`blog/list.html`, `page/cover_image.html`) guard their tags with +`{{ if . }}` / `{{ with }}`, so a missing resource DROPS the tag rather than +dangling it - a page that loses its social image entirely is invisible to +that gate. + # Citations -[1] `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` +[1] `layouts/partials/seo/enhanced-meta-tags.html` +[2] `static/assets/images/og-default.jpg` - the site-default fallback asset diff --git a/.okf/build/ci-gates.md b/.okf/build/ci-gates.md index e27506bb7..d2802ec1f 100644 --- a/.okf/build/ci-gates.md +++ b/.okf/build/ci-gates.md @@ -133,9 +133,21 @@ Consequences for how to react: stall anyway (run 32414801788, 10 min on `--depth=1`). The one job that cannot go shallow is the one that must not: `enableGitInfo` in `config/_default/hugo.toml` needs commit history to resolve `.Lastmod`. + +* **Do not copy `filter: blob:none` into the other workflows.** `_hugo.yml` + is the ONLY job that sets `fetch-depth: 0`, and the filter's whole win is + skipping *historical* blobs. Every other checkout — `test.yml:66`, + `publish.yml:45` and `:82`, `link-check.yml`, `sync-and-publish.yml`, + `process-issue-zip.yml` — runs at the default depth 1, where there is no + history to skip and git must still materialise every blob at HEAD to + populate the working tree. Adding the filter there buys nothing and risks + a slower lazy per-blob fetch. Their 7-minute checkouts are the content + weight below, not a missing flag (established 2026-08-20 while triaging a + checkout-stalled Unit Tests job on PR #511). * **The deeper fix is the content weight**, not the checkout flags: 625 MB of images in git is the floor every job pays. Moving them to LFS or - CDN-only would be a separate, larger decision. + CDN-only would be a separate, larger decision — and it is the only lever + left for the depth-1 jobs. [actions/checkout#2441]: https://github.com/actions/checkout/issues/2441 diff --git a/.okf/build/index.md b/.okf/build/index.md index 6ab47ece1..ea9850472 100644 --- a/.okf/build/index.md +++ b/.okf/build/index.md @@ -1,6 +1,6 @@ # Build & Test * [Hugo build pipeline](hugo-build.md) - bin/hugo-build with the 8 course validators; also the PurgeCSS cold-start race and the minified-unquoted-attribute audit-tool trap -* [Test gates](test-gates.md) - the local suites, when each is a commit blocker, and bin/record-baselines for accepting only the baselines you meant to move +* [Test gates](test-gates.md) - the local suites, when each is a commit blocker, bin/record-baselines for accepting only the baselines you meant to move, and why a deleted source file still serves from every local _dest/ tree * [CI gates](ci-gates.md) - what GitHub Actions enforces: build, unit, path-scoped link check (visual regression is report-only), and what gates a PR never sees * [Template PDFs](pdf-templates.md) - regenerating the downloadable course PDFs diff --git a/.okf/build/test-gates.md b/.okf/build/test-gates.md index 6629281d7..88addfde0 100644 --- a/.okf/build/test-gates.md +++ b/.okf/build/test-gates.md @@ -8,6 +8,7 @@ generated: { by: claude/opus-4-8, at: 2026-08-12T20:20:00Z } verified: - { by: claude/fable-5, at: 2026-08-01T11:30:00Z } - { by: claude/sonnet-5, at: 2026-08-20T00:00:00Z } + - { by: claude/opus-5, at: 2026-08-20T23:45:00Z } - { by: claude/opus-5, at: 2026-08-21T00:00:00Z } timestamp: 2026-08-21T00:00:00Z --- @@ -216,6 +217,46 @@ Minitest under `test/`, driven by `Rakefile` (`Rake::TestTask`). a build-recipe change invalidates the tree. Diagnosis tell: `grep localhost:1314 _dest//404.html` returns hits; escape hatch is `FORCE_BUILD=1` or `rm -rf` the tree. + +- **No local build path passes `--cleanDestinationDir`, so DELETED sources + keep serving from the dest tree forever** (2026-08-20). `bin/hugo-build:47` + builds with `hugo build --noBuildLock --environment --destination + ` and `Hugo#precompile` (`test/support/hugo_helpers.rb:24-38`) with a + bare `hugo --destination `; only the CI Pages build + (`.github/workflows/_hugo.yml:82`) cleans. Hugo does not remove outputs + whose source is gone, so an orphaned page or asset persists in every local + `_dest/` tree until someone `rm -rf`s it. Note this is NOT the staleness + probe failing - `bin/build-if-stale` handles deletions correctly (it + probes DIRECTORIES, whose mtime a delete bumps). The tree is genuinely + rebuilt and STILL serves the deleted file, which is why the usual + "did it rebuild?" reflex diagnoses it wrong. + + Consequence for any rendered-output test: **deleting a source file to + prove a test goes RED proves nothing.** On 2026-08-20 a new og:image test + stayed green through three delete-and-rerun attempts against a stale + `_dest/public-test-local`. Clear the dest dir before trusting a RED, the + same way a screenshot baseline must be COMMITTED before trusting a + re-record (both are "the assertion is right, the input is stale"). + +- **A rendered-output sweep can look thorough and check almost nothing** + (2026-08-20). Count the DISTINCT values a sweep actually resolves before + trusting its breadth - a glob over 1757 files is not coverage. The first + `og_image_resolves_test.rb` matched `property="..." content="..."` as a + FIXED attribute sequence. Two facts collapsed 1297 tag matches to ONE url + checked: most values are off-origin CDN urls that fell through the + same-origin filter, and the theme partials + (`themes/beaver/layouts/blog/list.html:23`, + `themes/beaver/layouts/partials/page/cover_image.html:3,:11`) write + `content=` BEFORE `property=`, so the content-first tag on 480 pages was + dropped. Those pages still matched via their property-first tag, which is + why nothing looked wrong - what was lost was one whole distinct image. + Match whole tags and extract the attribute separately. + + The trap underneath: **a reproduction test can be honestly RED for the + right reason and still cover nothing else.** RED->GREEN passed cleanly + because the single path the sweep reached WAS the defect under repair. + Coverage and correctness are independent; proving the second says + nothing about the first. - The snap_diff HTML report at `test/fixtures/screenshots/snap_diff_report.html` (gitignored) is written automatically on any RED run - the gem auto-registers the reporter on diff --git a/.okf/log.md b/.okf/log.md index 398c8f0c7..6610227aa 100644 --- a/.okf/log.md +++ b/.okf/log.md @@ -42,6 +42,102 @@ root. Every other screenshot in this repo lives under `docs/projects//` Removed in #514. Binary at the repo root is the kind of thing the next session copies because it looks sanctioned. +## 2026-08-20 - maintain pass 2: a claim I wrote was wrong in three files + +Review found "a fixed attribute sequence silently skipped 480 tag pages" +false - measured, 0 pages were missed entirely; what was dropped was the +content-first SECOND tag on those pages, losing one distinct image. The +wrong number had already propagated from the test comment into +`build/test-gates.md` and this log. All three corrected. Lesson lifted to +[workflows/review-swarm.md](workflows/review-swarm.md): brief critics to +return measurements, and scrutinise the prose describing a fix as hard as +the fix. Also dropped a `CGI.unescape` that was a no-op on every url in the +build and could only misfire (it decodes `+` as a space, a form rule that is +wrong for paths). + +## 2026-08-20 - maintain pass: two concepts corrected against the code + +* `architecture/seo-meta-tags.md` `resource:` and its citation pointed at + `themes/beaver/layouts/partials/seo/enhanced-meta-tags.html` - a path that + DOES NOT EXIST (that dir holds only schema partials). Repointed at the + live root-level override `layouts/partials/seo/enhanced-meta-tags.html`. + Also corrected `.Resize "1200x630 webp q85"` -> `jpg q90` (WebP unfurls + blank on LinkedIn), and documented the site-default fallback + its test. +* `build/test-gates.md` gained the `--cleanDestinationDir` caveat lifted out + of the entry below, per this bundle's own rule that log.md records what + changed and concepts record what is true. +## 2026-08-20 - 553 pages previewed blank on social; the tests that should have caught it asserted the wrong thing + +**The site-wide `og:image` fallback pointed at a file nobody ever uploaded.** +`layouts/partials/seo/enhanced-meta-tags.html:129` defaults to +`https://jetthoughts.com/assets/images/og-default.jpg`; `static/assets/` +did not exist. 553 pages - overwhelmingly blog posts without cover art - +rendered a social card that 404'd, so every LinkedIn and Slack share of them +previewed blank. Nothing on the site links an `og:image`, which is why it +survived: it is the one asset class no crawler, no link-checker, and no +reader ever exercises. + +**Why the existing gate could not see it.** +`test/unit/meta_tags/meta_tags_test.rb:136-149` asserts the tag EXISTS and +that width/height are `1200`/`630`. Both passed throughout. That is an +existence-plus-config assertion of exactly the kind CLAUDE.md rejects: it +describes the markup, never the thing the markup points at. New +`test/unit/og_image_resolves_test.rb` sweeps RENDERED HTML for every +`og:image`/`twitter:image` and resolves each SAME-ORIGIN path against the +build. Same principle as the rendered-output rule for text ratchets. +Off-origin CDN URLs (`wsrv.nl?url=raw.githubusercontent.com/...`) are +deliberately not followed: `enhanced-meta-tags.html` only emits them inside +`{{- if $resource -}}`, so the build already guarantees the source resource +exists, and what is left is a publish-time network question. + +**A rendered-output sweep can look thorough and check almost nothing.** +The first version matched `property="..." content="..."` as a FIXED +attribute sequence. Two facts collapsed that to a single URL checked out of +1297 tag matches: 682 of 683 distinct values are off-origin CDN URLs that +fell through the same-origin filter, and the two theme partials +(`themes/beaver/layouts/blog/list.html:23`, +`themes/beaver/layouts/partials/page/cover_image.html:3,:11`) write +`content=` BEFORE `property=`, dropping the content-first tag on 480 pages +(they still matched via their property-first tag - what was lost was one whole +distinct image, not the pages). The +test was `File.exist?` on one path wearing a 1757-file glob. It passed RED +and GREEN honestly, because the one path it checked was the defect under +repair - a reproduction test can be genuinely red for the right reason and +still cover nothing else. Match whole `` tags and extract `content` +separately; count the DISTINCT URLs a sweep actually resolves before +trusting its breadth. + +**What this test structurally cannot catch.** If a page resource is +missing, Hugo does not emit a dangling `og:image` - the `{{ if . }}` / +`{{ with }}` guards drop the tag entirely, so the page silently ships with +NO social image. Deleting `content/blog/og-blog.jpg` (480 tag pages) proved +this: the sweep stayed green because the reference vanished rather than +broke. Dangling-reference and missing-tag are two different defects; this +gate covers only the first. + +**The false GREEN worth remembering.** After writing the test I deleted the +JPG to confirm RED - and it stayed green through three attempts. First +diagnosis (warm tree, build skipped) was WRONG: `bin/build-if-stale` detects +deletions correctly. The tree rebuilt every time and still served the file, +because no local build path passes `--cleanDestinationDir`. Rule lifted to +[build/test-gates.md](build/test-gates.md) - it is not a log fact, it +governs every rendered-output test from here on. + +**Fix:** a branded 1200x630 brand plate at `static/assets/images/og-default.jpg` +(JetVelocity obsidian/ruby per `.stitch/design.md`, canon figures only). It is +deliberately NOT the campaign pitch the first draft carried - a fallback +stands in under arbitrary technical posts, where "Your dev shop stopped +delivering" over a Puma-config article reads as an ad rather than an article. + +**CI, adjacent:** clarified in `build/ci-gates.md` that `filter: blob:none` +must NOT be copied into the other five workflows. `_hugo.yml` is the only job +setting `fetch-depth: 0`, and the filter's entire win is skipping historical +blobs; the rest run at depth 1, where there is no history to skip and git +must still materialise every blob at HEAD. Their slow checkouts are the +625 MB of images in the tree, not a missing flag. + +Touched: `build/ci-gates.md`. + ## 2026-08-21 - The course's "good positions" were an artifact; GA4 UI setup closed out **Course discovery diagnosed, and the inherited premise is retracted.** Two diff --git a/.okf/workflows/review-swarm.md b/.okf/workflows/review-swarm.md index 394479685..07fdb55be 100644 --- a/.okf/workflows/review-swarm.md +++ b/.okf/workflows/review-swarm.md @@ -6,6 +6,9 @@ tags: [swarm, review, process] generated: by: process:okf-migrate at: 2026-07-24T00:00:00Z +verified: + - { by: claude/opus-5, at: 2026-08-21T00:10:00Z } +timestamp: 2026-08-21T00:10:00Z --- # The loop @@ -101,3 +104,17 @@ verdict format, and the two or three specific things to attack. - Fixer geometry claims (SVG sizes, clipping fixed) must be re-verified by your own re-render - one wave shipped a wording truncation nobody saw. - Parallel sessions contend on .git/index.lock - wait-loop before git ops. +- **Brief critics to return MEASUREMENTS, not verdicts** (2026-08-20). Two + consecutive reviewers on one small test each found a claim that passed + self-review twice, and in both cases the decisive artifact was a COUNT: + "this sweep resolves 1 distinct url, not 683" killed a test that looked + thorough, and "0 pages were missed entirely" killed the comment written + to describe the fix. Ask for the number that would be different if the + claim were false. A critic who returns an opinion can be argued with; a + critic who returns a count cannot. +- **Claims ABOUT a fix need the same scrutiny as the fix** (2026-08-20). A + corrected defect ships with prose describing it - a comment, a concept, a + log entry - and that prose is written at the moment of least skepticism. + Both overstatements this session were in comments, not code, and one had + already propagated into two `.okf/` files before review caught it. Grep + your own explanation for numbers you did not measure. diff --git a/.stitch/og-default.svg b/.stitch/og-default.svg new file mode 100644 index 000000000..2479fb0ed --- /dev/null +++ b/.stitch/og-default.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JetThoughts + RUBY ON RAILS · REACT · FRACTIONAL CTO + + + + + We build, rescue, and stabilize + Rails and React products. + + + + + + RATED ON CLUTCH + 4.8 / 5 + + + + AVERAGE CLIENT STAYS + 5 years + + + + SHIPPING RAILS + since 2008 + + diff --git a/static/assets/images/og-default.jpg b/static/assets/images/og-default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b017e1b6719e54e8daed9834901488e9b79d874 GIT binary patch literal 58994 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

A*Xii?CPr$Q- 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 UcAri~<_hR1f-Kq@YX2DfAL7h!8vp]*(?:property|name)="(?:og:image|twitter:image)"[^>]*>/ + CONTENT_ATTR = /content="([^"]*)"/ + SITE_ORIGIN = "https://jetthoughts.com" + + def test_every_social_image_resolves_to_a_file_in_the_build + refs = collect_social_image_refs + refute_empty refs, "Build should emit social images - sweep found none" + + missing = refs.reject { |url, _| File.exist?(build_path_for(url)) } + + assert_empty missing.map { |url, page| "#{url} (referenced by #{page})" }, + "Social images referenced by rendered pages must exist in the build" + end + + private + + # => { url => first page that referenced it } + def collect_social_image_refs + Dir.glob("#{root_path}/**/*.html").each_with_object({}) do |page, refs| + File.read(page).scan(SOCIAL_META).each do |tag| + url = same_origin_url(tag[CONTENT_ATTR, 1].to_s.gsub("&", "&")) + refs[url] ||= page.delete_prefix("#{root_path}/") if url + end + end + end + + # Same-origin URL, or nil for anything this build does not produce. + # + # Off-origin images are deliberately NOT followed. Most og:image values are + # CDN-proxied (wsrv.nl?url=raw.githubusercontent.com/...), and behind that + # proxy sits a Hugo page resource that enhanced-meta-tags.html only emits + # inside `if $resource` - so the build itself already guarantees the source + # exists. What is left is a publish-time question (is it pushed to master + # yet), which needs the network, not the filesystem. + def same_origin_url(raw) + raw = raw.delete_prefix(SITE_ORIGIN) + raw.start_with?("/") ? raw.split("?").first : nil + end + + def build_path_for(url) + File.join(root_path, url) + end +end From f5353313e1ea7698c4e6879b37f8c3510afe699a Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Thu, 20 Aug 2026 23:51:08 +0200 Subject: [PATCH 2/3] OKF: three rules the og:image PR taught, lifted into concepts Maintain pass over what the PR itself produced, per the bundle's own rule that log.md records what changed and concepts record what is true. * build/test-gates.md - the .gitignore bullet now covers SUBdirectories of a tracked dot-dir. .stitch/*.md is tracked but .stitch/designs/ is ignored, so the og:image plate source placed there was invisible. Records the asymmetry that matters: `git add ` ERRORS on an ignored path while `git add -A` silently omits it, which makes explicit-path staging the safer default whenever a commit's value depends on a specific file landing. * architecture/seo-meta-tags.md - the og-plate regeneration recipe plus the md5 proving the SVG regenerates the committed jpg byte-identically. That makes it the source of record rather than an approximation: a canon change is edited in the SVG and re-rendered, never painted onto the jpg. * index.md - when two sessions verify one concept concurrently and a rebase conflicts on the `verified:` array, keep BOTH entries and take the later timestamp. Both verifications really happened; dropping one falsifies the provenance the field exists to carry. Hit today on build/test-gates.md. okf validate --strict: conformant, no warnings on any touched file. Co-Authored-By: Claude Opus 5 --- .okf/architecture/seo-meta-tags.md | 13 ++++++++++++- .okf/build/test-gates.md | 6 ++++++ .okf/index.md | 6 +++++- .okf/log.md | 13 +++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/.okf/architecture/seo-meta-tags.md b/.okf/architecture/seo-meta-tags.md index 4265e3a86..5bea34ecd 100644 --- a/.okf/architecture/seo-meta-tags.md +++ b/.okf/architecture/seo-meta-tags.md @@ -55,7 +55,18 @@ campaign pitch: a fallback stands in under arbitrary technical posts, where sales copy over a Puma-config article reads as an ad. Any figure on it is bound by [claims-canon](/content/claims-canon.md), and because those figures live inside a binary, **no text ratchet can see them** - the generator source -is kept in-repo so they stay greppable. +is kept in-repo so they stay greppable: + +``` +# .stitch/og-default.svg (NOT .stitch/designs/, which is gitignored) +rsvg-convert -w 1200 -h 630 -o /tmp/og.png .stitch/og-default.svg +magick /tmp/og.png -quality 88 static/assets/images/og-default.jpg +``` + +Verified byte-identical to the committed jpg (`md5 +ecd26681b0c591a68d1315d5d578d05c`), so the SVG is the source of record rather +than an approximation of it - a canon change is edited there and re-rendered, +never painted onto the jpg. Guarded since 2026-08-20 by `test/unit/og_image_resolves_test.rb`, which resolves every same-origin `og:image`/`twitter:image` in RENDERED output diff --git a/.okf/build/test-gates.md b/.okf/build/test-gates.md index 88addfde0..167cde6ba 100644 --- a/.okf/build/test-gates.md +++ b/.okf/build/test-gates.md @@ -312,6 +312,12 @@ Minitest under `test/`, driven by `Rakefile` (`Rake::TestTask`). the repo - fresh clones had a hooksPath pointing at nothing. Adding any root dotfile/dot-dir? Check `git check-ignore -v ` before assuming it's tracked. + Same rule bites SUBdirectories of a tracked dot-dir: `.stitch/*.md` is + tracked but `.stitch/designs/` is ignored, so a source file placed there + is invisible (2026-08-20, the og:image plate source). **`git add ` + ERRORS on an ignored path; `git add -A` just silently omits it** - which + is the case for staging by explicit path when a commit's value depends on + a specific file actually landing. - REPORT-ONLY build gates (each flips to blocking once its backlog hits zero via an env flag): `bin/check-svg-floor` (`SVG_FLOOR_BLOCK=1`) catches course SVGs whose smallest text renders <9px@390; diff --git a/.okf/index.md b/.okf/index.md index 31aab78b1..8dbdcc2b1 100644 --- a/.okf/index.md +++ b/.okf/index.md @@ -16,7 +16,11 @@ frontmatter: `generated: { by: , at: }`, `verified: [{ by, at }]`, human-reviewed trust tier. These are OPTIONAL and added honestly by whoever touches a concept; absence never invalidates it (§11). Legacy concepts still carrying only `timestamp` remain conformant and migrate as they're edited — do -NOT back-stamp `generated`/`verified` you didn't actually perform. +NOT back-stamp `generated`/`verified` you didn't actually perform. When two +sessions verify the same concept concurrently and a rebase conflicts on the +`verified:` array, keep BOTH entries and take the later `timestamp` - each +verification really happened, and dropping one falsifies the provenance the +field exists to carry (2026-08-20, `build/test-gates.md`). # Sections diff --git a/.okf/log.md b/.okf/log.md index 6610227aa..d2bee2826 100644 --- a/.okf/log.md +++ b/.okf/log.md @@ -2,6 +2,19 @@ Newest first. Entries before 2026-08-19 are squashed to one line each (compacted 2026-08-20); their full text is in this file's git history. + +## 2026-08-21 - maintain pass 3: three rules the og:image PR taught, lifted + +* `build/test-gates.md` - the `.gitignore` bullet now covers SUBdirectories + of a tracked dot-dir (`.stitch/*.md` tracked, `.stitch/designs/` ignored), + and records that `git add ` ERRORS on an ignored path while + `git add -A` silently omits it. Staging by explicit path is the safer + default whenever a commit's value depends on a specific file landing. +* `architecture/seo-meta-tags.md` - added the og-plate regeneration recipe + and the md5 proving the SVG is the source of record, not an approximation. +* `index.md` - when two sessions verify one concept concurrently, a rebase + conflict on `verified:` is resolved by keeping BOTH entries. Dropping one + falsifies the provenance the field exists to carry. ## 2026-08-21 - Two gate lessons from merging six PRs: the stall masks, the local red lies Both are sharpenings of rules the bundle already had, and both came from the From 834d727fcd2468071f52df217d5bf6368f586954 Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Fri, 21 Aug 2026 00:04:00 +0200 Subject: [PATCH 3/3] OKF: the redesign rollout SEQUENCE was undiscoverable from the bundle design/site-palette.md carried the palette DECISION, but nothing carried the ORDER it ships in. A session consuming .okf/ after Phase 1a.3 would reasonably pick up 1a.4 next - and that is the wrong order. Paul re-sequenced on 2026-08-20 to run the BLOG before the site-wide chrome sprint. New workflows/site-redesign-rollout.md (type: Decision, pointing at 20.01-rollout-plan.md) distils what outlives any single phase: * Phases are ordered by whether LAYOUT MOVES, not by size. A recolour fault is a wrong colour caught in a screenshot diff and revertable alone; a spatial fault is a layout break and baselines churn wholesale. That is why Phase 1 splits into 1a/1b at the cost of one extra re-record. * No A/B test is available anywhere in this rollout (ADR-0004), so reversibility is the substitute for statistical confidence - which is what makes that extra re-record worth paying for. * Blog first: that is where the humans are, and blog pages sit at 25.2% scroll depth / 26.3s against a site average of 32.9-40.3% / 28-34s. * The cost blog-first accepts on purpose: token definitions move twice, so duplicate tokens mid-rollout are the plan working, not a mistake. * Gates that block regardless: 2.4's GSC keyword gate (a conversion gain paid for in rankings is a loss), and 2.2 coupling the course page via pages/blog-single.css. Live phase status is deliberately NOT copied here - a state snapshot in a concept rots within days; the plan doc under `resource:` owns it. All five cited paths verified to exist. Cross-linked both ways with site-palette. okf validate --strict: conformant, no warnings on the new or edited concepts. Co-Authored-By: Claude Opus 5 --- .okf/design/site-palette.md | 5 +- .okf/log.md | 18 ++++++ .okf/workflows/index.md | 1 + .okf/workflows/site-redesign-rollout.md | 80 +++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 .okf/workflows/site-redesign-rollout.md diff --git a/.okf/design/site-palette.md b/.okf/design/site-palette.md index 1c6918d67..603980ceb 100644 --- a/.okf/design/site-palette.md +++ b/.okf/design/site-palette.md @@ -86,7 +86,10 @@ anything else going dark is a defect: # Deprecations in progress `--color-primary` (`#1a8cff`) is named "primary" and dies in 2608 Phase 1a.2, -along with the late-cascade `#0066d6` anchor rule in 1a.3. +along with the late-cascade `#0066d6` anchor rule in 1a.3. WHEN those phases +run relative to everything else is a separate decision - see the +[rollout sequence](/workflows/site-redesign-rollout.md); the blog bundles ship +before the site-wide chrome, so tokens land in blog CSS first. **It is the logo's colour, and that is the point, not a reason to keep it.** `themes/beaver/assets/img/icons/logo-dark.svg` contains exactly one hex value: diff --git a/.okf/log.md b/.okf/log.md index d2bee2826..cb231ef5e 100644 --- a/.okf/log.md +++ b/.okf/log.md @@ -3,6 +3,24 @@ Newest first. Entries before 2026-08-19 are squashed to one line each (compacted 2026-08-20); their full text is in this file's git history. +## 2026-08-21 - new concept: the rollout SEQUENCE was undiscoverable + +`design/site-palette.md` carried the palette decision, but nothing in the +bundle carried the ORDER it ships in. A session consuming `.okf/` after +Phase 1a.3 would reasonably do 1a.4 next - and that is the wrong order: +Paul re-sequenced 2026-08-20 to run the BLOG before the site-wide chrome. + +New [workflows/site-redesign-rollout.md](workflows/site-redesign-rollout.md) +distils the three rules that decide sequence (order by whether LAYOUT MOVES +not by size; no A/B exists at this traffic so reversibility substitutes for +statistical confidence; blog first because that is where the humans are), the +cost blog-first accepts on purpose (token definitions move twice - duplicate +tokens mid-rollout are the plan working, not a mistake), and the gates that +block regardless (2.4's GSC keyword gate; 2.2 coupling the course page). + +Live phase status deliberately NOT copied - it rots; the plan doc under +`resource:` owns it. Cross-linked from site-palette. + ## 2026-08-21 - maintain pass 3: three rules the og:image PR taught, lifted * `build/test-gates.md` - the `.gitignore` bullet now covers SUBdirectories diff --git a/.okf/workflows/index.md b/.okf/workflows/index.md index 6a34d87ad..3839dd339 100644 --- a/.okf/workflows/index.md +++ b/.okf/workflows/index.md @@ -6,6 +6,7 @@ * [Blog Post Pipeline](blog-pipeline.md) - mandatory end-to-end workflow for writing/publishing blog posts, plus the execute-don't-read claims gate, the frontmatter claims check, and the `## Sources` citation convention * [LinkedIn Post Pipeline](linkedin-post-pipeline.md) - Paul Keen voice rules and posting workflow * [CSS Maintainability Redesign](css-maintainability-plan.md) - approved plan for hand-editable CSS + FL-Builder retirement +* [Rescue Room rollout sequence](site-redesign-rollout.md) - why phases are ordered by whether layout moves, why blog runs before site-wide chrome, and the gates that block regardless * [Visual Scroll Gate](visual-scroll-gate.md) - blocking pre-handback visual walk for content/visual changes * Test suites, rake tasks, and the visual-regression gate live in [test-gates](/build/test-gates.md) (`workflows/testing.md` was squashed into it 2026-08-20 - it duplicated the gate rules and still carried the superseded "run both suites per commit" instruction) * [Analytics Access](analytics-access.md) - live GA4 + Search Console MCP servers, correct property IDs, credential split, data-lag traps, and why GA4 sessions must be reconciled against GSC clicks before being quoted diff --git a/.okf/workflows/site-redesign-rollout.md b/.okf/workflows/site-redesign-rollout.md new file mode 100644 index 000000000..6e49c3ccd --- /dev/null +++ b/.okf/workflows/site-redesign-rollout.md @@ -0,0 +1,80 @@ +--- +type: Decision +title: Rescue Room rollout sequence (2608) +description: Phases are ordered by whether LAYOUT MOVES, not by size; blog runs before site-wide chrome; no A/B is available at this traffic, so reversibility substitutes for statistical confidence. +resource: docs/projects/2608-site-design-system/20-29-strategy/20.01-rollout-plan.md +tags: [design, rollout, sequencing, decision, adr] +status: stable +generated: + by: claude/opus-5 + at: 2026-08-21T00:30:00Z +timestamp: 2026-08-21T00:30:00Z +--- + +# Why this concept exists + +The palette DECISION is in [site-palette](/design/site-palette.md). This is the +ORDER the decision ships in, which is a separate call and the one a session +gets wrong. Reading only the palette concept, the obvious next move after +Phase 1a.3 is 1a.4 - and that is the wrong order (see blog-first below). + +Live phase status lives in the plan doc under `resource:`, not here; a state +snapshot in a concept rots within days. What is recorded here is the reasoning +that outlives any particular phase. + +# Three rules that decide sequence + +**1. Phases are ordered by whether LAYOUT MOVES, not by size.** A recolour +leaves every element in place: a fault is a wrong colour, caught in a +screenshot diff, revertable alone. A spatial change shifts every page +vertically: a fault is a layout break and baselines churn wholesale (143 macOS ++ 135 Linux). Hence Phase 1 splits - 1a recolours, 1b moves things - costing +one extra baseline re-record and buying a rollback point in between. + +**2. No A/B test is available anywhere in this rollout** (ADR-0004). Real human +traffic is ~9.7 sessions/day; the cheapest viable engagement test needs 192 +days to reach power, lead conversion ~3.6 years. GA4's ~300/day is 85-90% bots. +**Reversibility is the substitute for statistical confidence** - which is what +justifies the 1a/1b split paying an extra re-record for a rollback point. Gates +are A (qualitative), B (guardrails with declared rollback thresholds), C +(reversibility). Never attach a performance or conversion CLAIM to a phase +whose case is coherence. + +**3. Blog before site-wide chrome** (Paul, 2026-08-20). That is where the +humans already are - the ~145 GSC clicks/28d land overwhelmingly on posts - and +the blog bundles do not touch the money pages. It also has the clearest +engagement problem to move: blog pages sit at **25.2% average scroll depth / +26.3s** against a site average of 32.9-40.3% / 28-34s (Clarity, bot-filtered, +2026-08-20 baseline). + +# The cost blog-first accepts, and why it is not a bug + +Because the blog phases run first, new tokens are defined INSIDE the blog +bundles' own CSS (`pages/blog-list.css`, `pages/blog-single.css`) and promoted +to `foundations/css-variables.css` in Phase 1a later. **The token definitions +move twice.** A reviewer seeing duplicate token definitions mid-rollout is +looking at the plan working, not a mistake. It is slower overall, and it buys +learning whether the design engages anyone before the whole site commits to it. + +# Gates that block regardless of sequence + +- **2.4 (homepage) carries an extra, blocking GSC gate.** The cut removes the + twelve service tiles and the framework logo grid; both carry keywords, and + the site has just been through a GSC re-baseline and a fractional-CTO + cluster cannibalisation. Pull GSC query/page data for `/` BEFORE removing any + section and keep whatever earns impressions - collapsed below the FAQ, not + deleted. A conversion gain paid for in rankings is a loss. +- **Per-phase measurement reads are RETIRED as gates** (Paul, 2026-08-20 + evening): "avoid measures, rebuild the whole blog, and we will use measure + based on the whole blog." Nothing blog-scoped waits on a reading. The read + still happens - once, over the whole rebuilt blog - and is informational. +- **2.2 couples the course page.** `blog-single` shares + `pages/blog-single.css` with `course-single`; sequence 2.3 immediately after + or screenshot both. + +# Citations + +[1] `docs/projects/2608-site-design-system/20-29-strategy/20.01-rollout-plan.md` +[2] `docs/projects/2608-site-design-system/20-29-strategy/20.02-phase-1a-plan.md` +[3] `docs/adr/0003-site-design-system.md`, `docs/adr/0004-static-site-experimentation.md` +[4] `docs/projects/2608-site-design-system/40-49-measurement/40.01-blog-engagement-baseline.md`