GENERATIVE ASSETS · INDUSTRY DEMO 263 · DRIVER TRAINING
First Gear Driving School is a fictional Cannington driving school, built as a conversion-first landing page demonstration. The audience is a 16-year-old with a fresh learner's permit, the parent doing the supervising, and the adult coming back after years off the road — so the page's single job is booking the first lesson, with an honest hours planner that turns WA's 50-hour log book from a chore into a plan.
Driver training sells calm, not horsepower. The whole page is designed to feel like the instructor who never raises their voice: a quiet chalk-sky morning street, soft-cornered road-sign type, and prices said plainly enough that a nervous 16-year-old (or their parent, who is really the buyer) can see the whole cost of getting licensed before anyone calls anyone.
The signature Hours Planner is the conversion engine: a 0–50 slider fills a 50-cell log-book grid, a suburban route map extends from carpark laps through lane changes to the freeway merge and test routes as the learner's stage advances, and a mono recommendation card names the honest package for that stage — including, prominently, the WA fact this trade trades on: an instructor hour counts 1:1 in the log book here. No 3-for-1 multiplier. A school that says that plainly earns the booking; one that lets you assume eastern-states arithmetic doesn't deserve it.
Argued from a quiet Cannington backstreet at 9am: chalk sky, fresh bitumen, the L-plate in the window, and the instructor's calm. Deliberately distinct from skipbins' industrial gal-yard yellow — this yellow always reads as an L-plate, often literally framed as one (the favicon, the wordmark, the map base marker, even the slider thumb).
From carpark laps to the test route
RUBIK · DISPLAYRoad-sign geometry with soft corners — confident but kind, which is the brand. The hero's one typographic flourish is an L-yellow highlight bar under "test route"; the wordmark frames its L in an actual L-plate square.
The brake on my side means the mistake on yours is safe to make.
KARLA · BODY & UIA warm workhorse grotesque — legible at 16px on a parent's phone, friendly without being cute.
$740 + $170 = $910 · 15 / 50 HRS
DM MONO · HOURS, LESSON COUNTS, PRICESEvery number on the page is mono — the log book aesthetic. If the promise is honest hours, the numerals should look like entries.
The progress board is one hand-built SVG (640×460) in two halves. The top is a 50-cell log-book grid — ten columns by five rows, cells built in JS and styled ONLY via CSS classes (never presentation attributes, the W16/W17 discipline), so the yellow fill transitions cleanly as the slider climbs. The bottom is a suburban route map: a carpark with a practice loop, a two-lane street with a lane-change weave, an on-ramp merging onto a stylised Roe Hwy, and a dashed test-route branch past the (real) Cannington DoT centre.
The planner exposes window.__drivingschool (hours, stage, transmission, plan items, total, single-lesson option, cells filled, form status) as the QA state probe, and every interaction pre-fills the booking form's transmission, starting-point and notes fields — the estimator becomes a warmer lead (the W12 handoff contract). Pre-fill fires only on interaction, so a fresh load still fails an empty submit on all seven fields (W15).
Pinned anchors from the spec: single lesson $80 (60 minutes, pick-up and drop-off included, no call-out fee — the single lesson IS the pinned minimum), 5-pack $380 ($76/lesson), 10-pack $740 ($74/lesson), manual +$5/lesson (packs +$25/+$50), practical test package $170. Stage logic: 0–10 h recommends the 5-pack, 10–35 h the building plan, 35–50 h the test-ready plan.
| Scenario | Model | Measured |
|---|---|---|
| Rest state — building, 15 h, auto | 740 + 170 | $910 ✓ |
| Building, manual | 740 + 50 + 170 | $960 ✓ |
| First lessons, auto | 380 (single 80 shown) | $380 ✓ · $80 = grid floor |
| First lessons, manual | 380 + 25 (single 85) | $405 ✓ |
| Test-ready, auto | 380 + 170 | $550 ✓ |
| Test-ready, manual | 380 + 25 + 170 | $575 ✓ |
Derived (not spec-pinned), documented per W15: the spec's stage list names the 10-pack for the building stage, but its own pinned rest figure ($910) is 10-pack PLUS test package — so the building recommendation includes the test package, itemised on-card, on the logic that ten lessons from mid-book lands you at the test window with a date worth booking. The test package is deliberately flat across transmission — test day is one drive either way; the +$5 covers pack-lesson clutch wear — shipped as a stated flatness, not an invented gradient. Stage boundaries are half-open: 10 h is building, 35 h is test-ready. All figures were verified against an independently reimplemented oracle at rest and across eleven driven scenarios, including both boundaries and the manual pack arithmetic.
Cheapest-output contract (W12): at the first-lessons stage the card visibly offers the single lesson at $80 — "no lock-in, no call-out fee" — which equals the services grid's "lessons from $80" floor. The page never argues with itself.
This demo ships only WebPage schema naming itself a demonstration — fictional LocalBusiness/Review markup in a real index would be dishonest. For a real school we'd ship:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"additionalType": "https://en.wikipedia.org/wiki/Driving_school",
"name": "Real Driving School",
"telephone": "+61 8 XXXX XXXX",
"address": {
"@type": "PostalAddress",
"addressLocality": "Cannington",
"addressRegion": "WA",
"postalCode": "6107",
"addressCountry": "AU"
},
"areaServed": "Perth south-east corridor",
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
"opens": "07:00", "closes": "19:00"
},
"priceRange": "$$",
"makesOffer": [{
"@type": "Offer",
"name": "Driving lesson (60 min)",
"price": "80", "priceCurrency": "AUD"
}],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9", "reviewCount": "214"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "Real Parent" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Fed from the live Google reviews profile."
}]
}
</script>
Plus a Google Business Profile wired to the review flow, suburb-level pages for "driving lessons [suburb]" across the corridor, and the test-centre head terms ("driving test Cannington") — the queries this trade actually wins on.
Drove the full harness against an independently reimplemented pricing oracle: rest state measured $910 (10-pack $740 + test package $170, matching the spec's pinned example), eleven driven scenarios green including the manual pack arithmetic (+$25 → $405 five-pack, +$50 → $790 ten-pack, building manual $960), both stage boundaries (10 h → building, 35 h → test-ready), the 50-hour stamp, and the first-stage single-lesson $80 floor. Empty submit on a fresh load flagged all seven fields; filled submit confirmed inside the lexicon. Two finds: the 375×667 fold check put the trust line 6px below the fold — compacted the mobile hero rhythm (26px hero padding, tighter h1/sub/CTA gaps) and it landed at 604px; and my own harness serialised DOMRects to NaN — fixed the harness, never the site (W12 family).
The screenshot review caught what the asserts couldn't: the sticky call bar's phone number wrapped to two lines at 375, and the trust line sat BEHIND the sticky bar — dropped the ghost CTA on mobile (the sticky bar carries its "Plan hours" twin, the towing pattern), set nowrap compact labels, and re-verified the fold. Added the in-board live readout ("BUILDING · $910") after the 1200×750 review showed the price card starting below the thumbnail cut — the thumbnail now sells the meter. Added the desktop three-step strip ($80 first lesson → reassessed every five → $170 test day) to balance the hero's short left column, and the price-tick micro-interaction on the plan total.
Masthead first at 375 (W18): wordmark right edge 174px, call button 260–351px — one row, no collision, screenshot confirmed. Hid the slider's visible label at 375 (the input keeps its aria-label) after the planner screenshot showed it crowding the value readout. Chanel rule: removed the hero's radial yellow wash — it earned nothing the L-plate highlight wasn't already doing. Final sweep 73/73: scrollWidth 375/768 clean, exactly one h1 per page, reserved-phone positive sweep (5 × (08) 9000 0263, no other 9xxx exchange), WebPage-only live JSON-LD, planner top at 117px inside the 750px thumbnail, phone pattern v-flag-safe, zero console errors on every run, and the reduced-motion pass rendered the rest state fully settled with the blinker animation off. Final copy read: no display line ends in punctuation, all prices cross-checked against the planner's measured outputs.