Build notes · Generative Assets
A fictional four-van roof-safety outfit in Bayswater, built as an industry demonstration. The page has one job: turn “how much is a roof anchor” into a booking, by putting the system, the fall clearance and the price on screen before anyone picks up the phone. Everything on it is procedural — SVG, CSS and vanilla JavaScript, no libraries, no images, one file.
One SVG building elevation. A roof edge runs across the top with the selected anchors set along it as cased hi-vis caps, and where a horizontal static line is specified it is strung between two end assemblies with the intermediate brackets at their computed positions. A worker 1.8 m tall stands at the edge, clipped on. Beneath them the fall-clearance stack falls from the roof edge in labelled bands — free fall, deceleration, harness stretch, the worker’s own height below the D-ring, and the safety margin — against the available drop drawn as a dimension line in arrest red.
The whole argument of the business is in that drawing: on a 2.0 m lanyard you need 8.15 m of air below you, and a Perth warehouse gutter is six. So where the stack reaches the ground before it has finished, the overrun is drawn below grade in the shortfall band and labelled in metres. Nobody who watches a stack drive into the dirt forgets it.
The scene is assembled synchronously into seven named groups (gSky, gBuild, gStack, gDim, gRoof, gWorker, gLabels) every time the state changes, and the animation loop only ever writes attributes onto elements that already exist. Nothing is inserted into the SVG after the loop starts and no CSS rule animates a property that the same element also sets as a presentation attribute — both of those are known ways to get a scene that reports itself as painted while rendering nothing.
The metric frame is zoom-to-fit on the drop: always the clear drop plus 3.0 m of roof and parapet above and 1.0 m below grade, so it runs from a 7.0 m frame at the 3 m step to a 16.0 m frame at the 12 m step. The 1.8 m worker never changes size relative to that scale — at the 16 m frame they stand 11.3 % of the frame height, which is the smallest they get. Every clearance is held in integer centimetres and divided once at display; every price is held in integer cents. The price function asserts Number.isInteger on each line it returns and that the total is a whole dollar, and it throws rather than print a rounded lie.
The label column is a real dimension table: each component’s name sits over its figure, right-aligned, with a leader running to the band it measures. Rows are placed by a collision pass that reserves the gap budget of every row still beneath it, so the column is guaranteed to finish above the ground line no matter how far the stack overruns — the verdict chip in the ground band can never be reached.
On a cold load the stack drops in over 0.85 s on an ease-out cubic, driven from the animation loop as a scaleY transform about the roof edge, gated on a firstDraw flag with a settle-timer backstop. A resize never re-enters it. Everything after that is idle motion with a visibility floor: the red drop dimension breathes between 0.74 and 1.0 opacity, the lanyard and the static line sway on a shared sine, and the inspection tag hanging off the first anchor rocks with them. Under prefers-reduced-motion the loop never starts and the scene renders settled and complete.
Argued straight off a Perth roof: the zinc-grey of Klip-lok sheet as the paper, the carbon of a drawn line as the ink, the red of an energy-absorbing lanyard as the accent, and the yellow-green of a hi-vis static line as a mark that never becomes a word. Every ratio below was measured from the shipped tokens in the running page with WCAG arithmetic, not read off the spec.
Both were found by computing ratios the concept’s own table did not cover, and both changed the drawing.
Oswald 600 carries the display. It is a condensed signage grotesque, and the argument for it is the trade itself — every word printed on a roof-safety tag, a load-test label or a hi-vis vest is set condensed, because the surface is always too small. Inter Tight 400/500 does the reading. Roboto Mono 500 appears in exactly one role: quantities. Clearances, lengths, drops, tag strings, dimension labels and the ledger’s money column — anything you would read off a tape or a certificate.
The typographic moment is the rest state’s requirement set enormous in the hero: 8.15 m at up to 83 px with REQUIRED BELOW YOU under it in mono at wide tracking. It is the number the whole page exists to make you feel, and it is the first thing on screen at 375 px after the headline.
Everything the estimator does is arithmetic on pinned anchors. The rates and the minimums:
| Line | Rate | Notes |
|---|---|---|
| Roof anchor, installed & tested | $290 each | Klip-lok. Concrete +$50, tile +$100 an anchor. |
| Leading-edge SRL anchor | +$120 each | New install only — on a recertification or a replacement we are not supplying the anchor. |
| Horizontal static line | $1,900 + $120/m | Two end assemblies, commissioned and tagged. |
| Intermediate bracket | $340 each | ceil((m − 8) ÷ 8) — 0 at 8 m, 1 at 12 and 16 m, 2 at 24 m. |
| Recertification | $150 + $40 each after | Plus $320 to inspect and re-tag a static line. |
| Anchor replacement | $240 each + $150 | Attendance is one charge for the visit. |
| Register, tags & certificate | $120 | Inside the minimum. There is no line outside it. |
| Minimum attendance | $890 / $290 / $490 | Install / recertification / replacement. |
The concept pins eight worked figures. Before trusting any of them I wrote a separate oracle from the rate table alone and enumerated the whole control grid — 104 checks, all green — then the headless harness drove the running page and compared it against that oracle again on every cell below. All eight reproduced exactly.
| Full control vector | Total | Verdict |
|---|---|---|
| Rest — install · Klip-lok · 4 anchors · 12 m line · 2.0 m lanyard · 9 m drop · pack forced | $4,960 | clears by 0.85 m |
| The same vector at a 6 m drop | $4,960 | 2.15 m short |
| install · Klip-lok · 1 anchor · no line · restraint · 6 m · pack off | $890 | subtotal $290, minimum binds |
| recert · Klip-lok · 6 anchors · 12 m line · restraint · 9 m · pack forced | $790 | — |
| recert · Klip-lok · 1 anchor · no line · restraint · 5 m · pack forced | $290 | subtotal $270 — the grid floor |
| replace · concrete · 3 anchors · no line · restraint · 8 m · pack forced | $1,140 | — |
| install · tile · 8 anchors · 24 m line · SRL · 12 m · pack forced | $9,660 | 2 brackets, clears by 7.10 m |
| install · tile · 12 anchors · 24 m line · SRL — dearest reachable | $11,700 | — |
The cheapest reachable output is $290, which is exactly the “from $290” floor on the recertification card in the services grid — the page never argues with itself. The clearance boundaries were enumerated over the whole stepper rather than spot-checked: the lanyard fails at an 8 m drop and passes at 9, the SRL fails at 4 and passes at 5, and restraint passes at every drop on the stepper because there is nothing to arrest.
The $120 register-and-tagging pack is a free toggle on exactly one cell — a new install with no static line. Everywhere else it is forced on and locked, either because the service is the certificate, or because a lifeline has to be commissioned and entered in the register before anyone clips to it. The pinned partial-unwind chain is driven in every pass and asserted step by step:
| Step | Pack | Why |
|---|---|---|
| install + no line | off, free | the only free cell; the memory captures this |
| install + 12 m line | forced on | the line forces it |
| recert + 12 m line | forced on | now both constraints do |
| recert + no line | holds on | partial unwind — the service still imposes it |
| install + no line | restores off | both constraints lifted, the remembered value returns |
The memory is cleared by any explicit change to the toggle while it is free; otherwise it survives until the lock lifts.
Every pinned figure was re-derived from the rate table in an independent script before the page was trusted. All eight worked totals, both clearance boundaries, the bracket mapping, the grid floor, the dearest cell and the whole force chain reproduced exactly. Three things did not reconcile, and none of them was arithmetic. In each case the reading that reproduces the pinned endpoints was shipped, and the disagreement is written down here rather than quietly resolved.
The view-fit rule pins the frame as always the drop plus 3.0 m of roof above and 1.0 m below grade. Separately, the shortfall is to be “drawn in the shortfall band fill below grade”. Enumerating the eight reachable shortfall states shows the two pins cannot both hold: the maximum shortfall is 5.15 m (a 2.0 m lanyard at a 3 m drop) and only two states — the lanyard at 8 m (0.15 m) and the SRL at 4 m (0.90 m) — actually fit inside a 1.0 m band. The other six overrun it, by up to five times.
Shipped: the frame pin is binding, because it is the reading that makes all three of its own endpoints exactly true — a 7.0 m frame at the 3 m step, 16.0 m at the 12 m step, and the 1.8 m worker at 11.3 % of the frame. The shortfall is drawn to scale while it fits the below-grade band, and where it does not, the band runs to the frame floor and terminates in a drafting break — the zigzag a certification drawing uses when something runs off the sheet — with the true figure printed beside it and an on-page ledger note stating how far past the sheet the stack runs. Nothing is ever drawn to a false length. Both branches are reachable and the harness asserts which one appears at every drop.
Line 2 is pinned as 4 anchors · 12 m line · Klip-lok with a ≤640 px short form of 4 anchors · 12 m · Klip-lok and a singular of 1 anchor. The line chip’s first option is no line, and the spec gives no wording for it.
Shipped: the full form reads N anchors · no static line · Klip-lok and the short form N anchors · no line · Klip-lok — the short form drops the noun exactly as the pinned pair does. Flagged so it can be pinned rather than re-derived next time.
3 systems × 3 services × 3 roofs × 12 anchors × 5 line lengths × 2 pack states is 3,240, which is the figure in the brief. But the pack toggle is forced in fourteen of the fifteen (service, line) pairs, so only one of those pairs has two reachable pack states: the reachable cell count is 1,728. Not a disagreement about any number, but a builder enumerating reachable states gets a different total, so it is worth stating which convention the count uses.
Two further findings that were not disagreements so much as gaps the concept’s tables did not reach: the scene-fill contrast table measures every fill against the body ink but never the accent against those fills, and the hi-vis token’s legibility on the sky is never measured. Both are covered under Palette above, and both changed what got drawn.
Every pass loaded the page in headless Chrome, drove every chip, both steppers, the toggle and the form, and asserted the output against the independent oracle — plus one rapid-fire drive firing twelve control clicks in a single evaluate with no settle between them, to catch a stale closure racing a state swap. The final run is 319 assertions, all green.
Pass 1
clamp() in the stylesheet was written as clamp(2rem,1.16rem+3.5vw,3.3rem) — no whitespace around the +. CSS math requires it, so all four declarations were parse errors and were dropped: the h1 fell back to the UA’s 2em and the hero’s display figure rendered at inherited 16 px. It looked like a slightly small headline, not a bug. Reading the computed font-size off the running page found it in one call.text-wrap:pretty on the note and declaration, which stopped the bracket note orphaning “m” onto its own line.Pass 2
Pass 3
pattern attributes by driving checkValidity on deliberately invalid values — a v-flag parse error leaves a pattern silently validating nothing, and reading the attribute proves nothing.Worth recording because both would have dispatched a fix at a page that was correct. First, the collision sweep failed 18-for-18 on its first run: getBBox() on SVG text returns the full em box including ascent and descent leading, so a row’s own two deliberately stacked lines read as overlapping. Boxes are now shrunk to their ink height before testing. Second, the sweep filtered rotated labels out of the collision test entirely, which is exactly how the verdict chip landed on the rotated shortfall dimension unnoticed — rotated labels are now tested by client rect, which accounts for the transform.
tel: link and one in-page anchor to the form, both 50 px tall. Most of this traffic is a facilities coordinator standing in a carpark with a contractor who will not go up, and the fastest useful action is a phone call.This demonstration page emits only WebPage, WebSite, CreativeWork and BreadcrumbList — nothing business-shaped. Publishing LocalBusiness or Review markup for a company that does not exist would put fictional data into a real index, so the markup a real Setpoint would ship lives here as a code sample instead. The organization type is HomeAndConstructionBusiness, which is the correct schema.org subtype for a height-safety installer.
<!-- would ship on the real site, not on this demonstration -->
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"@id": "https://setpointheightsafety.com.au/#business",
"name": "Setpoint Height Safety",
"description": "Roof anchor points, horizontal static lines, fixed ladders and guardrail — installed, tested and recertified across the Perth metropolitan area.",
"url": "https://setpointheightsafety.com.au/",
"telephone": "+61 8 9xxx xxxx",
"priceRange": "$$",
"image": "https://setpointheightsafety.com.au/img/static-line-osborne-park.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "Unit x, xx Example Road",
"addressLocality": "Bayswater",
"addressRegion": "WA",
"postalCode": "6053",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.92, "longitude": 115.92 },
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "06:00", "closes": "15:00"
}],
"areaServed": [
{ "@type": "City", "name": "Perth" },
{ "@type": "Place", "name": "Bayswater" },
{ "@type": "Place", "name": "Osborne Park" },
{ "@type": "Place", "name": "Malaga" },
{ "@type": "Place", "name": "Welshpool" },
{ "@type": "Place", "name": "Canning Vale" },
{ "@type": "Place", "name": "Como" },
{ "@type": "Place", "name": "Joondalup" },
{ "@type": "Place", "name": "Rockingham" }
],
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Height safety services",
"itemListElement": [
{ "@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Roof anchor supplied, installed and tested to AS/NZS 5532" },
"priceSpecification": { "@type": "PriceSpecification", "price": "290.00", "priceCurrency": "AUD",
"valueAddedTaxIncluded": true } },
{ "@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Horizontal static line, two end assemblies" },
"priceSpecification": { "@type": "PriceSpecification", "price": "1900.00", "priceCurrency": "AUD",
"valueAddedTaxIncluded": true } },
{ "@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Annual anchorage recertification and tagging" },
"priceSpecification": { "@type": "PriceSpecification", "price": "290.00", "priceCurrency": "AUD",
"valueAddedTaxIncluded": true } }
]
},
"aggregateRating": {
"@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "68"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "A real, named, consenting customer" },
"reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" },
"datePublished": "2026-03-11",
"reviewBody": "Eleven expired points retested and tagged in a morning, two replaced on the spot, register in my inbox by three."
}]
}
The rating and the reviews above are the shape of the markup, not values we would invent — on a real build they come out of the client’s own Google Business Profile or review feed, and they only ship once there is something true to put in them.
The rest of the local-search work for a business like this is unglamorous and matters more than the markup: a Google Business Profile with the right primary category and the service area actually drawn, a page per service where the search intent genuinely differs (roof anchor installation, anchor point recertification, static line installation), a page per suburb only where there is real work to show for it, and the standards named the way tradespeople and facilities managers type them — AS/NZS 1891.4, AS/NZS 5532, WorkSafe WA.