# ETS27 design studio — the working setup

Adapted from Felix Rieseberg's "Made by mechanical means" (27 September 2026): one coordinating Claude in charge of the project, many threads working in parallel on a shared folder with a shared memory, every iteration published as a page the owner clicks through on a laptop or a phone, critique in plain words ("I like this", "less excited"), adversarial QA threads that try to break the result, and hill-climbing against measurable targets. The owner never reads the code. Mapped onto this machine instead of Anthropic's cloud.

## How it maps

| In the post | Here |
|---|---|
| One Claude Project in charge; it spins off threads, shares files and memory between them, supervises the fleet | This Claude Code session (Ultracode on) is the coordinating Claude. Threads are workflow agents (Claude Opus 5.5 / Fable 5.1), Agent subagents, and GPT-6 Astra peers running Codex in `tu` terminals for a second design lineage. |
| One shared folder of files | `design/` (this folder) inside the project. Every thread reads and writes here. |
| One shared memory where decisions are written down, so new threads follow them without repetition | `design/DECISIONS.md`. The coordinator appends every decision the owner makes, dated. Every thread reads it before doing anything. Mirrored into Claude's own memory for future sessions. |
| Inspiration dumped on the table like with a design team (posters, films, ads, photos, concepts) | `design/inspiration/`: drop images, PDFs, screenshots, links, notes there, or paste them in chat. `inspiration/INSPIRATION.md` is the running list with the owner's own words next to each item. |
| Ten threads exploring directions in parallel with very little guidance; 25 brainstorm sites | `rounds/r01-brainstorm/<direction>/index.html`, one self-contained page per direction, rendered to desktop and phone PNGs, with a gallery at `rounds/r01-brainstorm/index.html`. |
| "Double down, get creative, five more variations of the same direction" | `rounds/rNN-<direction>/v1` … `v5`, each a new folder. Versions are never overwritten. |
| Every thread gets its own computer with Blender, FFmpeg, Playwright, checks its work with headless screenshots | Every thread renders with `concepts/tools/render.cjs` (headless Chrome for Testing, ANGLE Metal, 1440×900 and 390 phone, scroll stops, console errors) and must look at its own PNGs before reporting. FFmpeg, uv, node and self-hosted three.js are present. Bulk renders of external sites (inspiration scans) run on fsit2 through `design/tools/render-remote.sh` so the owner's Mac stays free; interaction captures (hover, click, drag, transition bursts, stack probe) through `design/tools/capture-remote.sh` with a steps file, results and teardown playbooks in `design/inspiration/teardowns/`. Blender is not installed yet; it is optional and would be driven the same way (as a Python module, no clicking). |
| A private preview page per iteration, reviewable on a phone between coffee stops | Laptop: `http://127.0.0.1:8766/design/rounds/…`. Phone, over the tailnet: `http://fsit2.taild9cbb5.ts.net:8780/design/rounds/…`, a mirror on fsit2 (system unit `ets27-preview.service` behind `tailscale serve` on port 8780 since 2026-10-16, was port 80, pushed by `design/tools/sync-preview.sh` after every round). The Mac's own tailnet address cannot be used: Little Snitch filters it inbound and the tailnet ACL only opens 22/80/443 (plus 8780 for this preview) towards fsit2. The two "ask the mind" prototype pages need the proxy on the laptop and stay laptop-only. |
| Code modular enough that threads work on parts of the room in parallel (each tape is its own file) | Concept mockups stay single files. From the first build round on, one file per section or module, so fixers and QA can touch one part without colliding. |
| Multiple QA threads drive the site round after round in a headless browser and write findings to the shared folder; the coordinating Claude works out which thread is at fault | `design/qa/<round>/findings.md`, written by adversarial agents who consider their job done only when they have broken something. The coordinator routes each finding to the thread that owns that module. |
| Hill climbing against targets (frame rate, draw calls) with pixel-by-pixel screenshot diffs from several angles | Targets per build round (frame time, draw calls, LCP, bundle size) plus a pixel-diff tool added when the build starts (`tools/pixeldiff.cjs`), so a performance gain is proven not to be a quality loss. |
| Opus 5.5 throughout, on the generic harness | Opus 5.5 and Fable 5.1 for Claude threads, GPT-6 Astra for Codex threads. Model-specific weekly caps rotate across the five Claude lanes automatically. |

## How the owner steers (the whole interface)

- Dump inspiration: paste links, images or words in chat, or drop files into `design/inspiration/`. A few words on what is liked about each item is worth more than a brief.
- "Explore" or "brainstorm": ten threads, little guidance, two directions each, rendered and gathered in a gallery.
- "Double down on X" or "five more of X": five variations of that direction in a new round.
- "Combine X with Y", "more like the second one but…", "less…": an iteration round on named versions.
- "Critique": jurors and QA threads score and list concrete fixes. "Fix": fixers apply them and re-render.
- Review on the laptop or the phone. Every version stays; nothing is overwritten, so any earlier one can be pointed at.
- Rick Rubin feedback is enough: "I like this", "no, make it less excited", "the second one, warmer".

## Rules every thread follows

1. Read `design/DECISIONS.md` first, then `concepts/BRIEF.md` for the facts and the anti-generic list, then the round's `ROUND.md`.
2. Self-contained pages, no build step, real ETS27 facts, ETS26 stand-ins labelled as sample data, never AI-generated faces, never the banned faces.
3. Render, then look at every PNG with your own eyes, then fix, then render again. A page nobody looked at is not done.
4. New version, new folder. Never overwrite a version the owner may have seen.
5. Headless only. Never `open`. Never kill a process you did not start. Scratch in the scratchpad, never in the project.
6. Write what you decided and why in the version's `concept.md`; write what you could not do in its `known_gaps` so the coordinator can route it.

## Folder map

```
design/
  README.md            this file: the method
  DECISIONS.md         the shared memory; every thread reads it first
  inspiration/         the owner's inspiration dump (+ INSPIRATION.md, the annotated list)
  rounds/
    r01-brainstorm/    ROUND.md (the ask) · <direction>/index.html + concept.md + shots/ · index.html (gallery)
    r02-<direction>/   v1..v5 variations of a liked direction
    …
  qa/<round>/          adversarial findings, routed by the coordinator
  tools/               studio.py (round galleries + the studio index); render.cjs stays in concepts/tools
```

Previous material (reference, not constraint): `concepts/` holds the overnight round of 2026-10-14 (17 Claude seeds + 3 Astra concepts, research under `concepts/research/`), and `prototype/` holds the working intelligent-UI prototype with the live Claude proxy.
