<table width="100%">
<tr>
<td align="center" width="33%"><img src="docs/images/horn-tip.jpg" width="100%" alt="Horn Tip"></td>
<td align="center" width="33%"><img src="docs/images/blindcap.gif" width="100%" alt="Blindcap: Duel"></td>
<td align="center" width="33%"><img src="docs/images/alice-sf-chess.jpg" width="100%" alt="2030 San Francisco Chess Set"></td>
</tr>
<tr>
<td align="center" width="33%"><img src="docs/images/trotter.gif" width="100%" alt="Trotter"></td>
<td align="center" width="33%"><img src="docs/images/ivy-solar-system.jpg" width="100%" alt="Solar system with engraved orbits"></td>
<td align="center" width="33%"><img src="docs/images/eve-f1-car.jpg" width="100%" alt="1:16 Formula 1 car"></td>
</tr>
</table>
# Autonomous Workshop
Create your own autonomous AI Inventor. Shape its Taste, give it direction, and let it dream up and develop original toys and games for people to buy.
Autonomous Workshop is the engine behind this vision: anyone can build a toy studio around their own Inventors. The creator shapes taste and direction. The Inventor researches, invents, and makes. Autonomous brings the toys to the [shop](https://www.autonomous.ai/toys), with physical production, shipping, and customer support owned by Operations.
**Our first category is toys and games. Our focus is autonomous Inventors that people create and direct.** Conversation is the main creative interface; individual toy briefs and CAD edits support that relationship.
[](docs/images/inventor-loop.svg)
## The creator experience
The planned [**Manage Inventors** page](https://github.com/autonomous-ai/autonomous-workshop/issues/16) gives each creator a collection of Inventors. Click **Add Inventor**, start a conversation about the toys you want to put into the world, and develop a recognizable creative point of view together. Each Inventor has one persistent workspace:
- **Chat:** give direction, explore ideas, discuss a particular toy, and hear about meaningful progress and customer feedback.
- **Taste:** an editable `TASTE.md` that captures what the Inventor loves, rejects, and aims to make unmistakably its own. Clear lasting preferences from conversation become visible, versioned updates with undo; a request about one toy stays with that toy.
- **Inventions:** the Inventor's toy library, including ideas, work in progress, released products, revision history, units sold, and buyer ratings with review counts. A new revision can be in development while an earlier revision remains on sale.
Creators can have multiple Inventors with different tastes. Each works within explicit operating limits and publishing permissions. Creators return to see what their Inventors have made, learn from the results, and shape their next direction.
## How we are opening the Workshop
1. **Be the first creators.** We create and operate the initial Inventors ourselves, testing the same tools and product journey we intend to offer others.
2. **Invite creators.** A small group establishes its own Inventors and toy studios, helping us prove that distinctive toys and dependable fulfillment can work beyond our own team.
3. **Open creation to everyone.** Anyone can create and direct Inventors; shared quality requirements and operating controls apply as the community grows.
Our initial Inventors seed the shop and exercise the system. The long-term platform brings together many creators, their autonomous Inventors, and people who want to buy their toys.
## What works today and what comes next
- **Available in the CLI:** `workshop create inventor --taste ./TASTE.md` creates a specialist bundle from your exact Taste and connects its publishing account. `workshop start <inventor>` repeatedly dreams, builds, and attempts publication until stopped or its failure limit is reached. `workshop daydream <inventor>` lets you inspect an idea before building it. See the [Quickstart](#quickstart) and [Build an Inventor](docs/BUILD_AN_INVENTOR.md).
- **Implemented production boundary:** Spark uses Workshop inventor selection → Make → Publish. Make owns its product checks; Workshop publishes its existing files without another CAD rebuild, review, PDF-generation step, or native Release turn. Forge and Quest retain their deeper stage contracts. Authenticated readback is required for publication; Operations owns physical production, hands-on checks, shipping, and customer support afterward.
- **Planned creator workspace:** the hosted Manage Inventors page, persistent creator chat, conversation-driven Taste revisions, and invention performance views described above.
- **Planned learning loop:** creator feedback and actual product outcomes inform future work. Today's notebook remembers previous ideas to avoid repetition; sales, playtests, and customer reviews do not yet flow back into it. Outcome feedback should improve an Inventor's judgment while preserving the creator's control over its Taste.
Internally, the sealed brief that begins one product run is still called a Wish. Existing Wish commands and frozen run contracts remain part of the engine; the consumer experience centers on creating and directing an Inventor.
## Correct a toy
Clone a toy archive into a separate Spark run using a correction brief:
```bash
uv run workshop fix toys/mara-masque-rainward-v01 \
--prompt-file docs/examples/rainward-sun-fix.txt
```
Use `--prompt "Describe the correction"` for a short brief. The command keeps the
original Inventor, creates a new Wish and editable copy, and runs Make and
publication with fresh evidence. The original run and listing stay unchanged.
The source must be a local Workshop archive with its `MANIFEST.json`, or the
private workspace of a run that has sealed its Release; URLs are not accepted.
`--model`, `--effort`, `--max-tokens` and `--turn-minutes` select the new run's
settings. Resume a stopped revision with `workshop resume <new-product-id>`.
### Correct one thing at a time, publish once
Add `--no-publish` to seal a corrected toy locally instead of listing it. Make
and Release run exactly as usual, but no Factory effect is created at all and
the toy directory records `unreleased` publication status. `workshop fix`
accepts that directory, so a chain of single-change corrections stays private
until the run you deliberately leave the flag off:
```bash
uv run workshop fix toys/ad-astra-antisol-v01 --prompt "…" --no-publish
uv run workshop fix toys/ad-astra-antisol-v01 --prompt "…" --no-publish # next pair
uv run workshop fix toys/ad-astra-antisol-v01 --prompt "…" # publish
```
The restriction is frozen when the run is created, so a later `workshop resume`
can neither add nor drop it. Each run still gets its own product id, workspace,
budget and effect ledger, and every unreleased directory is a full archive with
its own `MANIFEST.json`.
If you decide afterwards that a kept-local run should be listed after all,
publish that exact run instead of correcting it again:
```bash
uv run workshop publish <product-id>
```
It lists the bytes that run already sealed — no model runs, no tokens are spent
and no geometry changes — so what appears on Factory is what you reviewed
locally. A publication that does not complete leaves the run unreleased.
A chain of single-change corrections names each build with a revision suffix
(`v01`, `v02`, ...). To publish the conforming build under its clean name
instead of spending one more correction run, add `--title`:
```bash
uv run workshop publish <product-id> --title "Rainward Sun"
```
This re-seals only the host's own Release under the new title; Make's sealed
bytes are untouched, and the archive records the Make title beside the public
one. `--title` requires an Unreleased toy and is refused for a title with no
safe public slug.
The Rainward Sun prompt above is a prepared example. The correction path itself
is live-validated: Rainward Flow and Rainward Lowflow were published from the
Rainward Sun archive, each as an independent run. See [the correction-run contract](docs/adr/0065-published-toy-correction-runs.md).
## Quickstart
```bash
git clone https://github.com/autonomous-ai/autonomous-workshop.git
cd autonomous-workshop
codex login
uv run workshop doctor
```
When an Inventor is not yet connected, Workshop opens [Connect Inventor](https://www.autonomous.ai/toys/inventor/login) during `create` or `start`. Choose the Autonomous account that should publish this Inventor's toys, then approve the connection. Workshop continues in the terminal; if the browser does not open, follow the URL it prints.
Each Inventor has its own owner-only credential file under `$WORKSHOP_HOME/credentials/inventors/`. The browser returns only a short-lived, one-time authorization code; Workshop exchanges it directly with the Autonomous Toys API. Publishing credentials never enter a browser URL, product workspace, or coding-agent session. To choose a different account later, run `uv run workshop login <inventor-id>`.
One command runs the whole loop, and keeps running it. Pico Press daydreams one fresh idea that fits its Taste, the host rejects anything too close to a toy already made, the survivor is sealed as the brief, the run makes and publishes it (✨ Spark, `Make -> Release`, with Codex as the Workshop Manager; the idea is already the concept), and then Pico Press dreams the next one:
```bash
uv run workshop start pico-press
```
It runs until you stop it: Ctrl-C, or from another terminal:
```bash
uv run workshop stop pico-press # ends after the current step
uv run workshop stop pico-press --now # interrupts now; the current run stays resumable
```
Three consecutive failed daydreams or builds stop the loop on their own. `--once` dreams and builds a single idea; `--max-ideas N` stops after N. `--workflow` goes deeper: 🔥 Forge adds Invent (`Invent -> Make -> Release`), 🗺️ Quest adds Invent and Playtest:
```bash
uv run workshop start pico-press --workflow forge
```
Want to see an idea before building? `workshop daydream pico-press` prints the card and stops. Build a saved idea later with `workshop start pico-press --idea <daydream-id>`.
To make just one product from your own idea, use `wish`:
```bash
uv run workshop wish "A small hand-cranked cam toy" --inventor soren-voss \
--workflow spark --agent codex --model sol --effort high
```
Motion verification is optional for new runs. `workshop wish "a moving toy"`
skips motion checks and required animation review by default. Add
`--check-motion true` to enable them; `workshop start` and `workshop fix`
accept the same option. `workshop resume <product-id>` also defaults to false,
including older Wishes and runs that previously enabled motion. Pass
`--check-motion true` on resume to enable it again. Skipped motion is
unverified; build, print and still-image review checks remain in place.
`start <inventor>` is the ongoing Inventor-led loop; `wish "..."` creates one
product and stops. Omit `--inventor` on a Wish to let the Manager choose the
best match. `start <inventor> --once` dreams and builds one Inventor-generated
idea. `resume <product-id>` continues the same unfinished product and session.
For new Spark runs, Workshop selects the inventor before starting Make. An
explicit `--inventor` binds your choice immediately; otherwise the Manager
selects from the roster and continues into Make in the same native session.
Publish uses the existing Make files and optional existing README. It does not
require a newly authored manual. The lifecycle still calls this final host-owned
publication checkpoint `release`; omitted reviews are recorded as not run.
The new direct-publication path passes deterministic end-to-end tests; live
acceptance is still in progress.
`start <inventor> --wish "..."` builds your own brief as that Inventor without
a daydream: the Inventor id is sealed into the Wish, so the run materializes
only that Inventor, Match can bind nobody else, and Release publishes with
that Inventor's account. `--ref` attaches up to eight reference images (PNG,
JPEG, or WebP) to a `wish` or a `start --wish`, each a local file or an
`http(s)` link that is downloaded once at Wish time and sealed by its bytes;
`--max-rounds` sets the legacy Invent-Make round budget (not a spending limit
for token-budgeted products):
```bash
uv run workshop start ferro-line --workflow forge --max-rounds 6 \
--ref duck.webp --ref https://example.com/duck-side.png \
--wish "a wind-up robot duck that walks when you turn its key"
```
`--agent` chooses the Workshop Manager runtime; `--model` and `--effort` choose its model and reasoning level. Those choices apply to both the daydream and product run and are frozen for resume. Codex defaults to Astra at medium effort; Claude Code defaults to Opus 5 at medium effort. Friendly Codex aliases such as `astra` and `sol` resolve to exact model ids. Grok's first ✨ Spark run, from a typed brief, produced [Horn Tip](toys/pico-press-horn-tip/):
```bash
grok login
uv run workshop start pico-press --agent grok --workflow spark
# Or run Codex Astra at high reasoning effort:
uv run workshop start pico-press --agent codex --model astra --effort high
```
Every run prints a run ID (a Wish ID). Check on it or continue the same session:
```bash
uv run workshop status <product-id>
uv run workshop resume <product-id>
```
Codex Astra also supports `--effort ultra`, passed unchanged to native Codex.
Ultra is restricted to Astra; other models retain their existing effort levels.
`start` and `wish` accept `--max-tokens N` up to **200,000,000**, default **30,000,000** per Codex
product. Input plus output is counted across all enabled build steps, native
children, retries, and resumes. Cached input counts and is reported separately;
reasoning output is already part of output. `start` gives each product its own
allowance; the separate Daydream session is outside this build budget.
```bash
uv run workshop wish "A simple one-piece gravity desk rocker" --inventor soren-voss \
--workflow spark --agent codex --model astra --effort medium --max-tokens 10000000
uv run workshop resume <product-id> --max-tokens 15000000 # total cap, not extra tokens
```
`wish`, `start` and `resume` also accept `--turn-minutes M`, which bounds each
native turn to `M` minutes (1 to 360), or `--turn-minutes none` to run with no
Workshop wall clock at all. It replaces every frozen stage default and every
host-side clamp, including a budgeted run's remaining step clock. Omitting it
keeps the run's frozen boundary exactly, so nothing changes for a run that does
not ask. On `resume` it re-selects the boundary of an unfinished run without
touching its stage, artifacts or history — the way to rescue a run that keeps
timing out instead of restarting it. An untimed run still needs the Manager's
own bound, which today means a Codex token budget: Codex refuses to run untimed
without one, while Claude Code and Grok Build have no token budget and an
untimed turn there is bounded by nothing Workshop owns. See ADR 0064.
Omitting `--max-tokens` on resume preserves the saved allowance. Providing it
explicitly adopts token budgeting for an eligible older run or changes its
total cap, retaining recovered prior usage. Token-budgeted runs no longer split
on a wall-clock timer. Tokens are their only Workshop execution budget: no host
turn, proposal-retry, or lifecycle-round cap. Make retains its own engineering
checks and review allowance (four reviews in current tools). Safety boundaries remain. Native
usage is observed after requests, so in-flight work can overshoot the threshold.
Missing usage is not free work. This is not a dollar cap. The local usage adapter
currently requires Codex 0.153.4; other Managers retain their existing policy.
Live acceptance passed for [Quiet Arc](https://www.autonomous.ai/toys/product/quiet-arc):
Spark / Codex / Astra / medium / Soren, including same-session recovery and
verified publication, used 6,893,962 observed tokens of the 10M allowance.
On 2026-09-10, [Civic Skyline](https://www.autonomous.ai/toys/product/civic-skyline)
completed live Spark host-only publication under Dee with 32,678,604 observed
tokens of its unchanged 200M cap. Recovery repaired Factory's carrier-root
selection through a new version of the same private draft; it reused Make's
files without another Make run, native Release turn, PDF, or CAD verification.
This frozen run retained its earlier inventor selection; the new selection-before-Make
boundary is separately covered by deterministic tests. These results prove
digital publication, not physical manufacture or every live parameter combination.
Long turns remain attached to the same session if the locally installed Codex
CLI receives a supported in-place update. Workshop still rejects downgrades,
major-version changes, and same-version policy drift.
Timeouts and exact recognized provider disconnects resume that same session;
unknown failed turns still stop safely for an explicit operator resume. A
terminal failure reports and privately records a bounded cause category,
recognized signature, safe provider code, and message size without retaining
the provider's free-form error text.
## Workshop Managers
One run is one native coding-agent session — the shop lead. Resume cannot switch Managers.
```bash
uv run workshop start pico-press --agent codex # Sol + medium; default
uv run workshop start pico-press --agent claude # Opus 5 + medium; experimental
uv run workshop start pico-press --agent grok # experimental
```
| Manager | CLI | Status |
|---|---|---|
| [Codex](https://learn.chatgpt.com/docs/codex/cli) | `codex` | Default. Omit `--agent`. |
| [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | `claude` | Experimental. |
| [Grok Build](https://docs.x.ai/build/overview) | `grok` | Experimental. Spark E2E: [Horn Tip](toys/pico-press-horn-tip/), [Knockseed](toys/pico-press-knockseed/). |
## Inventors
Each Inventor expresses a specialist point of view. Several can make the same kind of toy in their own way. The bundled Inventors are our first studios and public examples; creators can already add their own through the CLI. The hosted creation and management experience is planned.
An Inventor is a declared specialist bundle: `TASTE.md` for creative judgment, `inventor.json` for identity and skill hashes, and a required `<id>-inventor` skill. Optional extra Inventor-prefixed skills may hold scripts, references, or tested deterministic tools. For a run, `.codex/agents/*.toml` is the sole roster. Inventor code cannot launch agents, choose stages, pass gates, or perform authenticated effects.
```bash
uv run workshop create inventor \
--taste ./TASTE.md
```
The file must be named `TASTE.md`. Workshop preserves its exact bytes, derives the Inventor id from the frontmatter name, creates the required specialist skill, and validates the bundle.
```markdown
---
name: Ada
description: Choose Ada for hand-cranked creatures; not static models or games.
---
# Ada's taste
I love mechanisms whose motion tells the story. I reject decoration without play.
```
Read [Build an Inventor](docs/BUILD_AN_INVENTOR.md) for the specialist contract.
### Alice — reinvent the classics ([TASTE.md](inventors/alice/TASTE.md))
Chess, go, dominoes, puzzles — games everyone already knows, made into a set that is yours. Alice never touches the rules. She changes what the pieces are, so the set is about you.

*2030 San Francisco Chess Set*
### Leo — invent games that don't exist yet ([TASTE.md](inventors/leo/TASTE.md))
Brand new games, invented for one wish: new rules, new pieces, a new reason to sit at a table. Quest effort exercises those rules with seeded Playtest evidence; Spark and Forge truthfully release without claiming that testing occurred.
https://github.com/user-attachments/assets/36ffa63e-6e36-4422-8db7-bb1545b3bdb7
*[Blindcap: Duel](https://www.autonomous.ai/toys/product/blindcap-duel)
— a two-player hidden-information strategy game of mushrooms, probes, and crowns*
### Bob — invent machines that move ([TASTE.md](inventors/bob/TASTE.md))
Things that do one delightful thing when you wind them up, let them go, or drop something in. No motors, no batteries, no electronics — the movement has to come out of the shape itself.
https://github.com/user-attachments/assets/ba57de75-37e2-45e8-a71f-2a339b0de49a
*[Trotter](https://www.autonomous.ai/toys/product/spot-quadruped-robot-wind-up-walker)
— a palm-size, rubber-band-powered quadruped*
### Ivy — invent science toys you can hold ([TASTE.md](inventors/ivy/TASTE.md))
The planets, a swinging pendulum, a shape that looks impossible — real science, small enough to pick up. Ivy says where her numbers came from and what she left out, because here being wrong is worse than being boring.

*A solar system with its orbits engraved — $59.99*
### Eve — invent little worlds ([TASTE.md](inventors/eve/TASTE.md))
Your dog, your bike, your desk, your homelab — turned into a small world you can put on a shelf. Eve's only counts if it could not have existed before your wish.

*A 1:16 Formula 1 car*
### Sonora Reed — sculpt sound from geometry ([TASTE.md](inventors/sonora-reed/TASTE.md))
Passive acoustic toys whose playable voices come from visible printed ridges,
chambers, tracks, and resonant bodies—never electronics or decorative claims.
### Vela Bloom — make small shapes transform ([TASTE.md](inventors/vela-bloom/TASTE.md))
Compact rigid-link toys that deploy, iris, unfurl, or blossom through one
legible, collision-aware transformation with deliberate end states.
### Kestrel Knot — make continuity feel impossible ([TASTE.md](inventors/kestrel-knot/TASTE.md))
Topology-driven captive-motion toys built from open loops, crossings, braids,
and continuous routes whose geometry and clearances can be checked exactly.
### Orin Shadow — make geometry tell a second story ([TASTE.md](inventors/orin-shadow/TASTE.md))
Mechanical shadow-play toys whose held form casts a hidden creature, place, or
event under ordinary light. Orin authors the solid object, its negative space,
and its hand-powered projected transformation as one printable mechanism.
### Halden Detent — make the hand something worth repeating ([TASTE.md](inventors/halden-detent/TASTE.md))
Fidget instruments for a working desk: one weighted, quiet, endlessly repeatable
loop — a detent click, a glide, a rocking mass — that a hand runs without looking
while the eyes stay on the work, and that sits still and deliberate beside a
laptop once it is put down.
### Axel Rake — design the vehicle that comes next ([TASTE.md](inventors/axel-rake/TASTE.md))
Original present-day and future cars and motorcycles, designed package-first —
wheelbase, rider or occupant, and battery or engine placed before any surface —
then built as rolling, part-split printable scale models on one family scale,
with every speculative future technology labelled in a ledger.
## Toys
Toys that already left the Workshop. After Factory publication, a sanitized snapshot lands in [`toys/<inventor>-<slug>/`](toys/). These are public examples, not private run workspaces.

| Toy | Inventor | Effort | Snapshot | Factory |
|---|---|---|---|---|
| RIDGELINE — Great Wall Path Puzzle | [Arden Span](inventors/arden-span/) | Operator revision | [`toys/arden-span-ridgeline-great-wall-path-puzzle/`](toys/arden-span-ridgeline-great-wall-path-puzzle/) | [ridgeline-great-wall-path-puzzle](https://www.autonomous.ai/toys/product/ridgeline-great-wall-path-puzzle) |
| QUAYSHIFT | [Arden Span](inventors/arden-span/) | ✨ Spark | [`toys/arden-span-quayshift/`](toys/arden-span-quayshift/) | [quayshift](https://www.autonomous.ai/toys/product/quayshift) |
| Moonwake Turn | [Luma Vale](inventors/luma-vale/) | Spark | [`toys/luma-vale-moonwake-turn/`](toys/luma-vale-moonwake-turn/) | [moonwake-turn](https://www.autonomous.ai/toys/product/moonwake-turn) |
| Mooncoil Dragon | [Pico Press](inventors/pico-press/) | Spark | [`toys/pico-press-mooncoil-dragon/`](toys/pico-press-mooncoil-dragon/) | [mooncoil-dragon](https://www.autonomous.ai/toys/product/mooncoil-dragon) |
| Pocket Eclipse Menagerie | [Orin Shadow](inventors/orin-shadow/) | Spark | [`toys/orin-shadow-pocket-eclipse-menagerie/`](toys/orin-shadow-pocket-eclipse-menagerie/) | [pocket-eclipse-menagerie](https://www.autonomous.ai/toys/product/pocket-eclipse-menagerie) |
| Starling Gate | [Pico Press](inventors/pico-press/) | Spark | [`toys/pico-press-starling-gate/`](toys/pico-press-starling-gate/) | [starling-gate](https://www.autonomous.ai/toys/product/starling-gate) |
| Moonchase Fox | [Pico Press](inventors/pico-press/) | Spark | [`toys/pico-press-moonchase-fox/`](toys/pico-press-moonchase-fox/) | [moonchase-fox](https://www.autonomous.ai/toys/product/moonchase-fox) |
| Storm Reveal | [Mira Fold](inventors/mira-fold/) | ✨ Spark | [`toys/mira-fold-storm-reveal/`](toys/mira-fold-storm-reveal/) | [storm-reveal](https://www.autonomous.ai/toys/product/storm-reveal) |
| Saigon Skyline Chess | [Alice](inventors/alice/) | ✨ Spark | [`toys/alice-saigon-skyline-chess/`](toys/alice-saigon-skyline-chess/) | [saigon-skyline-chess](https://www.autonomous.ai/toys/product/saigon-skyline-chess) |
| Rainspell Dial | [Sonora Reed](inventors/sonora-reed/) | 🔥 Forge | [`toys/sonora-reed-rainspell-dial-three-field-sound-garden/`](toys/sonora-reed-rainspell-dial-three-field-sound-garden/) | [rainspell-dial-three-field-sound-garden](https://www.autonomous.ai/toys/product/rainspell-dial-three-field-sound-garden) |
| Eclipse Braid | [Kestrel Knot](inventors/kestrel-knot/) | ✨ Spark | [`toys/kestrel-knot-eclipse-braid/`](toys/kestrel-knot-eclipse-braid/) | [eclipse-braid](https://www.autonomous.ai/toys/product/eclipse-braid) |
| Moonwake Garden | [Luma Vale](inventors/luma-vale/) | 🗺️ Quest | [`toys/luma-vale-moonwake-garden/`](toys/luma-vale-moonwake-garden/) | [moonwake-garden](https://www.autonomous.ai/toys/product/moonwake-garden) |
| Knockseed | [Pico Press](inventors/pico-press/) | ✨ Spark | [`toys/pico-press-knockseed/`](toys/pico-press-knockseed/) | [knockseed](https://www.autonomous.ai/toys/product/knockseed) |
| Horn Tip | [Pico Press](inventors/pico-press/) | ✨ Spark | [`toys/pico-press-horn-tip/`](toys/pico-press-horn-tip/) | [horn-tip](https://www.autonomous.ai/toys/product/horn-tip) |
| Quiet Arc | [Soren Voss](inventors/soren-voss/) | ✨ Spark | [`toys/soren-voss-quiet-arc/`](toys/soren-voss-quiet-arc/) | [quiet-arc](https://www.autonomous.ai/toys/product/quiet-arc) |
| Lunar Relay | [Bob](inventors/bob/) | ✨ Spark | [`toys/bob-lunar-relay/`](toys/bob-lunar-relay/) | [lunar-relay](https://www.autonomous.ai/toys/product/lunar-relay) |
| Orbit Gobbler | [Bob](inventors/bob/) | 🔥 Forge | [`toys/bob-orbit-gobbler/`](toys/bob-orbit-gobbler/) | [orbit-gobbler](https://www.autonomous.ai/toys/product/orbit-gobbler) |
| Comet Heist | [Leo](inventors/leo/) | 🗺️ Quest | [`toys/leo-comet-heist-twin-pulse-vault-run/`](toys/leo-comet-heist-twin-pulse-vault-run/) | [comet-heist-twin-pulse-vault-run](https://www.autonomous.ai/toys/product/comet-heist-twin-pulse-vault-run) |
| Cradle Crescent | [Bob](inventors/bob/) | — | [`toys/bob-cradle-crescent/`](toys/bob-cradle-crescent/) | [cradle-crescent](https://www.autonomous.ai/toys/product/cradle-crescent) |
| False Lantern | [Leo](inventors/leo/) | — | [`toys/leo-false-lantern/`](toys/leo-false-lantern/) | [false-lantern](https://www.autonomous.ai/toys/product/false-lantern) |
Horn Tip and Knockseed are Spark runs on Grok. A later run with the same brief is the same route, not a replay of those CAD bytes. Cradle Crescent and False Lantern are older snapshots.
Private runs live outside Git at `$WORKSHOP_HOME/runs/<product-id>/workspace`. New
toy READMEs report best-effort gross, cached, and uncached Manager input plus
output and reasoning-output tokens by stage, alongside elapsed time from run
intake through authenticated Factory public readback. This is telemetry, never
a gate, and no dollar estimate is inferred. See
[`toys/README.md`](toys/) for what a snapshot includes and
[`docs/QUALITY_ECONOMICS.md`](docs/QUALITY_ECONOMICS.md) for the paired quality
and cost benchmark.
Forge and Quest now make the cheapest exact mechanism/form falsifier the first
persisted Make deliverable under `<cad-project>/review/early-proof/`, before the
complete part tree. Native Make iteration uses source-fresh print-preflight
without destructive cache cleanup; the trusted isolated host alone performs
the authoritative fresh rebuild before Made can advance. The v9 proof uses one
shared helper and three exact state entries that each expose one module-scope
`gen_step()`, and the host supplies exact
`$WORKSHOP_PYTHON`-prefixed generate, export, and render commands so Make does
not spend its bounded proof phase rediscovering package entrypoints. New deep
runs bind a private run-local cache, defer the broad CAD skill until final
Make, batch all mandatory proof reads, author source as the next durable action,
and execute proof commands as one foreground batch. A fixed-camera
`--state-sheet` renders the three exact state STLs and rejects visually
indistinguishable frames; rotating one unchanged mesh is only viewpoint
evidence. The root performs the cheap early direction check; the independent
blind critic remains at the final hash-bound Make review.
## Architecture
The floorplan of the shop. An Inventor's idea walks one frozen route; Operations takes the sealed Release and the shop sells it.
[](docs/images/workshop-floorplan.svg)
```text
Daydream -> one liked idea -> a frozen effort route:
✨ Spark: Make -> Release (default)
🔥 Forge: Invent <-> Make -> Release
🗺️ Quest: Invent <-> Make <-> Playtest -> Release
Release -> Shop (order one, printed to order, photographed, ships in days)
Shop -> Scoreboard (views, orders, prints, returns) -> back to Daydream
```
Route diagrams: [Spark](docs/images/effort-spark.svg) · [Forge](docs/images/effort-forge.svg) · [Quest](docs/images/effort-quest.svg).
Every run is keyed by a product id. Passed-through stages create no turn, artifact, gate, or evidence; Spark and Forge record Playtest as `not-run`. The reverse arrows are evidence-bound repair routes recorded in shared revision history; token-budget runs spend the persistent token allowance instead of a host revision-count allowance.
**Who does what.** The selected [Workshop Manager](#workshop-managers) does the product work in one persistent native session, one Goal at a time. Creative stages use native Goals and run-local finalizers; Workshop inventor setup and Spark's host-only Publish are not additional Goals. The Python host is narrow and trusted: identity, exact bytes, lifecycle order, budgets, session start and resume, deterministic gates, credential isolation, and authorized effects. There is no second agent framework, prompt chain, or reward loop.
**Two sessions, by design.** `workshop start` is a loop: dream, build, dream again. A daydream is its own short native session. It ends when the idea is sealed: linted, hashed, written to the Inventor's notebook, and rendered as the brief. Each liked idea then gets its own persistent build session, one per run, exactly as a typed brief would. The idea is an immutable input to the build, so Make can never quietly rewrite what it is building; daydreams can run on their own cadence; a saved idea can be built later, on any route or Manager, or rebuilt after a failed Make; and a build failure never touches the idea.
**What Make must prove.** Every printable part passes a fixed print preflight (bed fit, mesh validity, wall thickness at a 0.4 mm nozzle). Make records native visual feedback and an independent critic reviews exact renders blind before the brief is revealed; current Make permits up to four reviews. Make then runs its integrated verifier. Spark accepts those output bytes without another host rebuild; Forge/Quest retain isolated host verification. When a stage is truly blocked, it records a `Need:` that the receipt and `workshop status` show; nothing waits silently.
**What Release means.** Spark publishes Make's existing files with exact metadata-anchor readback and requires no new PDF or review. Forge/Quest's PDF-first Release contracts retain three facts about the same exact bytes:
- full-tier, thickness-checked, ready-to-print CAD
- a self-contained printable `MANUAL.pdf` for the box
- authenticated public Factory readback of those CAD and manual hashes
For those PDF-first contracts, a multi-part toy crosses to the shop as one mesh per sealed occurrence in the colours Make sealed. The host can render the sealed assembly with a pinned three.js renderer (`tools/render/`, optional; see `workshop doctor`). Spark instead transports Make's complete existing tree without new renders. The build session stays private; no transcript ships with the listing.
Workshop code ends there. Printing, delivery, and Review belong to Operations. Publication does not claim a physical print, pack, or delivery.
```text
inventors/ reusable Inventor sources (Taste, skills, tools)
toys/ sanitized public snapshots after Factory readback
.agents/product-run complete template copied into every new toy project
src/cli/ command parsing, presentation, exit codes
src/workshop/ trusted host: daydream, stages, workflow, runtime, gates, effects
tests/ component-mirrored deterministic suite
docs/ architecture, ADRs, and contributor guides
```
Private state stays outside the agent-visible checkout: `$WORKSHOP_HOME/daydreams/<inventor>/`, `$WORKSHOP_HOME/runs/<product-id>/workspace`, and `$WORKSHOP_HOME/state/<product-id>/`. Factory credentials live in `$WORKSHOP_HOME/credentials/inventors/<inventor-id>.env` (0600 inside a 0700 directory) and never enter the native agent's session.
Turn budgets, compaction ceilings, recovery windows, and the blind-review protocol are specified in [Native coding-agent runtime](docs/NATIVE_AGENT_RUNTIME.md). See also [Workshop architecture](docs/ARCHITECTURE.md), the [publication boundary](docs/PUBLISH_SEALED_PRODUCT.md), and [Playtest evidence](docs/PLAYTEST_EVIDENCE.md).
## Contributing
This is the shop floor for Workshop code and Inventor sources. To change the CLI, runtime, workflow, or product-run protocol, follow [CONTRIBUTING.md](.github/CONTRIBUTING.md). To add a specialist, start from [Build an Inventor](docs/BUILD_AN_INVENTOR.md).
```bash
uv run workshop doctor
PYTHONPATH=src python -m unittest discover -s tests -t . -p 'test_*.py'
```
Never commit credentials, runtime databases, private keys, generated backups, or someone else's source without written permission and a record of where it came from.
Licensed under [Apache-2.0](LICENSE).