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.
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.
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.
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.
Three misses that went live
All three were on the live site before they were caught.
-
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 -
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 -
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
Use it, load it live, read every line
-
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 -
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 -
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
| The correction | The standing rule | Enforced 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 |
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 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.
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.
-
The brief, in my words, before any building
-
The standing rules every session starts from, and how a handoff is written
handoff-016.md §3, §5 ·
-
The rule against exact counts, and why
handoff-002.md §3 ·
-
The keyboard focus fix, and what the checker could not see
handoff-012.md §2 ·
-
The blocked analytics script, and the LinkedIn misread
handoff-015.md, traps ·
-
My rulings on this page’s copy, including how I found the focus bug
reviews/copy-review-003.md T0–T10 ·
-
All seven misses, with their sources
-
The twenty rules the receipts inventory produced
-
The plan this rebuild follows