Where each contract lives in the code, the formats you can rely on, how releases reach you, and what is being built next.
There is no workflow schema to validate against. The contracts are code and plugin data, each in one place.
| CONTRACT | WHERE |
|---|---|
| Stage carry lists | ide/engine/rules-prompts/stageprompts.js: the sections a card must carry out of Prepare, Doing, Review, Deliver and Verify, rendered under "Sections this card must carry". |
| The shipped workflow | The grid-sdlc-default plugin: its sdlc.workflow rows and card.section chips, and the one gate it registers, before:review. |
| Transitions | Hooks named before:<stage>, after:<stage> and on:attention, answering pass, block or amend. See the pipeline. |
| Plugin manifest | grid-plugin.json: id, name, version, apiVersion, publisher, permissions, hooks, points, activation, configuration, main. Sixteen contribution points. See manifest. |
| CLI envelope | {ok, command, data} on success, {ok, command, error: {code, message, fix, detail}} on failure. See the command line. |
| Update feed | One row per channel, platform, arch and version, served under /api/v1/update/ as latest-mac.yml on macOS, latest-linux.yml on Linux and the suffixless latest.yml on Windows. Those are the names electron-updater asks for. |
| Command map | grid.toml, below. |
Each project has one command map, and it is the only thing Grid Console runs from. Grid owns it and keeps it in its own state directory, under projects/<project>/grid.toml; a grid.toml inside a repository is not read. The first time a project is asked for its roster, Grid reads what the Makefile already declares and seeds the file once. After that the file is the truth.
| TABLE | KEYS |
|---|---|
[project] |
verify, the command that proves a card is done at Verify. hosts, a comma-separated list of hostnames; accepted and validated, and read by nothing. |
[repo.<name>] |
runner (make or shell), start, test, lint, build, deploy, run (only "none"), port, url, shell, seed. |
[check.<id>] |
One row grid verify can run: label, run (required), cwd, timeout in seconds, needs (browser), auto, required, kind (command or http). The id may not look like card-<n>, which is reserved for the card's own checks. |
[run.<name>] |
A local run config: apps (required, [repo.<name>] names), services, what. See environments. |
[service.<name>] |
A service a run config brings up: port, start, stop, how. It needs a start or a port. |
[env.<name>] |
A remote environment: url, version (a URL to read or a command to run), pipeline (whose last success is its last deploy). |
[account.<name>] |
An account the project's environments need: how, expires (a date), and exactly one proof, check (a command that exits 0), env (a variable that is set) or file (a file that exists). No secret value is stored. |
[pipeline.<name>] |
A CI pipeline: provider, file, url. |
Any key, table or value type outside those eight is refused by name and line number. run = "none" with a start is a refusal too. lint and build are stored and counted, but no stage runs them yet. The settings page edits the same file.
| PART | TODAY |
|---|---|
| Builds | macOS on Apple silicon and Intel (dmg and zip), Linux x64 (AppImage) and Windows x64 (an NSIS .exe installer). Each unsigned for now. WSL 2 with WSLg still runs the AppImage if you prefer it. |
| Channels | The feed serves alpha, beta and stable. Every shipped build follows alpha; grid update --channel <name> and GRID_UPDATE_CHANNEL pick another. |
| A release | A row written by the publish script: version, sha512, sha256, size, release notes and a rollout percentage, unique per channel, platform and arch. |
| Staged rollouts | The feed hashes the version with the install id the app sends in a header and answers 204 outside the percentage. A missing id counts as inside. |
| Checks | On launch, every six hours and on wake. A found build downloads in the background. Nothing restarts on its own; the install happens when you press the chip. |
No milestone is set. Signing and notarisation for macOS, and Authenticode signing for the Windows installer.
The changelog is markdown under website/content/changelog, one file per version with version, date, label and title in the front matter; the importer refuses a version that does not match the file name. The matrix in bundled plugins is maintained by hand. There is no release manifest that generates either.
| EXIT | CODE | MEANS |
|---|---|---|
| 0 | Done. | |
| 1 | failure |
The daemon did not answer, or something unclassified failed. |
| 2 | usage |
A bad flag or an unknown command. |
| 3 | not_found |
No card, project or route matched. |
| 4 | contract_not_satisfied |
A transition hook refused the move. |
| 5 | needs_your_decision |
An ambiguous ref, a question with no Approve option. |
| 6 | not_built_yet |
A documented verb with no engine behind it. |
The daemon's 404 is 3, 409 is 4, 400 is 2, anything else is 1. The JSON code and the exit always agree.
| WHEN | WHAT |
|---|---|
| August 2026 | Closed alpha, done. A small group, one machine each, cards local. Board, session and code views, stage contracts, bundled plugins. |
| September 2026 | Waitlist alpha. Documentation complete, problem reports with obfuscation, the tour and the demo project. |
| End of September 2026 | Public beta: Design, the agent office, agent definitions, workspace settings, and the phone app and the Docker image with Solo. |
| October 2026 | 1.0. Free, Solo and Crew generally available: shared boards, roles, viewer seats, audit log. |
| November 2026 | Fleet. SAML, SCIM, admin-locked policy, private registry, self-hosted licence server. |
Not planned: a hosted agent, our own model, an IDE replacement. The roadmap page carries the reasons.
Months only, subject to change. Built by one developer who used this every working day for eight months before showing anyone.