Skip to content

C3.1 table overflow + purge of fabricated testimonials on four live pages - #481

Merged
pftg merged 2 commits into
masterfrom
sprint-c3-w4-2026-08-20
Aug 20, 2026
Merged

pftg merged 2 commits into
masterfrom
sprint-c3-w4-2026-08-20

Conversation

@pftg

@pftg pftg commented Aug 20, 2026 •

Copy link
Copy Markdown
Member

Two things: the oldest open queue defect, and a live claims exposure found by following C0.1's ratchet output.


1. C3.1 — dense tables scroll inside themselves on phones

W2's scroll gate flagged this in August; the fix was frozen "until this wave" because it needs shared CSS.

Reproduced first, and it was worse than recorded. On fractional-cto-sow-reference a table rendered 507px wide inside a 354px column (recorded as 25px of overflow), with overflow-x: visible on the parent — no scroll container anywhere. So the whole page dragged sideways on a phone, costing the reader the text column, not just the table. first-paying-customer-operating-kit confirmed too (51px, pre-existing since W1 #428).

One mobile-scoped media query in single-post.css, which both single.html and course/single.html already load — one rule covers blog, course, and every sibling reference table. display: block is what makes a table scrollable and is the real risk; scoping it under 767px keeps the desktop auto-layout the wide tables depend on.

Verified at a true 390×844 device render: all four tables cap at the column and scroll internally, document.scrollWidth == viewport on both pages. Desktop re-checked at 1280: display: table, overflow-x: visible, full 684px column, untouched.


2. Fabricated testimonials, live on four pages

C0.1's new ratchet reported 40 pre-existing violations, 25 of them one string syndicated across every services page. Pulling that thread found something well past a banned adjective.

data/testimonials.yaml carried four synthetic testimonials — Sarah Chen / TechStart Solutions, David Rodriguez / EcomMega, Maria Gonzalez / HealthTech Innovations, Alex Thompson / EduPlatform — with placeholder-shaped company names and unsourced round metrics ("Secured $2M Series A", "300% improvement in page load speeds", "99.8% uptime"). They rendered on the live homepage, /clients, /about-us and /use-cases.

The mechanism is the interesting part: someone had already curated hugo.toml down to the single real testimonial (Bruno Wozniak / PubNative — corroborated by a live LinkedIn profile, and the entry that feeds the Review schema). But partials/page/testimonials.html prefers the data file and only falls back to site params, so the data file silently overrode that curation in the visible render. Structured data was clean; the visible copy was not. Same defect class the schema purges of 2026-08-14 and #475 removed — this was the half nobody had swept.

Removed all four. Kept Bruno's verbatim quote and attribution; dropped his results block, three round percentages that appear nowhere in his quote and trace to no source. Restore path is documented in the file header.

Also relabelled: fractional-cto-roi-calculator presented five full-name founders with direct quotes under "Real Founder Stories … from JetThoughts clients", with no anonymisation disclaimer — and said "three stories" while showing five. Its sibling infrastructure-spending-evaluation already carries the honest form ("names changed, numbers accurate"). Relabelled as composites, count fixed.

Test plan

  • bin/qtest --changed green
  • bin/test (macOS leg) — 34 runs, 87 assertions, 53 screenshots, 0 failures
  • Linux leg via CI. Not run locally — bin/dtest on an ARM Mac is QEMU-emulated Chrome and plants sub-pixel drift that then fails CI (.okf/build/test-gates.md)
  • Note: zero screenshots moved despite removing four carousel entries, which means the visual suite does not cover the testimonial section. Logged as a coverage gap, not fixed here.

🤖 Generated with Claude Code

W2's scroll gate flagged this in August and the fix was frozen 'until this
wave'. Reproduced before fixing, and it was worse than recorded: on
fractional-cto-sow-reference a table rendered 507px wide inside a 354px
column (recorded as 25px), with overflow-x visible on the parent - no
scroll container anywhere. first-paying-customer-operating-kit overflowed
51px, pre-existing since W1 #428.

Mobile-only media query in single-post.css, which both single.html and
course/single.html already load, so one rule covers blog and course and
every sibling reference table at once. display:block is what makes a
table scrollable; scoping it under 767px keeps the desktop auto-layout
the wide reference tables depend on.

Verified at a true 390x844 device render: all four tables now cap at the
354px column and scroll internally, document scrollWidth == viewport on
both named pages (was overflowing). Desktop re-checked at 1280:
display:table, overflow-x:visible, full 684px column - untouched.
bin/qtest --changed green (34 runs, 53 screenshots, 0 failures).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5d4c05fa-d3dc-4538-af48-8d4bf5113d63


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

❤️ Share

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

…se studies

Found by following C0.1's ratchet output: 25 of its 40 violations traced to
client copy syndicated across every services page. Pulling that thread
surfaced something much worse than a banned adjective.

**data/testimonials.yaml carried four synthetic testimonials** - Sarah Chen
/ TechStart Solutions, David Rodriguez / EcomMega, Maria Gonzalez /
HealthTech Innovations, Alex Thompson / EduPlatform - with
placeholder-shaped company names and unsourced round metrics ('Secured $2M
Series A', '300% improvement in page load speeds', '99.8% uptime'). They
rendered on the LIVE homepage, /clients, /about-us and /use-cases, because
this data file overrides the curated single testimonial in hugo.toml.

Someone had already curated hugo.toml down to the one real testimonial
(Bruno Wozniak / PubNative, corroborated by a live LinkedIn profile and the
Review schema). The data file quietly overrode that curation in the visible
render. Same defect class the schema purges of 2026-08-14 and #475 removed
from structured data - this was the visible-copy half nobody had swept.

Removed all four. Kept Bruno's verbatim quote and attribution, dropped his
 block: three round percentages that appear nowhere in his quote
and trace to no source. Restore path is in the file header.

Also: fractional-cto-roi-calculator presented five full-name founders with
direct quotes under 'Real Founder Stories ... from JetThoughts clients',
with no anonymisation disclaimer - and said 'three stories' while showing
five. Its sibling infrastructure-spending post already carries the honest
form ('names changed, numbers accurate'). Relabelled as composites with the
count fixed. NOTE: 'Sarah Chen' appears both here and in the synthetic
testimonials, which is why I did not simply assert these are real
engagements - see the handback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@pftg pftg changed the title C3.1: dense tables scroll inside themselves on phones (frozen since W2) C3.1 table overflow + purge of fabricated testimonials on four live pages Aug 20, 2026
@pftg
pftg merged commit 2cc440e into master Aug 20, 2026
6 checks passed
@pftg
pftg deleted the sprint-c3-w4-2026-08-20 branch August 20, 2026 13:01
pftg added a commit that referenced this pull request Aug 20, 2026
* Course/blog: dense tables scroll inside themselves on phones (C3.1)

W2's scroll gate flagged this in August and the fix was frozen 'until this
wave'. Reproduced before fixing, and it was worse than recorded: on
fractional-cto-sow-reference a table rendered 507px wide inside a 354px
column (recorded as 25px), with overflow-x visible on the parent - no
scroll container anywhere. first-paying-customer-operating-kit overflowed
51px, pre-existing since W1 #428.

Mobile-only media query in single-post.css, which both single.html and
course/single.html already load, so one rule covers blog and course and
every sibling reference table at once. display:block is what makes a
table scrollable; scoping it under 767px keeps the desktop auto-layout
the wide reference tables depend on.

Verified at a true 390x844 device render: all four tables now cap at the
354px column and scroll internally, document scrollWidth == viewport on
both named pages (was overflowing). Desktop re-checked at 1280:
display:table, overflow-x:visible, full 684px column - untouched.
bin/qtest --changed green (34 runs, 53 screenshots, 0 failures).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Purge fabricated testimonials from four live pages; label invented case studies

Found by following C0.1's ratchet output: 25 of its 40 violations traced to
client copy syndicated across every services page. Pulling that thread
surfaced something much worse than a banned adjective.

**data/testimonials.yaml carried four synthetic testimonials** - Sarah Chen
/ TechStart Solutions, David Rodriguez / EcomMega, Maria Gonzalez /
HealthTech Innovations, Alex Thompson / EduPlatform - with
placeholder-shaped company names and unsourced round metrics ('Secured $2M
Series A', '300% improvement in page load speeds', '99.8% uptime'). They
rendered on the LIVE homepage, /clients, /about-us and /use-cases, because
this data file overrides the curated single testimonial in hugo.toml.

Someone had already curated hugo.toml down to the one real testimonial
(Bruno Wozniak / PubNative, corroborated by a live LinkedIn profile and the
Review schema). The data file quietly overrode that curation in the visible
render. Same defect class the schema purges of 2026-08-14 and #475 removed
from structured data - this was the visible-copy half nobody had swept.

Removed all four. Kept Bruno's verbatim quote and attribution, dropped his
 block: three round percentages that appear nowhere in his quote
and trace to no source. Restore path is in the file header.

Also: fractional-cto-roi-calculator presented five full-name founders with
direct quotes under 'Real Founder Stories ... from JetThoughts clients',
with no anonymisation disclaimer - and said 'three stories' while showing
five. Its sibling infrastructure-spending post already carries the honest
form ('names changed, numbers accurate'). Relabelled as composites with the
count fixed. NOTE: 'Sarah Chen' appears both here and in the synthetic
testimonials, which is why I did not simply assert these are real
engagements - see the handback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* OKF: session wrap-up - testimonial canon rule, estimation lesson, two coverage gaps

Four durable captures from the 2026-08-20 session that were not already
logged as they happened:

- claims-canon gains a testimonial rule. The finding worth keeping is not
  'four fake testimonials existed' but the MECHANISM: hugo.toml had been
  curated to the one real testimonial, and data/testimonials.yaml silently
  outranked it because the partial reads the data file first. Cleaning a
  config is not cleaning the page - check which source wins.
- Query before estimating. A panel guessed a click rate GA could answer,
  and a kill-criterion override shipped on the guess at ~5x off, which
  would have made the campaign unkillable. Records the GA-vs-LinkedIn
  division of labour so it stops drifting back onto Paul.
- The visual suite does not cover the testimonial carousel: four live pages
  changed, zero of 53 screenshots moved.
- Fresh agent worktrees need bun install v1.3.13 (bf2e2cec)

+ cssnano@8.0.6
+ postcss@8.5.26
+ postcss-import@17.0.0
+ postcss-nested@8.0.1
+ surge@0.43.1
+ caniuse-lite@1.0.30001809

51 packages installed [518.00ms] before bin/dev.

Not re-logged: the exhibit two-layer trap, the fallback-font em correction,
the ratchet-reads-built-HTML change and the analytics read were all written
to .okf/log.md as they happened. The 4-eyes rule another session added to
CLAUDE.md (#482) already covers 'self-review is not the second pair of
eyes', so this session's identical finding is corroboration, not a new rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Remove the fabricated founder stories (Paul: 'she is not real')

Sarah Chen is confirmed invented. She appeared in both the synthetic
testimonials purged in #481 and, with a surname and a direct quote, in a
live post - so the whole batch goes.

fractional-cto-roi-calculator: removed the five-founder section entirely
(Sarah Chen, Marcus Thompson, Jennifer Martinez, David Park, Emma
Rodriguez) along with BOTH of its false claims - the 'Real Founder
Stories ... from JetThoughts clients' heading and the closing 'these
aren't hypothetical scenarios - they're real situations from JetThoughts
clients in the past 24 months'. The five underlying patterns are worth
keeping, so they stay as an unattributed list that states plainly we have
no completed case study of our own to publish yet.

infrastructure-spending-evaluation: corrected in the same pass. Its
'real stories from our clients (names changed, numbers accurate)' form had
looked like the honest convention - I nearly left it on that basis
earlier today. With the fabrication next door confirmed, an unverifiable
'numbers accurate' claim is the same defect in better clothes.

Rule recorded in claims-canon: a disclaimer that asserts MORE than you can
verify is not a fix. 'Names changed, numbers accurate' claims real
provenance. If nobody can produce the client, write 'illustrative
composite'.

Repo-wide sweep: zero surviving instances of the invented personas or the
real-client claims outside the audit trail in data/testimonials.yaml.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
pftg added a commit that referenced this pull request Aug 20, 2026
… x Rails cluster (R1, R4, R5) (#488)

* test: catch up stale macos baselines after master copy purges

careers/_overview, nav/use_cases, and mobile/about_us baselines still
showed pre-purge copy (World-Class Training, the 32-clients ratings
line, old mission text) from before the de-cliche/testimonial PRs
(#477/#479/#481). Current renders match master's intentional content;
diffs inspected image-by-image before accepting. Linux legs were
updated by those PRs' CI runs - only the host-only macos set was stale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* content(refresh): YJIT guide rewritten as Ruby 4.0 YJIT vs ZJIT, fabrications purged

August refresh slot (20.09 §5). Premise audit redirected the slot: the
plan's named candidate (Kamal/Traefik SSL post) had decayed to 4
impressions/pos 20, while ruby-3-4-yjit-performance-guide holds 6,310
impressions at pos 9.5 AND carried fabricated claims - invented Shopify
internal metrics ($2.4M savings), fabricated GitHub results, two fake
JetThoughts client case studies, and a fictional Ruby 3.5/3.6/4.0
roadmap. Full in-place rewrite: every claim now cites a primary source
(ruby-lang 4.0 notes, railsatscale ZJIT launch, speed.ruby-lang.org,
Rails 7.2 announcement, official YJIT docs).

Review loop: 3-critic panel + cold-eyes gate. critic-tech verdict
NEEDS-FIXES -> fixed: the initializer claim was mechanically false
(initializers run for rake tasks too - rewritten as the explicit trap),
ISEQs not methods, 4.1 goal is surpass-not-parity, hedged the prebuilt-
binary claim. critic-slop: PASS 8/10, SEO clean (title 40, desc 152,
5 internal links verified, 6 citations). critic-editor: minor edits,
all applied; diagram redrawn around the CPU-vs-I/O decision. cold-eyes:
PUBLISH-READY after fixing desc flag-count and a fabricated reader
quote. Moved flat file content/blog/2025/*.md into a page bundle (slug
unchanged, URL stable) for local cover + pre-rendered mermaid (18px
labels = 12.7px at 390w, clears the 9px floor). New stitch cover.
check-post-visuals FLOOR ratcheted 78->72 per the script's own report.
Gates: hugo-build green, qtest green, zero console errors/404s.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* content(ai-rails): RubyLLM getting-started + fibers-for-LLM-streaming posts (20.09 §12 R1, R4)

Two new Rails-technical posts from the RubyLLM x Rails queue Paul
directed today. R1 owns 'rubyllm rails' (chat/persistence/tools/
streaming with the real 1.16.0 API, every claim verified against
rubyllm.com + gem source). R4 owns the fibers-vs-threads arithmetic for
LLM streaming (Puma 3-thread default vs 30-60s SSE streams, Falcon/
async, semaphore rate limiting, honest ActionController::Live thread
caveat) and bridges the falcon cluster.

Review loop per post: 3-critic panel + cold-eyes. critic-tech caught 2
majors, both fixed: an unsourced author-stance attribution in R1
(contradicted by the project's own README tagline) and R4's overreach
that Live streams cost only a fiber under Falcon (Live spawns its pool
thread unconditionally - now stated honestly). critic-slop: PASS 8/10
both; cross-post exhibit dedup applied (job snippet lives in R1, R4
links it). critic-editor: minor edits, applied. cold-eyes: PUBLISH-
READY both (one universal-claim fix in R1). Covers from the 6-slot
template; mermaid pre-rendered (R1 272px, R4 675px wide - labels clear
the 9px mobile floor); scroll gate walked desktop+mobile; hugo-build
green; check-post-visuals at floor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* content(ai-rails): multi-agent RubyLLM pipeline post (20.09 §12 R5) + cluster polish

R5 is the practitioner centerpiece of today's cluster: our production
talent-matching pipeline - eight agents on a 21-line RubyLLM::Agent
base class, a 16-line reduce Workflow, reflector-driven stop loop,
bounded-integer scoring summed in Ruby, and the commit-documented
Aug 16 outage (with_connection held across multi-second LLM calls under
fiber fan-out starved a pool of 10 against 15 fibers). All architecture
facts sourced from the real codebase; gem API cross-checked against
ruby_llm 1.16.

Review loop: critic-tech caught a real BLOCKER - temperature {} blocks
are a silent no-op in ruby_llm 1.16 (only model accepts a block); the
published sketch now declares temperature statically. (Side finding:
the production app's own temperature block is likely a no-op too -
flagged to Paul.) Also fixed: the 'gem rejects out-of-range integers'
claim (no client-side validation exists; the fetch/clamp is the real
enforcement). critic-slop: PASS 8.5/10, the strongest of the four.
critic-editor: minor edits, applied. cold-eyes: PUBLISH-READY after one
universal-claim trim. Cluster-wide polish across all four of today's
posts: 'genuinely' intensifier sweep, 'earns' metaphor thinned,
verbatim phrase dedup, cover alt fixed to describe the actual cover.
Gates: hugo-build green, visuals ratchet at floor, scroll gate walked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* okf(content): same-day-cluster voice tells + ruby_llm temperature-block gotcha

Four posts in one batch exposed cluster-level fingerprints per-post
review can't see (shared intensifier, shared metaphor family, verbatim
phrase reuse, meta-narration templates, cloned CTA tails) - added the
cross-batch sweep to voice-rules. Logged the ruby_llm 1.16 finding that
only model accepts a block (temperature {} is a silent no-op).
Validated: okf:validate --strict conformant.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): 20.09 §12 execution status - R1/R4/R5 shipped, R3 rescope verdict, R2 caution

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): 20.09 §12 - add R7 (agent evals) and R8 (agent debugging) from Paul's directive

Both grounded in first-hand production material surfaced today
(agent_logs audit trail, VCR matching trap, invariant-test pattern).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): groomed note - Ollama import needs a light banned-phrase refresh

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* content: re-anchor version framing to Rails 8 (Paul: don't lead with Rails 7)

YJIT post now opens its default-check section with 'Every Rails 8 app
has YJIT on out of the box' (7.2 kept only as the cited change-point);
fibers post opens the thread arithmetic with the Rails 8.1 default
('3 threads per worker'), verified against the current rails/rails puma
template (threads ENV.fetch RAILS_MAX_THREADS, 3). R1/R5 were already
version-neutral.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(pipeline): add batch-mode prompt for N-post sprints

Encodes the three practices the 2026-08-20 4-post batch validated on top
of the per-post pipeline: live-GSC premise audit before topic pick,
real-code mining for first-hand material (with sanitization rule),
and the same-day-cluster sweep after the last post. Paste-ready prompt
so future sprints don't reconstruct the orchestration from memory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* agents: blog-batch-orchestrator + blog-post-coordinator for N-post loops

Outer loop (orchestrator): groomed-queue picks with live-GSC premise
audit, WIP=1 dispatch of one coordinator per post, cluster sweep with
its own 4-eyes pass, plan/OKF sync, one PR, CI watch with flake-rerun.
Inner loop (coordinator): writer packet -> resumable 3-critic panel ->
cold-eyes 9-check gate -> ship gates -> commit, bounded at 2 fix rounds
per gate with SHIPPED/RESCOPE/BLOCKED reporting. blog-pipeline.md batch
section now names the agent form ('Spawn blog-batch-orchestrator, N=4')
with the paste prompt as the registry-free fallback.

4-eyes: agent-def reviewer verdict FIX-FIRST -> all 5 findings applied
(worktree-or-nothing for any second committing coordinator, critic pass
on the sweep diff before the polish commit, dev-server port added to
the dispatch contract, founder-persona note, bounded-iteration cap).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant