console: what waits on you, and what runs →
ocx2-cgirelease 197a37c0d8ae (green at 2026-11-06T02:32:21Z: 713 examples, 0 failures; coverage 100.0%; 2 executables build; built with no build settings) ocx2 — OCX's tools for work on a Fossil repository.
tools
Runs, work an actor does toward an objective: send one, start one by hand, or stop one
Write a version 2 run as your user from a pattern and explicit fields, addressed by to and clone: on the server, or as a reply or ticket change pushed from a clone. Admin or setup makes an absent process user when its workspace signs in. The daemon and watcher answer it later.
capabilities needed: aR (a: admin, R: send runs) ✗
run
Start a manual run on the clone's host, using its clone and project password file.
capabilities needed: s (setup) ✗
withheld: run starts a manual run on the clone's host
ocx2 run RUN [--dry-run]
Ask a run's actor to end it with a stop, written where the run is, as your user on the server. An actor acts only on a stop from a user holding admin or setup, or R for a run that user sent.
capabilities needed: a (admin) ✗
attach
Join your terminal to the terminal of a run's process, at its clone's host, as the host account OCX runs as: you see what it shows and type into it, until you press Ctrl-], when you leave it running.
capabilities needed: (none)
withheld: a page holds no terminal; attach at the clone's host's command line.
ocx2 attach RUN [--dry-run]
Store, on the server alone, a value a run may use, such as a tunnel's key; sync never copies it. A run from a user holding admin or setup names it $$secret:NAME$$ in its process's env; the server's actor fills it in, and neither started nor kept logs show it.
capabilities needed: a (admin) ✗
daemon
Run this machine's clones under its service manager, pulling whole clones and handing open runs to watchers.
capabilities needed: s (setup) ✗
withheld: the daemon runs on the clone's host, under its service manager
ocx2 daemon [--dry-run]
watch
Watch one run on this acting clone and post its reports through Fossil's pages.
capabilities needed: s (setup) ✗
withheld: watch runs on the clone's host
ocx2 watch RUN SERVER CREDENTIALS [--by-hand] [--dry-run]
The checkout: read, change, test and save your work
context
Say what you are working on, first: the run's objective, if this is a run's checkout; the branch save commits on; the files changed and not saved; and the tests test may run. Then find and read files, change them with edit, run every test, and save.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 context [--dry-run]
find
Find each line holding a text, exactly as written, case and all, in the checkout's files or under one path: its file, its line number and the line. Then read the file from a little before that line.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 find TEXT [--path PATH] [--dry-run]
read
Read a file of the checkout: up to 200 lines from a line you name, exactly as they are, as text, with the numbers of its first and last lines and how many lines the file has. Copy what edit replaces from this text.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 read PATH [--from FROM] [--dry-run]
edit
Change a file of the checkout: replace the text `old`, copied exactly from read's answer, with `new`. `old` must appear in the file exactly once; with `old` empty, add `new` at the file's end, making the file if there is none. It answers the changed lines as read does.
capabilities needed: i (check-in) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 edit PATH OLD NEW [--dry-run]
test
Run the project's tests in the checkout as it is now, all, or one by the name the context tool lists: whether each passed, and the last 100 lines it wrote. The save tool needs every test to pass after your last edit.
capabilities needed: i (check-in) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 test [--name NAME] [--dry-run]
save
Commit and push every change once every test has passed since your last edit: on your working branch, with a title and Intent, Expression and Demonstrates lines, as your user. It answers the check-in and who the server says sent it; with nothing changed, it pushes what is unsent.
capabilities needed: i (check-in) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 save TITLE INTENT EXPRESSION DEMONSTRATES [--dry-run]
wiki_read
Read a wiki page as the server holds it now, by its name: its text and its version. Change it with wiki_edit.
capabilities needed: j ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 wiki_read NAME [--dry-run]
wiki_edit
Change a wiki page as edit changes a file: replace `old`, copied exactly from wiki_read's answer, with `new`; `old` must appear exactly once in the page now, so no newer change is lost. With `old` empty, append `new`, making the page if none. It answers the new text and version.
capabilities needed: k ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 wiki_edit NAME OLD NEW [--dry-run]
unversioned_list
List the unversioned files the server shares, such as binaries: each name, the hash of its content and its size.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 unversioned_list [--dry-run]
unversioned_get
Get an unversioned file the server shares, by its name: its content, base64, and the hash of its content.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 unversioned_get NAME [--dry-run]
unversioned_put
Share a file, such as a binary, as an unversioned file of the server: its name and its content, base64. To change one, give the hash you last saw, so no newer one is lost. It answers the new hash.
capabilities needed: y (write-unversioned) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 unversioned_put NAME CONTENT [--replaces REPLACES] [--dry-run]
An agent's work: sync check-ins, post answers, and record verdicts
Write a plain post as your user: a reply in the thread of the post you answer, or a change to a ticket. From your clone's checkout it is made in your clone and pushed; on the served repository, as from this page, it is made there. A reply needs Fossil's WrForum (3) or WrTForum (4), a change to a ticket its WrTkt (w) or ApndTkt (c), and Check-In (i) may make either. It refuses text that holds an OCX message, so a program's posts never carry one, and it never starts a thread or a ticket. Given for, it writes the text as a question for that user, and given run too, as the question of that run's process, yours; given decision, as your decision for the question you answer, which anyone where it is may write, and which, from its sender, or from whoever sent the run it names as asking it, confirms it answered and closes it.
capabilities needed: i34wc (i: check-in) ✗
File a new ticket as your user on the served repository, Open, with a title and a description in Markdown; it holds no OCX message, and a run, which answers where it was asked, never files one from its clone. Needs Fossil's NewTkt (n). Refused where the server holds new tickets for a moderator and you lack ModTkt (q).
capabilities needed: n ✗
Say what waits on a user, as data: each question for that user that they have not decided, whoever else has; each they sent, or a run they sent asked, that has a decision, for them to confirm answered; and every other open question, oldest first. Each with its fields, where it was asked, who sent it and when, what it replies to and what it refers to described, its decisions, and who may confirm it. From a clone's checkout it asks the server who sent each question and decision. It writes nothing.
capabilities needed: 2r ✓
Answer a project's card/NAME wiki definition across the named repositories, as data. Reads only.
capabilities needed: o (check-out) ✓
Answer every card/NAME wiki definition in the named repositories. Reads only.
capabilities needed: o (check-out) ✓
Say who sent each artifact: the user the server received it from, what that user may do there, and the order in which the server received it, or that it has not; or what one user may do, and whether the wiki edits they save, and the ticket changes they make in its ticket pages, wait for a moderator. Never an IP address. From a clone it asks the server.
capabilities needed: (none)
Record a verdict on a check-in: tag it audited with pass or fail, a note, and the objective it was judged against, as your user (docs/protocol-v2-verdicts.md). No one may audit their own check-in. From a clone, the tag is pushed; either way, the verdict is then read back from the served repository, so a verdict Fossil did not keep is never reported as given.
capabilities needed: i (check-in) ✗
List the check-ins that change files and that no verdict that counts has judged (docs/protocol-v2-verdicts.md): on one branch or every branch, oldest first in the order the server received them, at most 50, with how many there are. From a clone's checkout it asks the server. It writes nothing.
capabilities needed: (none)
For an agent outside every run's checkout that keeps no Fossil password: push your clone's check-ins by giving a base64 bundle of your working branch, each comment with Intent, Expression and Demonstrates lines; checked, they are pushed as the user of the run whose process answers this call. Give have, a check-in you hold, for later ones. In a run's checkout, on any host? Your commits push as you make them; if one did not, run `fossil push`.
capabilities needed: i (check-in) ✗
For an agent outside every run's checkout that keeps no Fossil password: say, as shell commands, how to commit your own clone's work and get it to the server: check you are on your working branch, commit with the comment this writes from what you give, bundle the branch, and give it to sync. In a run's checkout, on any host? Your commits push as you make them; if one did not, run `fossil push`.
capabilities needed: (none)
commit_and_sync
For an agent outside every run's checkout that keeps no Fossil password, from ocx2 --mcp on its own machine: commit every change in your own clone once every test has passed since your last edit, new files included, on your working branch, with a title and Intent, Expression and Demonstrates lines; answer the branch's bundle for sync. Elsewhere it points to commit_and_sync_guide. In a run's checkout, on any host? Your commits push as you make them; if one did not, run `fossil push`.
capabilities needed: i (check-in) ✗
withheld: it acts on your own checkout, which the web page is not where; see commit_and_sync_guide
ocx2 commit_and_sync BRANCH TITLE INTENT EXPRESSION DEMONSTRATES [--dry-run]
thread
Read a thread or a ticket, named by the hash, or a prefix of it, of any of its posts or changes, such as your run's: each post or change, oldest first in the order the server received them, with who sent it, when and its text; at most 20, after the one you give. From your clone's checkout it pulls first. It writes nothing.
capabilities needed: o (check-out) ✓
withheld: Fossil's own forum and ticket pages show a thread and a ticket's changes; read them there.
ocx2 thread OF [--after AFTER] [--dry-run]
The repository and its actor
Install Fossil's own git export as the after-receive hook, replacing any old ocx2-hook command.
capabilities needed: s (setup) ✗
What hook would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
read_hookread Fossil's export hook, other after-receive programs, backoffice settings and the timeline chat user · repository /var/lib/fossil/bootstrap-qcow2.fossil
stops nobody lacks what hook needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
Remove Fossil's export hook and any old ocx2-hook command, leaving every other hook.
capabilities needed: s (setup) ✗
What unhook would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
read_hookread Fossil's export hook, other after-receive programs, backoffice settings and the timeline chat user · repository /var/lib/fossil/bootstrap-qcow2.fossil - change
delete_hooksdelete Fossil's export command and any old ocx2-hook command, leaving other hooks · repository /var/lib/fossil/bootstrap-qcow2.fossil
stops nobody lacks what unhook needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
Bring the server's git export, the git repository Fossil writes from it, up to date. One export runs at a time: asking during one makes it run once more after. OCX's hook does this whenever a check-in arrives. A dry run only says where the export stands.
capabilities needed: s (setup) ✗
What export would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
find_exportfind the repository's git export where its last-git-export-repo setting says, and read where it stands, as fossil git status says, with OCX's last run of it · repository /var/lib/fossil/bootstrap-qcow2.fossil - change
export_to_gitexport the check-ins waiting, with fossil git export, one run at a time: while another run holds the export, ask it to export again instead; it exports until no run asks · mirror /var/lib/ollama-codex/git-mirror/bootstrap-qcow2 · awaiting 0 · autopush off
stops nobody lacks what export needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
Make a served repository, empty or from git, with its export, hook, ticket fields, clone and process users ready. The running daemon makes its clone within a minute. The web page runs it detached.
capabilities needed: s (setup) ✗
Tag every OCX message the repository holds that lacks its ocx-message tag, or carries a wrong value, in one control artifact, as your user, as the actor's check does: on the served repository, or from your clone's checkout, pulled first and pushed after. It needs Fossil's Check-In (i), answers what it tagged, by kind, and decides nothing about any run.
capabilities needed: i (check-in) ✗
What tag_messages would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- change
tag_untaggedread every post and ticket change holding an OCX message, as the actor's check reads them, and tag each that lacks the ocx-message tag, or carries another value, in one control artifact, as the caller: on the served repository, or in the caller's clone and pushed · user nobody
stops nobody lacks what tag_messages needs: any of the Fossil capabilities i (check-in); it holds ghjorz (g: clone, o: check-out)
Logins: ask for one, approve it, collect its password, or let one send runs
Approve a login someone asked for, with one press: open only a link the asker printed itself. It makes that user holding exactly the capabilities the link asks, never admin or setup, with a password no page shows, which the asker may collect with its code.
capabilities needed: a (admin) ✗
Give the asker of an approved login its password, for the code whose SHA-256 its link gave, which only the asker holds; or, without a code, to a signed-in login the password is approved for. Register sends the code in a POST's body, never in a URL. It needs no capability and changes nothing.
capabilities needed: (none)
register
Ask the server for a login, from your own machine: the first call makes a code, keeps it in your file of passwords and prints a link for an admin to approve; once approved, a call collects the password into the file in place of the code.
capabilities needed: (none)
withheld: register is called on the asker's own machine, which keeps its file of passwords, from its command line.
ocx2 register SERVER CREDENTIALS [--login LOGIN] [--capabilities CAPABILITIES] [--dry-run]
Make the key a connector, such as claude.ai's, reaches this repository's MCP with, acting as one login once a login holding setup approves it through OAuth, and show its URL once; or revoke it. A login holding admin or setup is refused. Each call acts with the login's capabilities as Fossil holds them then, and lists only status, questions, thread, post, ticket.
capabilities needed: s (setup) ✗
Let a user of the served repository send runs, and stop the runs it sent: add R to the letters it holds, or with off take R away, in one write that leaves every other letter as it is, and say what it may do then. An actor takes a run from a user holding R alone within the run isolation rules.
capabilities needed: a (admin) ✗
Releases: stage, accept or roll back
stage
Check, build and stage a release: run a committed Fossil checkout's own checks (crystal run ci.cr), build its programs (shards build), copy them into the release root's staged/, named by the check-in's first twelve hex digits, smoke each, and offer the release as next. Nothing served changes until accept.
capabilities needed: s (setup) ✗
withheld: it runs the checkout's own code as the web server's account; run it from the command line or MCP.
ocx2 stage CHECKOUT [--root ROOT] [--dry-run]
Serve the pre-release candidate (staged/next in the release root) as the active release candidate (current); what was served becomes previous. Only a user holding setup may; called as the pre-release candidate's page, ocx2-cgi-next, it accepts only a first release, while none is served.
capabilities needed: s (setup) ✗
What accept would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
find_offeredfind the release the staged area offers as next, unless it is already served · root /var/lib/ocx/agents-daemon
stops nobody lacks what accept needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out); next is 197a37c0d8ae, which is served already
Serve the previous release again as the active release candidate; a second rollback undoes the first. Both pages, ocx2-cgi and ocx2-cgi-next, roll back.
capabilities needed: s (setup) ✗
What rollback would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
find_previousfind the release the root served before the current one · root /var/lib/ocx/agents-daemon - change
roll_backserve the previous release again, which ocx2-cgi then runs, keeping the release it replaces as previous · root /var/lib/ocx/agents-daemon · name 0397ade7223b · replaces 197a37c0d8ae
stops nobody lacks what rollback needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
Count a builder's stage run by the server's receipts, check its files, copy and smoke it, and offer it as next; remove the shared files.
capabilities needed: s (setup) ✗
Read current and previous, their names and SHA-256 inventories; read a listed file of either release, base64. Only a signed-in setup login or a listed builder may read.
capabilities needed: (none)
follow
Run the server's accepted current release on this client, keeping the release it leaves as previous. Start the daemon again with confine daemon after current moves.
capabilities needed: (none)
withheld: follow runs inside the client's root, as its owner, from the command line
ocx2 follow SERVER [--root ROOT] [--dry-run]
Name the stage pattern and the builder whose runs may be imported as releases of this repository's program APP, which the page then serves at ext/ocx2-cgi/app/APP once one is accepted; import, accept and rollback given --app release it as they release OCX. The builder gets y (write unversioned) on this repository, to send its runs' files. Only a user holding setup may.
capabilities needed: s (setup) ✗
About this program
List every tool: what it does, who may run it, whether this entry point offers it, and the shape of its input; and, for a tool that changes something and needs no input, what a dry run of it says now. This list is what runs when no tool is named, and what MCP's tools/list gives.
capabilities needed: (none)
Give what the list tool gives, with more detail: the shape of each tool's output, of the context every tool receives and of every answer, and where releases live.
capabilities needed: (none)
Show the caller, release and export hook, record runs for every clone user named by an administrator, and the daemon's last round. With --login and a clone, include the actor's offer, local care and processes.
capabilities needed: (none)
Answer with exactly the arguments it was given and who gave them, changing nothing. It shows that every entry point delivers the same input.
capabilities needed: (none)