# vcs spec (draft 2, October 28, 2026) `vcs` is a placeholder name. The real name comes before the public preview. vcs is open-source version control where nobody waits and nothing gets lost. It has its own model and its own CLI. Git is a bridge in and out, not the foundation. It runs on its own for one person offline, and it gets a server (Upstream, or one you host) when work is shared. Three promises: - **Nobody waits.** Landing is the server's job, so nobody's work is refused because someone else landed first. Making a workspace takes seconds, not a clone and a reinstall. - **Nothing is lost.** Your work saves itself, and `vcs undo` takes back what you did, including a land. A change follows you to another machine, and deleting a workspace folder loses nothing. - **Private where you need it.** A folder can be visible to only some people. Your `.env` files are yours alone, and secrets are checked before anything lands. The plan behind this spec, with the research and the order of work, is `reports/Upstream version control plan Oct 2026.md`. ## 1. The words | Word | Meaning | |---|---| | **change** | One piece of work. It has an ID made of letters (`rtnbkcvx`; the first 4 or more letters are enough) and keeps that ID from start to finish. It holds every save. It replaces git's commit, branch, stash and reflog. | | **main** | The shared line of a project. It only moves when a change lands, and each landing makes a new numbered **version**: main 1, 2, 3 and so on. Numbers are always versions and letters are always changes. | | **land** | Putting a change on main. The server merges it with whatever landed since the change started, runs the project's checks on the exact result, and adds it as the next version. If something conflicts, main doesn't move and you're told exactly where. | | **workspace** | A folder working on one change. You can have as many as you like, and each holds one change at a time. Your work lives in the change, not the folder. | | **save** | A snapshot of a change. Saves happen by themselves, and every save is kept. | There's no staging, no commit command, no branch names and no pull or rebase before landing. ## 2. A day with vcs ``` $ vcs get upstream.codes/acme/shop workspace ~/shop (upstream.codes/acme/shop) change rtnbkcvx new, empty, on main 48190 next: edit files, then vcs land -m "what you did" $ # ...edit src/auth/login.ts... $ vcs land -m "Fix login redirect loop" -m "Why: users with expired sessions bounced between /login and /home. Checked: auth tests pass." landed rtnbkcvx as main 48214 "Fix login redirect loop" merged with 23 versions that landed since main 48190 change qwhmdzst new, empty, on top of what you just landed next: keep working, or vcs sync to bring in others' work ``` Two agents work in parallel by each getting their own workspace: ``` $ vcs get upstream.codes/acme/shop ~/shop-billing $ vcs get upstream.codes/acme/shop ~/shop-search ``` Both land whenever they're ready, in any order. Neither waits for the other or pulls first. ## 3. Commands Four commands cover nearly all work: **get**, **status**, **land** and **sync**. **undo** covers mistakes. | Group | Command | What it does | |---|---|---| | Start | `vcs get [folder]` | Make a workspace for a project (`--lazy`: each file comes when it's first opened). | | | `vcs mount [folder] [--stop]` | Start a lazy workspace's mount again, or stop it. | | | `vcs workspaces [add [--on ] \| clean]` | This project's workspaces on this machine (one per agent): list them, add one next to this one (on main, or on a change that hasn't landed), or remove the ones whose work is done. | | | `vcs init [folder]` | Start a new project that lives only on this machine. | | | `vcs import [folder]` | Make a project from a git repository, with its history. | | | `vcs publish ` | Put a local project on a host. | | | `vcs git [resume]` | Where git clones the project, and whether that git view is current. | | | `vcs login [host]` | Sign in (default host: upstream.codes). | | See | `vcs status [change]` | Where you are and what to do next. | | | `vcs diff [path...]` | What a change changes. | | | `vcs log [version\|change\|path]` | History of main, open changes, saves or operations, or the versions that changed a path. | | | `vcs blame ` | The version that last changed each line. | | | `vcs show [--from ]` | Print a file as it is in main, or in a version, change or save. | | | `vcs tag [name] [version]` | Name a version of main (`v1.0`); a name works wherever a version number does. `--remove` takes it off. | | | `vcs bisect --run ""` | Find the first version of main where a command fails. | | | `vcs verify [version]` | Who signed the land that made a version, checked here. | | Work | `vcs new ["title"]` | Start another change. The current one is kept. | | | `vcs line [name] [--from ]` | The project's release lines, or a new one (`1.x`) from a version of main. | | | `vcs describe "text"` | Set the current change's description. | | | `vcs switch ` | Put this workspace on another change. | | | `vcs drop [change]` | Abandon a change. | | Finish | `vcs sync` | Bring the change up to date with main. | | | `vcs land [change]` | Put a change on main (or on its release line; `--to ` brings a change over to one). | | Fix | `vcs undo [version]` | Undo the last vcs command in this workspace, or take a landed version back out. | | | `vcs restore ` | Bring files back from an earlier point. | | | `vcs purge ... [--yes]` | Take files out of the project's whole history and delete their content (owners on a host). | | | `vcs gc [--older 30d] [--dry-run]` | Clean up what this machine keeps: old saves, and objects nothing needs. | | Share | `vcs access [who...]` | See or set who can see a change or a folder. | | | `vcs group [@person...]` | See or set one of the project's groups. | | | `vcs approve ` | Approve someone else's change; the last approval a project needs lands it. | | | `vcs key` | Make this machine's signing key and add it to your account; your lands are signed from then on. | | | `vcs settings [approvals=N] [git=on\|off] [signed=required\|optional]` | See or set the project's host settings: approvals needed to land, whether main is copied to git, and whether lands must be signed. | | | `vcs check` | Check this machine's objects and the host's copy of the project for damage. | | | `vcs rollback --to