KDG Lab · specimen №001 · run 2026-07-14
The has-website quality gate
Can a deterministic checker reproduce a four-second human judgment — this local service business website is weak enough that a demo embarrasses it — with near-zero false GREENs? Finding: the objective floor of that judgment, yes; the aesthetic middle, no — and conceding the middle is precisely how the precision is bought. One page load, no LLM calls, $0 per site.
The asymmetry is the spec
A false RED skips one weak site out of hundreds. A false GREEN mails "I built you a better website" to someone whose site is fine — a credibility hit in a market where owners talk to each other. Every weight below leans one way: when uncertain, protect the prospect from the pitch. The machine judges neglect and era, which are objective; it deliberately refuses to judge beauty. A dated-but-working site walks free, and that is correct.
The failure classes
Verdict is mechanical: findings carry weights, WEAK at score ≥ 10. Forcing classes end the argument on their own; damning classes nearly so; corroborators must gang up. The one deliberate exception on absence signals: a local service site with no phone at all may cross on absences alone — a business that cannot be called is weak by definition.
| class | signal | weight |
|---|---|---|
| forcing — there is no site here | ||
| parked | registrar lander, "this domain may be for sale" | forces WEAK |
| server-default | "Welcome to nginx!" — never built | forces WEAK |
| no-real-site | redirects to Facebook/Instagram/Linktree | forces WEAK |
| damning — one alone is enough, or nearly | ||
| placeholder | lorem ipsum, "Your Text Here", live | 10 |
| pre-mobile | no viewport; a shrunken desktop on a phone | 10 |
| archaic | frameset/Flash · font-tags & layout tables · dated generator | 10 · 8 · 5 |
| under-construction | "coming soon" as the whole site | 8 |
| no-ssl | no working https in 2026 | 8 |
| bad-cert | https present, certificate rotten | 7 |
| mobile-broken | viewport declared, layout overflows anyway | 6 |
| corroborating — must gang up | ||
| free-subdomain | mikesplumbing.wixsite.com — never bought a domain | 7 |
| stale-dates | © five, three, two years old | 5 · 3 · 1 |
| broken-images | dead image boxes on the page | 4 · 2 |
| no-phone | no phone anywhere, on a call-driven trade | 4 |
| builder-default | unmodified default template | 3 |
| thin-content | under ~60 words | 3 |
| no-cta-above-fold | first screen offers no way to act | 2 |
| no-trust | no reviews, licensed, insured, years — anywhere | 2 |
| default-title | "Home" · "New Page 1" · "Untitled" | 2 |
| mixed-content | https page pulling http assets | 2 |
| platform | Wix/Squarespace named, never punished | 1 |
The matrix, honestly
Nineteen synthetic fixtures, ground truth fixed before the first run. Three calibration iterations — every one a mechanism bug, not a weight change; the weights survived their corpus untouched (a corpus that shares authorship with the detectors, which is why five public pages were also run — see the wall notes).
| truth \ verdict | WEAK | DECENT | UNREACHABLE |
|---|---|---|---|
| WEAK | 12 | 1 | 0 |
| DECENT | 0 | 4 | 0 |
| UNREACHABLE | 0 | 0 | 2 |
Precision on WEAK 1.000 (12/12) · recall 0.923 (12/13) · false GREENs: zero — the cell that matters is the DECENT-row zero. The one miss is weak-borderline, a fixture designed to hover at the threshold (score 8 of 10): the accepted false RED, one prospect traded for no credibility risk. It is in the gallery below wearing its miss.
The gallery — every fixture, its verdict, no retouching
All businesses invented, all pages synthetic, photographed at 390 × 844 — the four-second view. Scores out of a threshold of 10.
Provably weak — the pitch goes out











Twelfth of the twelve: redirect-social — the domain 302s to a Facebook page. No screenshot exists because none was taken: the gate classified it from the redirect header alone and fetched nothing. WEAK · forced.
The hard middle — designed to test the seam



Fine — the people the gate protects
And the two nobody could render: unreachable-refused (dead server) and unreachable-hang (answered in 28s of silence — verdict inside the 30s budget). UNREACHABLE is a verdict, not a crash, and it is never judged weak.
Wall notes — what the honest record holds
- The wall had to be made mechanical. In iteration 1 a fixture's 302 sailed through the route guard to m.facebook.com — Playwright does not re-intercept server redirect hops — and the matrix still read green, because the stripped page scored WEAK by junk findings. One off-origin document was fetched, in-Lab, to a fictional URL. The fix classifies redirects from the
Locationheader with zero bytes fetched. A green matrix must be read row by row. - Transport states are simulated on localhost (marked "(simulated)" in evidence), so the live paths were proven against public test endpoints: expired.badssl.com (cert rejected → http fallback attempted → UNREACHABLE, correct) and http.badssl.com (upgrade probe found working https, so no flag — precision first).
- Fingerprints were validated on real markup, not just self-authored fixtures: a public Squarespace template demo (free-subdomain + platform both fired) and a public Wix template preview (platform fired). A wordpress.com theme demo answered 403 to headless Chrome — and the gate refused to judge it, which is the design working.
- Determinism: same input → byte-identical JSON across runs; staleness anchors to an explicit
--today. No LLM calls anywhere; the run cost $0.
Graduation
Proven here ≠ wired there. The production memo (GRADUATION.md, in the Lab repo) specifies the input contract, the runtime, the human-review slice — every GREEN still gets the real four seconds before any pitch — and the one decision that belongs to the CEO, not the checker: what "batch-able" means for the bad-website segment. Lab code never copy-pastes into prod; the front door is the only door.

