Skip to content

Fault-injection audit: 3 of 8 planted defects caught, 5 missed - #572

Merged
pftg merged 1 commit into
masterfrom
fault-injection
Aug 22, 2026
Merged

Fault-injection audit: 3 of 8 planted defects caught, 5 missed#572
pftg merged 1 commit into
masterfrom
fault-injection

Conversation

@pftg

@pftg pftg commented Aug 22, 2026

Copy link
Copy Markdown
Member

Eight defects modelled on ones this repo has actually shipped, injected one at a time, predictions written down BEFORE measuring. 3 caught, 5 missed. Two predictions were wrong (F and H) — both predicted caught, both missed, and both wrong for reasons bigger than the defect.

Two findings that outrank the exercise

1. bin/rake test:links inspects almost nothing. Production renders internal links absolute (https://jetthoughts.com/...), and lychee --offline excludes every http(s) URI by design. Site-wide: 133,874 of 149,516 links excluded. On the homepage: 141 total, 140 excluded, 1 OK — and that one is its own #main-content skip-link anchor. The job has been green because it checks nothing. Fix verified rather than asserted: adding --remap turns that page into 35 OK, 1 Error and names the planted break.

2. Below-fold blindness, quantified. The capture is viewport-sized: at 1920x1080 it gates 1080px of a 3822px page — 28.3% covered, 71.7% dark. The planted #564-class defect sits at y=1090, ten pixels outside the frame. Four of the five content bands begin below the fold.

Matrix

# Defect Predicted Actual
A CTA text fails contrast (above fold) CAUGHT CAUGHT (0.00046, 4.6x the floor)
B Muted column → ink (below fold, the #564 bug) MISSED MISSED
C Testimonial smoothed CAUGHT CAUGHT
D Tenure frozen to "18+" MISSED MISSED (blind until 2027-01-01; control with "19+" fails, so the gate is live)
E noindex removed from /next/ CAUGHT CAUGHT
F Banned phrase "world-class" in a pilot CAUGHT MISSED
G class on a <th> (purge trap) MISSED MISSED
H Broken internal link CAUGHT MISSED

Why F was missed

MarketingCopyTest carries RENDERED_BASELINE = 14 against an actual count of 11 — three hits of slack, measured with the gate itself (baseline 0 → clean 11, injected 12). Separately SURFACES never globs content/next/**, so the rendered pass is the entire v2 rail's only cover.

Why G cannot be caught in principle

Four counts prove the mechanism: rule in source CSS = 1, rule in built CSS = 0, class in rendered HTML = 1, class in hugo_stats.json = 0. The visual gate builds ENVIRONMENT=production, so it purges exactly as production does and matches its baseline.

Caveat on A

It was caught as a pixel change, not a contrast failure — the same gate fires identically on an intentional recolour. Nothing in this suite measures contrast ratios.

🤖 Generated with Claude Code

https://claude.ai/code/session_011SP5gaqXEgUie8pdFrmbeJ

Injected eight defects modelled on ones this repo has shipped, one at a
time, each followed by the narrowest gate that should catch it. Predictions
were written before any run; two were wrong and both are recorded as wrong.

Caught: above-fold contrast (A), smoothed testimonial (C), lost noindex (E).
Missed: below-fold visual (B), frozen tenure (D), banned phrase (F), the
<th> purge trap (G), broken internal link (H).

Two findings the predictions did not anticipate:

- test:links checks almost nothing. The production build renders internal
  links absolute, and lychee --offline excludes all http(s) URIs, so 133,874
  of 149,516 links are excluded; the homepage checks exactly one link, its
  own #main-content anchor. A --remap of the host onto the build dir was
  verified to catch the planted break.
- MarketingCopyTest's rendered ratchet has three hits of slack (baseline 14,
  actual 11), which is what let the injected banned phrase through.

Below-fold coverage quantified for task #12: the viewport-sized capture gates
28.3% of the editorial pilot (1080px of 3822px). The injected #564-class
defect sits at y=1090 - ten pixels outside the frame.

No baselines re-recorded; every injection reverted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SP5gaqXEgUie8pdFrmbeJ
@pftg
pftg merged commit 6d1dedf into master Aug 22, 2026
@pftg
pftg deleted the fault-injection branch August 22, 2026 10:00
@coderabbitai

coderabbitai Bot commented Aug 22, 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: 3130c7ed-64da-4754-9ab1-4740b5be2002


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.

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