Thomas Cheesman

Case study · tc-ventures.ca

This site

The site you are reading, built with AI agents one numbered session at a time. The handoffs, the rules and my rulings on its copy are public in the repo.

Stack
Hand-written HTML and CSS, with a little JavaScript on top · one stylesheet · no framework, no build step
Status
Live  rebuild in progress
Hosted
Cloudflare, static files · a push to main deploys
Since
September 2026 · one numbered handoff per session
The ask

What I asked for, in my own words

“Being a bit of a portfolio it should be unique, detailed, complex, and push the limits of what is modern with AI-assisted web design. It needs a ‘wow’ factor. Also, the contact page is not done and will get some special attention because contact pages always seem like a lame afterthought and they are generic.”

“I build with AI” proves nothing on its own. So this site had to show it: built to the rules it describes, with its handoffs, reviews and plans public for anyone to check.

The standard

What “good” meant, written down first

Each session starts by reading the newest handoff: a numbered file that says where things stand and which rules hold. A session that changes anything ends by writing the next one. The rules carry forward; the story of each session does not.handoff-016 §5

- **Content renders without JavaScript.** JS is allowed on top (motion, 3D, controls); the words and links must not depend on it. No dependencies or build step — prebuilt bundles copied into `assets/` only.

- **Never publish an exact node, edge, report or grade count** *in copy*. Round or describe. The application screenshot on Projects is the one ruled exception.

- **Do not invent dates or figures.** Unknown → ask Thomas.

- **Copy ships only through a copy review** in the copy-review-001/002 format (numbered blocks; OK / KEEP / A / B / FIX / CUT). Template copy is not site copy.
Four of the standing rules, verbatim from handoff-016.md §3. Curated: the file has more.

The loop each session runs through

The brief is mine. The spec says what good means before anything is built. The agent builds. I review the copy block by block and rule on each one. A correction worth keeping becomes a rule, the rule goes into the next handoff, and the next session starts from there.

The working loop Six steps in a row - brief, spec, build, review, rule, next session - joined left to right by arrows, with a dashed arrow returning from the last step to the first. Brief my words Spec what good means Build the agent Review OK · CUT · FIX Rule written down Next session handoff-NNN the rule carries forward; the narrative does not
Each step links to a real file from this site’s own build.
What the AI got wrong

Three misses that went live

All three were on the live site before they were caught.

  1. A clean accessibility report, and a keyboard that lost its place

    The 3D graph on the Projects page loads when you press a button. When the graph arrived, the button hid itself, and keyboard focus went with it: it fell back to the page as a whole instead of moving to the graph. The automated accessibility checker had found nothing wrong on any page.

    Kind of miss: looked right but was not measured · handoff-012 §2
  2. Passed locally, broke live

    The site got a content security policy: a header that tells browsers which scripts the site may run. It passed on a local server. The live site also runs an analytics script that Cloudflare adds as it serves the page, which the local copy never had, and the policy blocked it. Visitor analytics stopped for one deploy.

    Kind of miss: looked right but was not measured · handoff-015, traps
  3. Exact counts that disagreed with the graph

    The first live copy gave the research graph’s size to the exact report. The copy of the graph a visitor could actually open, on another of my sites, held a small fraction of that. And the research keeps growing, so even a correct figure would have been wrong within weeks.

    Kind of miss: drift across sessions · receipts-001, R-011
How I caught it

Use it, load it live, read every line

  1. Tested it myself

    I found it when I tested the graph myself. I should not have trusted that it worked, but it was so basic that I assumed it did. My mistake.copy-review-003, T7 Focus now moves to the graph when it loads, and the arrow keys step through the graph’s connections, each one described in the panel.

    Became the rule: test the thing itself, not a proxy for it · CLAUDE.md, rule 1
  2. Loaded the live site and read its console

    The deploy was checked from outside: the real site, in a browser, not the local copy. The browser console showed the blocked script. The policy now allows Cloudflare’s analytics, and the script was confirmed loading on the live site.

    Became the rule: after any change to the security policy, load the live site and read the console · handoff-015, traps
  3. A numbered review of every live sentence

    The first copy review put everything public on the site in front of me as numbered blocks, before I had read any of it, and flagged that the count on the page and the graph a visitor could reach disagreed. I ruled that counts are rounded or described, never exact. The home page now says “nearly four thousand”.

    Became the rule: never publish an exact count in copy · handoff-002 §3
Each correction, the standing rule it falls under, and where that rule lives. The first three are the misses above; the other four come from the same inventory.
The correctionThe standing ruleEnforced in
A clean checker report; keyboard focus lost when the graph loaded handoff-012 Test the thing itself, not a proxy for it: drag the slider, Tab through the page, load it logged out CLAUDE.md · rule 1
A security policy that passed locally blocked analytics live handoff-015 After any change to the security policy, load the live site and read the console handoff traps · CLAUDE.md rule 2
Exact counts that disagreed with the graph a visitor could open handoff-002 Never publish an exact node, edge, report or grade count in copy. Round or describe. handoff §3, every session
A button marked hidden still showed with JavaScript off: a layout rule outranked the hidden attribute R-019 Content renders without JavaScript, and nothing heavy loads before a click. Test it with JavaScript off handoff §3, every session
“Three or four” condition guides on the rare-disease site; its own menu listed five R-022 Count with a command, never from memory CLAUDE.md · rule 12
Links pointed at old .html addresses that redirect: on record in the third handoff, fixed in the fifteenth handoff-015 Clean addresses everywhere: menu, canonical links and sitemap handoff §1
Told me my LinkedIn had no About section; the page loads in parts and was never scrolled handoff-015 Say what you read, not what exists: “I could not see X”, never “X is missing” CLAUDE.md · rule 6
What shipped

A static site, one stylesheet, and its working files in the open

The site is live at tc-ventures.ca. Its words and links render with JavaScript off, and the one heavy thing, the 3D graph, waits for a click. The fonts and the graph’s code library are served from the site itself, not from a third party.

The home page: the heading I run a nonprofit's website, and I hold it to a written standard, above the opening paragraph, with Projects, Background and Contact in the menu.
The home page.
The GPRS case study: the heading A housing society's website, a one-line summary, a table of stack, status and hosting, and a side index of the six sections.
The first case study, built from the same template as this page.

The honest limits

As of September 2026 the rebuild is part-way through, and the plan it follows is public. There are no page-weight or accessibility scores on this page: nothing measures them by script yet, and I don’t type figures in by hand. The site has not had a screen-reader run-through yet.

Receipts

The files behind every claim above

No document, no edge. Anything in sections three and four that could not be tied to a file was cut before it got here.