This page defines the Startup Studio board, its default technology stack, every command the tool accepts, and the terms used across the site and the repository. It is for anyone running Startup Studio, contributing to it, or checking the precise meaning of a term.
Every Project uses the same board as its only work queue. It has eight columns, one for each status key, and two further statuses that leave the board rather than sitting in a column. I keep the structure fixed because the agents use these exact names and keys. If they change, the team no longer matches the board.
The cards below are made up, to show the shape.
Agents move a ticket through all eight columns but one. That move is yours and no agent can make it: accepting the work, which moves the ticket out of UAT and into UAT Complete. Until you make it, nothing goes any further.
Eight columns: swipe to see them all
Backlogbacklog
Agents
To Dotodo
Agents
In Progressin_progress
Agents (1 large max)
UATuat
Agents (QA alone)
UAT Completeuat_complete
You accept
PROD Readyprod_ready
Agents
PROD Deployedprod_deployed
Agents
Donedone
Agents
| Column | Status key | Meaning | Who moves it |
|---|---|---|---|
| Backlog | backlog | An idea that has not been scheduled. Work may be created here. | Agents |
| To Do | todo | Work that is ready to start, and the only status the team picks new work from. Work may also be created here. | Agents |
| In Progress | in_progress | The team has played back its plan and the work is under way. | Agents |
| UAT | uat | QA has reviewed the work, written test notes a person can follow, and passed it to you for acceptance testing. | Agents (QA alone) |
| UAT Complete | uat_complete | You have tested the work and accepted it. It waits in its own column until an agent advances it. | You |
| PROD Ready | prod_ready | Accepted and waiting to go out. | Agents |
| PROD Deployed | prod_deployed | Deployed on your explicit instruction, with the build reference recorded on the ticket. | Agents (you are blocked) |
| Done | done | Live in production. A merge, or a deployment to a test environment, does not qualify. | Agents |
| no column | parked | Started and deliberately stopped, with the reason recorded. It leaves the board without being finished. | Agents |
| no column | killed | Decided against, with the reason recorded. Nothing that was started is left without an ending. | Agents |
Two columns are the acceptance pair. uat means the work is waiting for you to test it. uat_complete means you have accepted it, and the move between them is the one move on the board that is yours.
The owner shown under each column is whoever makes the move INTO it, which is the same question the table above answers. Agents make every one of those except one: moving a ticket from uat to uat_complete belongs to you. Only QA may move a ticket into UAT, and only with test notes a person can follow. The agent that built the work cannot certify it.
An agent may set prod_deployed only after you have instructed the deployment, and the build reference goes in the note on that move. Where a project has built the visual version, its interface blocks a person from selecting that status and keeps the release reference read-only.
Tickets are created only in Backlog or To Do. That one is a convention rather than a lock, and it stops work appearing part way along the board without passing through the queue.
Everything starts as a ticket
Every request becomes a ticket before work starts and before the team replies, and the product manager confirms the number in one line. Requirements, decisions, assumptions, test notes and delivery history all stay on it, so the ticket is the record.
I use this stack for a Project unless there is a stated reason to deviate. It is the stack already proven on the most complete Project run this way, and it gives a reviewer one consistent answer to how access is enforced.
| Layer | Default | Reason |
|---|---|---|
| Framework | Next.js, TypeScript, Tailwind | The team's strongest surface. Using React across Projects keeps one component idiom. |
| Data and auth | Supabase Postgres | Relational data with row level security, plus authentication and file storage. Access is enforced in the database, and one vendor holds the whole answer. |
| Source control | GitHub | Free for private repositories, and the host can build directly from it. Do not rely on that alone: the git connection here stopped firing while the dashboard still reported it connected, so a push produced no build and nothing said so. Releases now trigger the build explicitly. Actions minutes are the free tier limit that binds first, and they are pooled across the account. |
| Hosting | Cloudflare Pages | The free tier covers a validation build, and it issues its own certificate in minutes. |
| DNS | Cloudflare | Keeping DNS and hosting with one provider removes a class of certificate failure. I waited more than 47 hours for a certificate that never issued across a provider boundary that did not need to exist. |
| Analytics | GA4 | Free, and the team already understands the funnel work. |
Every layer has a free tier that covers a validation build, and none charges for idle capacity. That matters because a Project that fails validation should not keep producing a bill simply because it still exists.
Free tiers are not unlimited
Their limits are usually shared across an account, so one Project can exhaust capacity another one needs. A database was planned, agreed and half scripted before the dashboard refused to create it: the plan allowed two, and both were already in use by other products. Nothing was misconfigured. Capacity has to be checked across every Project, not only the one being built.
Access is enforced in the database, so a permission cannot be bypassed by calling the data API directly. A Project may deviate from the default stack where the stated conditions justify it, and the deviation is recorded with an owner and a review date.
The nineteen defined terms used by Startup Studio. Each has its own address, so another page can link straight to the one you need.
Every switch studio.ps1 accepts, when you would reach for it, and what it writes. You run these in the studio, the one place that owns the shared roles and the skills. They act on your projects, which use those roles to build products of their own. The two exceptions are the hooks, which run on their own and say so in their rows. The recommended order of operations is on the how to run it page, and the switches that modify another command are listed last.
| Command | When to use it | What it writes |
|---|---|---|
-Status | Use this before you change anything, to see the state of every project. It reports the roster, any drift and which direction it went, shared governance, state documents, whether the roles load, what each project costs to open, reality readings and open deviations. This is also what runs when you give no switch at all. | Read-only. No file is created, modified or deleted. |
-Doctor | Use this when you want the fix as well as the finding. It prints everything -Status prints, and adds the exact command that repairs each finding. | Read-only. No file is created, modified or deleted. |
-Sync | Use this after you change a shared role, a fragment or a skill in the studio, so that every project receives the change. | Overwrites the seventeen role files in the machine-wide agents directory (%USERPROFILE%\.claude\agents) and the skills directory beside it. Writes the three shared governance files into each project that already holds at least one of them. Rebuilds the agents directory in every tuned project. A file that was edited where it was installed is reported and skipped rather than overwritten. |
-Sync -Force | Use this when -Sync reports that a file was edited where it was installed, and you have decided the studio's version should win. | The same writes, and it overwrites the files -Sync skips. Each governance file is copied into .archive\ before it is replaced. |
-Global | Use this to refresh the machine-wide roster and skills without touching any project. | Overwrites the machine-wide agents and skills directories. No project directory is touched. |
-Tune -Project X | Use this the first time a project needs to differ from the base. It writes a template for you to fill in: what the project is built with, where authorisation lives, and any shared rule it waives. | Creates the overlay directory and writes one template file into it (my-app\.claude\agent-overlays\_project.md). An existing file of that name is left as it is. |
-Compose -Project X | Use this after you edit one project's stack card or one of its role overlays. | Rewrites that project's agents directory (my-app\.claude\agents), one file per role, and writes a manifest recording what each was built from. Deletes any role file the base no longer defines. No other file in the project is touched. Refused for the studio itself, which owns the base rather than consuming it. |
-Compose -All | Use this when more than one project has a layer and you want all of them rebuilt. | The same writes, once per project that holds an overlay directory. |
-Governance | Use this when a shared governance document has changed and the projects need the new copy. | Writes GLOBAL_WAYS_OF_WORKING.md, AGENTS.md and BRIDGE_PROTOCOL.md into each project that already holds at least one of them. Creates nothing in a project that holds none. |
-Connect | Use this once for each project, so that a session opened there is told where its roster comes from and what must never be hand-edited. Without -Project it targets every project and every directory a session has been opened in. | Creates CLAUDE.md if the project has none. Otherwise edits the existing file, replacing only the text between the STUDIO:BEGIN and STUDIO:END markers and leaving the rest of it unchanged. |
-Publish | Use this to update the public copy without making a release. Rarely needed on its own, because -Release does this as its second half. | Deletes and rebuilds the staging directory .public\ from the publish manifest, then pushes that content to the public repository. Nothing is pushed if the scan finds anything. |
-Release | Use this when you have changed the studio itself: a shared role, a skill, the method or the website. Do not use it to deploy a project's product, because a project ships its product with its own tools. The note comes from the newest dated entry in CHANGELOG.md, so that entry is written before the release. | Commits and pushes the studio's private repository, rebuilds .public\ and pushes it to the public repository, then calls the deploy hook that rebuilds the website. Refused when CHANGELOG.md carries no dated section. Assumes the two-repository layout: with no public repository configured it commits and pushes the private one, then stops with an error. |
-Update | Use this when you are running a studio that somebody else publishes and you want their newer version. Read 4.1 below before you run it. | Fast-forwards this studio from its remote, then overwrites the machine-wide agents and skills directories and every project's agents directory from what arrived. |
-Autoload -Path X | You do not run this. It runs when a session starts, and it rebuilds that project's roster only if the base has moved since the last build. | Rewrites that project's agents directory only when the base has moved since it was last built. Appends one line to .studio-hooks.log. |
-Recall | You do not run this. It runs when a session's context is compacted, and it restates the standing rules from base\governance\SESSION_RECALL.md. | Appends one line to .studio-hooks.log. No other file is touched. |
-WhatIf | Add this to any command that writes, to see what it would do before it does it. | Read-only. Each writer prints what it would have written. |
-DryRun | Add this to -Publish to stage the export and run the scan without pushing anything. | Rebuilds .public\ and stops. Nothing is pushed. |
-Force | Add this to -Sync. See -Sync -Force above. | See -Sync -Force. |
-All | Add this to -Compose. See -Compose -All above. | See -Compose -All. |
One limitation, stated plainly. The roster is installed into the directories Claude Code reads, and the two hooks are registered the way Claude Code registers hooks. The method itself is not tied to any one coding agent, but this tool is, and support for other agents is not built yet.
A second limitation, about when the Gates above actually run. They run before a release, not on every ticket. A ticket can reach done inside a batch of work that one review covers, and the release is the point where a review is required and refused for its absence. That is a deliberate trade, because a gate on every ticket was ignored in practice and a gate nobody runs is worse than one whose timing is written down. What the release refuses on is narrow and worth knowing: it refuses when no reviewer was started at all in the session shipping the work. It cannot tell whether the reviewer read the change, and it cannot tell whether the reviewer came back clean.
Use -Release when you are shipping a change you made to the studio. Use -Update when you want a newer version of a studio that somebody else publishes. The two sit one letter apart in a shell history and they move work in opposite directions.
studio.ps1 -Release # your work goes OUT studio.ps1 -Update # upstream work comes IN
Running the wrong one
Typing -Update when you meant -Release rebuilds every project on the machine from the upstream roster and publishes nothing. Anything you had committed is still in your repository, so the recovery is to run -Sync, but until you do, your projects are briefed by the upstream version rather than by yours. Preview either command with -WhatIf when you are not sure which one you want.
You have improved a role and want every project to receive it. This is the common case, and the reason the studio exists.
# 1. change the shared role edit base\agents\qa-tester.md # 2. send it to every project studio.ps1 -Sync # 3. confirm nothing drifted studio.ps1 -Doctor
Every tuned project now carries the new wording. A project with no layer of its own receives it from the machine-wide install instead.
You want one project to behave differently, without changing the base.
# 1. write what is true of this project only edit my-app\.claude\agent-overlays\qa-tester.md # 2. rebuild that project's roster studio.ps1 -Compose -Project "my-app"
Only that project changes. The base roster and every other project are untouched.
You have changed the studio itself and want to publish your own version. A shared role, a skill, the method or the website. This does not deploy a project's product.
# 1. improve the shared role edit base\agents\qa-tester.md # 2. write a dated entry saying what changed edit CHANGELOG.md # 3. preview it, then ship it studio.ps1 -Release -WhatIf studio.ps1 -Release
The command reads that entry, commits and pushes the studio's private repository, publishes the public copy from the same entry, and rebuilds the website. Both repositories carry the same note.
Publishing used to be two separate commands. A change was committed to the private repository and never published to the public one, and nothing compared the two, so the public copy stayed behind for weeks. One dated entry now drives both.