# Onset spec (draft 2, October 28, 2026) Onset (its command is `on`) was called vcs before it had its name. Machines set up then keep working: `on` reads `vcs.toml`, `VCS_*` settings, `.vcs` workspace folders (renamed `.onset` the first time they're used) and its data folder from then, and the host answers at vcs.coline.dev as well as onset.coline.dev. Onset 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 `on 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 Onset ``` $ on get upstream.codes/acme/shop workspace ~/shop (upstream.codes/acme/shop) change rtnbkcvx new, empty, on main 48190 next: edit files, then on land -m "what you did" $ # ...edit src/auth/login.ts... $ on 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 on sync to bring in others' work ``` Two agents work in parallel by each getting their own workspace: ``` $ on get upstream.codes/acme/shop ~/shop-billing $ on 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 | `on get [folder]` | Make a workspace for a project (`--lazy`: each file comes when it's first opened). | | | `on mount [folder] [--stop]` | Start a lazy workspace's mount again, or stop it. | | | `on 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. | | | `on init [folder]` | Start a new project that lives only on this machine. | | | `on import [folder]` | Make a project from a git repository, with its history. | | | `on publish ` | Put a local project on a host. | | | `on git [resume]` | Where git clones the project, and whether that git view is current. | | | `on login [host]` | Sign in (default host: upstream.codes). | | See | `on status [change]` | Where you are and what to do next. | | | `on diff [path...]` | What a change changes. | | | `on log [version\|change\|path]` | History of main, open changes, saves or operations, or the versions that changed a path. | | | `on blame ` | The version that last changed each line. | | | `on show [--from ]` | Print a file as it is in main, or in a version, change or save. | | | `on tag [name] [version]` | Name a version of main (`v1.0`); a name works wherever a version number does. `--remove` takes it off. | | | `on bisect --run ""` | Find the first version of main where a command fails. | | | `on watch --run ""` | Keep main working: check each new version, and take back the one that breaks the check. | | | `on verify [version]` | Who signed the land that made a version, checked here. | | Work | `on new ["title"]` | Start another change. The current one is kept. | | | `on line [name] [--from ]` | The project's release lines, or a new one (`1.x`) from a version of main. | | | `on describe "text"` | Set the current change's description. | | | `on switch ` | Put this workspace on another change. | | | `on drop [change]` | Abandon a change. | | Finish | `on sync` | Bring the change up to date with main. | | | `on land [change]` | Put a change on main (or on its release line; `--to ` brings a change over to one). | | Fix | `on undo [version]` | Undo the last `on` command in this workspace, or take a landed version back out. | | | `on restore ` | Bring files back from an earlier point. | | | `on purge ... [--yes]` | Take files out of the project's whole history and delete their content (owners on a host). | | | `on gc [--older 30d] [--dry-run]` | Clean up what this machine keeps: old saves, and objects nothing needs. | | | `on sessions [on\|off\|show \|delete \|delete --all]` | Agent sessions kept with the changes they land (only you see them): list, show, turn off or on, delete. | | | `on submodule [path [commit]] [--url ] [--remove] [--checkout]` | Git submodules: list them, point one at a commit, add, remove, or check them out. | | Share | `on access [who...]` | See or set who can see a change or a folder. | | | `on group [@person...]` | See or set one of the project's groups. | | | `on approve ` | Approve someone else's change; the last approval a project needs lands it. | | | `on key` | Make this machine's signing key and add it to your account; your lands are signed from then on. | | | `on 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. | | | `on check` | Check this machine's objects and the host's copy of the project for damage. | | | `on rollback --to