Migration surveys
The four read-only surveys behind Migration plan, verbatim. 2026-10-26/27.
Survey A: every repository
Survey C, swk-ai (read-only, 2026-10-27, about 02:25 UTC, which is 10:25pm EDT on Oct 26)
Bottom line
- swk-ai is live. It is a chat page served by Fossil at /swk-ai/ext/swk-ai. Each of Bash's messages, and each scheduled greeting, becomes an OCX run that Codex answers, on node
swk-ai-node, on the server host. - Today those runs are started by the
ocx2 createcall that the swk-ai program itself makes. In today's release, that call acts as the server's node immediately; the after-receive hook does not start them. - If the new release is accepted without migrating, every message and greeting is written but never started, and the page waits forever. The program also sits inside an OCX run's workspace, so it is lost if that workspace goes away.
Sources
- What I checked directly from outside:
/swk-ai/homeredirects to/ext/swk-ai./ext/swk-aianswers with swk-ai's own login gate: a 302 to/login?g=%2Fswk-ai%2Fext%2Fswk-aifor pages, and401 {"error":"log in to Fossil first"}for its API. A made-up name such as/ext/foogives 404. So the program is installed and running.- The status page shows release aa650c80c410, and the swk-ai hook installed as
ocx2-hook --log … --node swk-ai-node. - The hook last ran at 01:56:44 UTC (9:56pm EDT). It handled 5 artifacts in 94.5 ms and answered or started nothing. One of the 5 is the agent-prompt check-in 3e58feb1b9.
- Anonymous users can read nothing in swk-ai:
- The forum, timeline, wiki and file pages all redirect to login, and the RSS feed is empty.
fossil clonesays "not authorized to clone".- The git export answers 403, "not readable by this viewer".
- OCX's receipt and unaudited pages say nothing for a viewer without Read.
- The ollama clone never mentions swk-ai.
- Where the rest comes from: the transcript of the session that builds swk-ai. It is readable in this account's Claude home, at
/var/lib/ocx/agents/opus-ocx2/projects/ollama/b2de8b0c…/.claude/projects/-workspace-tree/f6cbf2c8-64d8-4da4-827f-6dd76cbf3c24.jsonl, together with its memory fileswk-ai-deployment.md.- The session is run-d208124d, run 9d9c6722f2, sent by ec2-user on node swk-ai-node, and it was active until 01:58 UTC.
- This is the session's own record of commands and results. I could not check it against the repository.
What the service is
- Purpose: a web chat for one person, SWK. His Fossil login is
bashand the page calls him "Bash". He uses an older iPad (iOS 12 or later).- Every question and answer is a forum post, with nothing private.
- Codex answers with web search and image generation.
- The maintainer steered it away from coding, toward baseball, Michigan and Texas A&M sports, weather (Bloomfield Hills), science, Spanish, algebra tutoring with no homework answers, and jokes. Answers carry no links to other sites.
- Bash used it for real on Oct 26: photos of algebra homework.
- The CGI program
swk-ai: Crystal, a static musl x86_64 build, version 0.4.0. The last program build deployed is check-in 0bb8b52621. Later commits changed only the agent's files, which each run checks out fresh from trunk.- The maintainer made a one-time symlink from Fossil's extension directory to
/var/lib/ocx/release2/agents/run-d208124d/projects/swk-ai/9d9c6722f2882e7c…/bin/swk-ai. That is inside the builder run's workspace. Each rebuild replaces the file in place by rename. - It refuses to run for any repository whose project code is not swk-ai's (
9b58e82b36…). - It sends
nobodyandanonymousto/login. Logins with Admin or Setup are maintainers and see Bash's page read-only.
- The maintainer made a one-time symlink from Fossil's extension directory to
- Its "never write a file" rule:
- It reads the repository through read-only SQLite and never runs
fossil. - The one exception is a photo Bash uploads. It is staged on tmpfs, attached to the wiki page "swk-ai images" by the fossil serving the request, as the logged-in user, and the staging directory is then removed.
- It reads the repository through read-only SQLite and never runs
- How it sends a message: it runs
/var/lib/ocx/release2/current/ocx2 --json --repository <served swk-ai.fossil> --user swk-ai create MESSAGE --pattern run/swk-ai --node swk-ai-node, plus either--title "swk-ai/bash: …"or--to LAST-POST. It runs this from the directory/var/lib/ocx/release2. The release path, the node name and the pattern name are fixed in its code.- Since 22:04 UTC on Oct 26 it sends as the login
swk-ai, which holds Admin and has a random password nobody keeps. - It switched because a run from
bash, who holds only R, was refused: the run asks for a password step, which the node's rules do not allow for R-only senders.
- Since 22:04 UTC on Oct 26 it sends as the login
- The greeting daemon
swk-ai daemon:- The CGI starts it detached (
setsid) on a signed-in request when no copy of the current build is running. Anonymous requests are refused before that point, so my probes did not start or signal it. - It is found through
/procand keeps its state in memory. It exits after 24 hours without a request. - It sends greeting runs, objective "swk-ai greeting for YYYY-MM-DD HH", at 5:50am and 2:50pm Detroit time through the same
ocx2 create. It sends none if Bash has not been on since the previous day.
- The CGI starts it detached (
- The agent:
- The pattern is the wiki page
run/swk-ai, published by ec2-user fromocx/swk-ai-agent.md. - The run user is
codex, holding g i o 2 4 C b m. - Workspace steps: a directory, a password, a clone as codex, and a checkout of trunk.
- Sandbox: network on; read-only
/usr,/bin,/liband a few/etcfiles; the host's/root/.codexbound read-write (Codex logged in with ChatGPT); uid 1000; it ends with the node. - Limits: 1 hour wall time, 3600 s of CPU, 512 processes, 256M files.
- The command
/bin/sh $$tree$$/ocx/swk-agent: - Reads the thread and the wiki page "swk-ai interests" from its clone.
- Runs
codex exec --json --dangerously-bypass-approvals-and-sandbox -c web_search="live". - Posts each step to Fossil chat as "[swk-ai RUN] …". It posts to
/chat-sendwith a Referer and the clone's saved login, becausefossil chat sendin 2.27 fails Fossil's CSRF check. - Attaches new images to "swk-ai images", strips outside links, and adds notes about Bash to the interests page.
- Posts the answer as a forum reply by
codex, with its token count, then syncs. - It uses
fossil,jq,curl,md5sumandcodex, which is at/usr/local/bin/codex, codex-cli 0.162.1.
- The pattern is the wiki page
- The page:
- It follows a run's steps through Fossil's
/chat-poll, ignoring any chat line without its own tag. - It cuts each poll off at 15 s and checks the forum for the answer every 10 s.
- It draws math itself and turns any outside links into plain text.
- It follows a run's steps through Fossil's
Where it runs and what it reads and writes
- Everything runs on the server host:
- the CGI program and the greeting daemon, as Fossil's CGI account;
- the codex runs, in sandboxes under
/var/lib/ocx/release2/agents/codex/projects/swk-ai/RUN; - the builder session.
- It has no port of its own: Fossil
/extonly. - It reads: the forum, the chat table, wiki pages, users' capabilities, and the codex replies' token lines, from which it counts usage.
- It writes, through other programs:
- runs, via
ocx2 create; - photo attachments, through the exception above;
- forum answers, chat steps, attachments and wiki edits, written by the agent from its own clone.
- runs, via
- Its threads: conversations titled "swk-ai/bash: …", the maintainer's earlier tests titled "swk-ai: …", and greeting threads.
How it depends on today's OCX
- The start of every run: today,
createcalled from the release directory makes the server's node act at once inside that call. So each swk-ai run is decided and launched from the CGI or daemon process. - The codex password: today's server node sets a fresh password for
codexon the served repository at every run's password step. - Fixed names: the path
/var/lib/ocx/release2/current/ocx2and the node nameswk-ai-nodeare fixed in swk-ai's code, and every past codex run names that node. - The program's location: it lives in an OCX run workspace. Its builder, a session on today's node, is its only deployer.
- The hook still delivers thread posts to the builder session. Most of the maintainer's messages to it were typed straight into its terminal.
What it needs to keep working under the new design
These points are from reading tree8's source and documents. None of it has been tested.
- No change to swk-ai's code to send runs:
- tree8's
createstill writes a run on the served repository with--repositoryand--user, a positional objective, and--pattern,--node,--titleand--to. Its answer still hasresult.runandresult.where.hash. - It writes through
fossil bundle import --user swk-ai, so the server's receipt namesswk-ai. That login holds Admin, sor-senders.jsondoes not apply. - A local write still adds a chat line once
chat-timeline-useris set, so the daemon wakes.
- tree8's
- On the server:
- Accept the release into the same
/var/lib/ocx/release2, socurrent/ocx2stays valid. - Run
ocx2 --repository /var/lib/fossil/swk-ai.fossil hook. - Set
chat-timeline-useron swk-ai to a name that is not a real user. The page ignores the extra lines; Bash will see them in Fossil's own/chat. - Keep the node user named exactly
swk-ai-node. The new node refuses a run whose user "works for the node … whose first run named it", and the page treats only replies fromcodexas answers. Giveswk-ai-nodegoC4w, with no Admin or Setup. - Set passwords by hand:
fossil user password swk-ai-node …andfossil user password codex ….approvenever changes a user it did not make. - Copy the swk-ai program out of run-d208124d's workspace to a permanent path, and point the symlink there.
- Accept the release into the same
- On the agent machine:
- A
nodes.jsonentry forhttps://ollama.openbeagle.org/swk-ai, with a credentials file{"user":"swk-ai-node","password":…,"runs":{"codex":…}}. Without the codex password, every run is refused: "this node holds no password for its user, codex". /usr/local/bin/codexlogged in with ChatGPT at/root/.codex, so the daemon effectively runs as root. That home is bound "if present", so a machine without it fails each turn.- Fossil 2.27, jq, curl, bubblewrap and GNU timeout, and network access.
- Disk space: every run keeps a full clone of swk-ai plus a checkout, since there is no
remove_on.
- A
- Unchanged by the move:
- One codex run at a time per node: a question waits behind a greeting. Both releases have this rule.
- Each run executes whatever is on swk-ai trunk at that moment, with the host's Codex login bound in.
- Each agent chat step will also wake the daemon into one
fossil pull.
- Timing:
- The next greeting is about 5:50am EDT on Oct 27 (09:50 UTC). After Nov 1 the times stay 5:50am and 2:50pm Eastern.
- Anything written while no daemon serves swk-ai starts late, on the daemon's first full read.
- The daemon treats an existing greeting thread for a slot as done, so a missed greeting is probably skipped. I saw this for a refused greeting and infer it for one that never started.
Two decisions for the maintainer
- Where swk-ai's runs execute: the server host also running a daemon, which keeps Codex, the login and the tools where they are, or another machine.
- Where the swk-ai program lives, and who rebuilds and installs it, once its builder is no longer a session whose workspace is on the server host.
What I could not see, and who could
- Repository content: the swk-ai forum, wiki, timeline and users, including the capabilities of
swk-ai-node,codex,bashandswk-ai, whether any runs are open, and whether the second builder (run 8430486bbf, run-1b11b787) was stopped.- An admin (ec2-user or stone) could see these, and so could the builder session, which has a full clone at
/workspace/clone.
- An admin (ec2-user or stone) could see these, and so could the builder session, which has a full clone at
- The server host:
- the extension directory and the symlink;
- which account Fossil runs CGI as (likely root, since
/root/.codexworks; not verified); - whether the greeting daemon is running;
- run workspaces and disk use;
/root/.codex;- the
r-senders.jsonthat is served; - chat retention settings;
- whether swk-ai has a git export configured.
- Only root on that host could see these.
My working files (a copy of the ollama clone and text pulled from the transcript) are in /tmp/claude-0/-var-lib-ocx-agents-opus-ocx2-projects-ollama-b2de8b0c2c6700eb5c686b1747b5aaa1e2d2d01370ac55f2e5a151a67e03b48a/3f7cfe25-28aa-4c55-827c-bc0618da81e6/scratchpad/migration/:
swk-session-text.txt: the conversationswk-tools.txt: commands and their results
Survey B: runs, sessions and agents
Survey A: every repository served at ollama.openbeagle.org
I read all 31 repositories as of 2026-10-26 22:07–22:30 EDT, from outside, and wrote nothing to any server.
Same on every row:
- OCX's status page answers on all 31.
- All are served by release aa650c80c410 from /var/lib/ocx/release2. The previous release is 3869da228e7d, and the "next" slot also holds aa650c80c410, so the new design (c22eb96ffd) is not offered yet.
- This release's status page has no field for
chat-timeline-user, and anonymous users cannot open chat. Sochat-timeline-useris unknown on all 31.
"Hook" below uses this release's terms. "No hook" means no OCX hook is installed. A "yes" in the newest-check-in column means the newest check-in is in the export. "Forgejo" means forgejo.openbeagle.org.
| Repository | Hook and node | Other hook programs | Open runs (status) | Git export | Newest check-in: in the export? | GitHub or mirror signs |
|---|---|---|---|---|---|---|
| armbian-build | no hook | – | – | yes | 854b5c677c (05-11): yes, as the upstream commit on badge-snake |
upstream github.com/armbian/build (README); Forgejo ocx/armbian-build pulls the export every 8h |
| badge-launcher | no hook | – | – | yes | 4cb2ae057c (09-21): yes | Forgejo ocx/badge-launcher, 8h; check-ins cite github.com/Grippy98/badge-launcher |
| battlesnake-rules | no hook | – | – | yes | 59e10ff432 (06-11): yes, as the upstream commit | Forgejo ocx/battlesnake-rules, 8h; README names upstream BattlesnakeOfficial/rules |
| bb-imager-rs | no hook | – | – | yes | a69e127092 (06-19): yes | Forgejo ocx/bb-imager-rs, 8h; Forgejo also mirrors github.com/beagleboard/bb-imager-rs directly |
| BeagleBadge | no hook | – | – | yes | c459d1f528 (04-14): yes | Forgejo ocx/BeagleBadge, 8h |
| blabl | no hook | – | – | yes | 4e507e9568 (06-01, its only check-in): yes | none |
| board-generator | no hook | – | – | yes | a333ff849d (04-23): yes, but on branch codex/create-agents.md-and-project-skeleton; main holds dba5c05983 (04-21) |
only codex/* branch names |
| bootstrap-qcow2 | installed, node bq2-node | – | none | yes, no HEAD | Newest 6d67be9e92 (10-26): yes. The trunk tip c86ec69825 ("BQ2 1.0.0", 10-25) went to branch origin/codex/fix-sysroot-runner-overwriting-issue-m0vpua; master is stuck at a81fed2944 (05-07) |
README: github.com/embedconsult/bootstrap-qcow2, GitHub Actions, Pages at jkridner.github.io/bootstrap-qcow2; about 140 origin/* branches from a GitHub remote; not public on Forgejo |
| cleave | installed, node cleave-node | – | none | yes | 32f9484084 (10-26): yes, on main |
none |
| crystal-bootstrap | no hook | – | – | yes | 3c8735cbca (2024-09-25): yes | weak |
| crystal-robots | installed, node crobots-node | – | none shown (note 1) | yes; trunk maps to dev |
332afb5929 (10-26): yes, on dev |
Forgejo ocx/crystal-robots every 15 min, but its default branch is main, a 2024 upstream commit; README: github.com/jadonk/crystal-robots, Pages at jadonk.github.io/crystal-robots |
| crystal | no hook | – | – | yes, no HEAD | Unresolved. 27c49be3a3 (07-07, marked as a fork on trunk) is not on master (c1aafe1cc2, 07-03) or tcl-tk; I did not fetch the other 66 branches |
upstream github.com/crystal-lang/crystal; not public on Forgejo |
| fossil-scm.org | no hook | – | – | yes | No. Newest c088cf957f (10-26); main stops at 3c8d90873e (09-17), about 39 days behind |
none |
| glint | installed, node glint-node | – | none shown (note 1) | no ("glint has no git export") | 54d10f27f3 (10-27 01:40 UTC): no export | none |
| gp-crystal | no hook | wake (old ocx release) |
– | yes | 97a74083f2 (09-21): yes, on its agent branch; trunk c452450519 is on main |
weak |
| interactor | installed, node interactor-node | – | none | yes | No. 06ca64d527 (10-22, 6:09 PM EDT) is missing; its branch session/f960dfe6… stops at a3b87b3e1f (10-21) |
Forgejo ocx/interactor, 8h; its last update (10-21 16:40:47 UTC) agrees. Check-ins cite github.com/just-kitting/interactor and "the GitHub mirror" |
| jkembedded-audio-board | installed in the old form, no node (ocx2-hook --log … %R) |
– | – | yes | bd4087922c (06-15): yes, as the upstream commit | codex/github-mention-… branches; merges of upstream/main |
| lvgl-crystal | no hook | – | – | yes | dfa6f482be (08-20): yes | README: github.com/embedconsult/lvgl-crystal, GitHub Actions and Pages |
| make-things-book | no hook | – | – | yes | 46a10a8478 (09-18): yes | merge of github/main; Forgejo ocx/make-things-book, 8h |
| mechanical-turk | installed, node node-mt | – | 1 open: 35003d31bf "Persistent chat with Slowpen", user run-c1740c5d, started, in care, started under old release 82aa2e40899f | no | a00103ff59 (10-26): no export | none |
| microblocks-smallvm | no hook | – | – | yes; HEAD is dev |
d31dc8e9ff (04-18): yes | Forgejo ocx/microblocks-smallvm, 8h |
| ollama | installed, node ollama-node | wake (old ocx release) |
none shown (note 1) | yes | c22eb96ffd (10-26): yes, on agent-tools; trunk 1f0ac30c5b is on main |
not public on Forgejo; tickets a4738213e9 and 648c77e425 plan "every served repository mirrored to GitHub through Forgejo" |
| quadesc | no hook | – | – | yes | 6b5ad22e54 (10-08): yes | README: GitHub Pages on embedconsult/quadesc |
| semantic-ui | no hook | – | – | yes | 377317a893 (2025-11-14): yes, on gh-pages |
gh-pages deploy commits from jadonk/chatgpt-web-server |
| social-badge | no hook | – | – | yes | Not verified. e399c19c2b and trunk b0e970abeb (09-21) are on branches too large for my 80 MB fetch cap; main is at f040e0ce05 (03-03) |
not public on Forgejo |
| stone | installed, node stone-node | fossil (unknown command), wake (old ocx release) |
none shown (note 1) | yes | 68156c2781 (10-26): yes, on main |
Forgejo ocx/stone pulls every 15 min from /ollama/ext/git/stone.git, then GitLab jkembedded/ocx/stone, GitHub embedconsult/stone, Xcode Cloud, TestFlight (check-in a145e39c29) |
| swk-ai | installed, node swk-ai-node | – | none shown, but anonymous can read nothing there | no (403 "not readable by this viewer"; under ollama's path: "swk-ai has no git export") | unknown (empty feed, clone refused) | unknown |
| tournament-tool | no hook | – | – | yes | 18ea48f7ec (09-20): yes | none |
| vsx-examples | no hook | – | – | yes | 2d66254cbe (02-21): yes | Forgejo ocx/vsx-examples, 8h; Forgejo also mirrors github.com/beagleboard/vsx-examples |
| webide-agent | no hook | – | – | yes | e5a0df2c04 (05-12): yes | Forgejo ocx/webide-agent, 8h |
| zepto | no hook | – | – | yes | f047068a82 (04-16): yes, on faq-wip; main is at 3f0eebced5 (03-27) |
Forgejo's mirror of github.com/beagleboard/beagleconnect-zepto has the same last-commit time, so zepto looks like a copy of it |
Notes
1. Open runs are mostly hidden from anonymous readers. Anonymous users lack forum read everywhere except mechanical-turk, and status lists only the runs the viewer can read. So "none shown" proves nothing. Older local clones show these open runs (started, no ended):
- stone (clone of 10-25): 332c8a30ba. Started 10-21 11:16 EDT with a 7-day limit, so it runs until about 10-28 11:16 EDT.
- glint (clone of 10-23): b2d65da166 and f62d622a55, 30-day Claude sessions.
- crystal-robots (clone of 10-24): 8ed286a74e, 546a05a4dd and 3c42ee4b9a, 30-day sessions.
- ollama (copy of 10-26 1:07 PM EDT): all 4 runs have ended.
- No run in these clones names a
clone.
Today the server's own node looks after these runs. Under the new design, a daemon that finds a started run not in its care posts ended lost (protocol section 10). So these 7 runs will either be ended that way or need to be moved or settled on purpose.
2. Ten hooks need replacing. Ten repositories run ocx2-hook: the nine with a node, plus jkembedded-audio-board with none. USAGE says each needs ocx2 --repository REPO hook after accepting, or nothing is exported. Three repositories also carry hooks that the new hook command leaves in place:
- The old ocx release's
wake, on ollama, gp-crystal and stone. In its last source (tools/wake.cr), it writes into old-style session wake pipes, notes posts nobody heard, and makes sure the oldocxddaemon is running. - A
fossilprogram on stone, whose command I could not see.
The old ocx release is still in use. This session is itself one of its workspaces: note b2de8b0c2c in ollama thread 682044729e (2026-10-04) made it, and its wake pipe is in this workspace. The ollama record holds many more such workspace notes, for opus, fable, agent-sol, sol-ocx, ci-ocx, build-bq2 and opus-ocx. I cannot tell which of those sessions are still running.
3. The /ext/git program the server runs now is older than this release.
- It serves any repository's export under any repository's path.
/ollama/ext/git/crystal.gitand/ollama/ext/git/stone.gitboth work. - That matches check-in b62b49520d (2026-10-06), before fix 2950d18201. The source of both aa650c80c410 and tree8 (
src/ocx/git_export.cr, lines 47–48) answers such a request with 404 "is not this repository". - Forgejo's ocx/stone pulls through exactly that cross-path URL. So once
/ext/gitruns the current or the new release's program, stone's chain to GitHub, Xcode Cloud and TestFlight stops. It needs repointing to/stone/ext/git/stone.git. - The old program would also let anyone who can read one repository fetch another repository's export. Nothing leaks today, because swk-ai has no export and every other repository already lets anonymous read code.
4. Export freshness.
- 28 repositories serve an export; glint, mechanical-turk and swk-ai do not.
- No hook refreshes the exports of the 21 repositories without one. fossil-scm.org shows the effect: it is about 39 days behind. The others are only current because nothing new arrived.
- interactor is one check-in behind even though its hook is installed; the reason is not visible from outside.
- Trunk is mapped oddly in four exports, so a reader of
main/mastersees stale work:- bootstrap-qcow2: the trunk tip went to an
origin/codex/…branch whilemasteris stuck. - board-generator: the trunk tip is on a codex branch, not
main. - zepto: the trunk tip is on
faq-wip, notmain. - crystal-robots: trunk maps to
dev, while Forgejo showsmain.
- bootstrap-qcow2: the trunk tip went to an
5. Forgejo (anonymous view, 28 public repositories).
- 12 ocx/* repositories pull the served exports: 10 every 8h, and crystal-robots and stone every 15 min.
- Anonymous users cannot see Forgejo's push mirrors to GitHub or its private repositories. ollama, cleave, glint, bootstrap-qcow2 and others are not public there.
6. Other programs in the server's extension directory:
/ext/ocx: an OCX console page./ext/agentand/ext/chat: an older chat program that needs a login./ext/crystal-robots: that project's app, which runs battles for logged-in users./ext/swk-ai: swk-ai's home page. Run under any other repository it says "swk-ai runs only as an extension of the SWK AI Fossil repository".- The OCX pages allow connections to port 8443, an older live-events stream. I could not reach that port from here.
7. swk-ai's new service. Anonymous visitors get nothing, and the clone is refused. Its status shows the hook installed with node swk-ai-node. The newest line of the shared hook log is swk-ai receiving 5 artifacts at 9:56 PM EDT on 10-26, with nothing answered. The service at /ext/swk-ai needs a login, so I could not understand it from outside. A user with read access on swk-ai, or an admin on the host, could.
8. What I could not see, and who could. Only an admin with setup rights, on the host, can see:
- the release's node state, whether its watchers are alive, and the full hook log;
- whether the old
ocxdand old-style sessions are alive; - what the extension directory's
gitentry actually is; - the full commands of
wakeandfossil; - each export's autopush (
fossil git status); chat-timeline-useron each repository.
Forum posts on 30 repositories and chat need a user with those rights. Forgejo's push mirrors and private repositories need a Forgejo admin. The new release's status page would show chat-timeline-user once it is offered as next.
9. Load I caused. The shallow git fetches pulled about 560 MB between 10:12 and 10:27 PM EDT, more than half of it from three capped attempts on social-badge. I made no writes, posts or changes on any server.
Files are in /tmp/claude-0/-var-lib-ocx-agents-opus-ocx2-projects-ollama-b2de8b0c2c6700eb5c686b1747b5aaa1e2d2d01370ac55f2e5a151a67e03b48a/3f7cfe25-28aa-4c55-827c-bc0618da81e6/scratchpad/migration:
- status/*.json
- git/*.txt
- gitobj/
- fossil-tips.json
- forgejo/search.json
- runs2.py
- ollama-copy.fossil, stone-local-copy.fossil, glint-local-copy.fossil, crystal-robots-local-copy.fossil
The clones/ directory was filled by another worker, and I left it untouched.
Survey C: swk-ai
Survey B: runs, sessions and agents in use (read-only, as of 2026-10-27 about 02:30 UTC, 22:30 EDT Oct 26)
Summary: nine v1 runs are still live, plus three sessions from the pre-v1 launcher and one remote node. The mechanical-turk and bootstrap-qcow2 sessions are already gone: their 7-day wall ended both at 21:09 UTC (17:09 EDT) on Oct 26. The swk-ai service runs on the server itself and depends on the old hook. Sessions still running under old watchers will stop receiving forum posts once the hook is replaced, and ocx2 stop will no longer reach them.
How I got it
- Fetched the anonymous status JSON for all 31 repositories.
- Cloned every hooked repository anonymously, except swk-ai, which answered "not authorized to clone". For ollama I copied the local clone and pulled it anonymously; it was already current.
- Parsed every forum post and ticket change for
"ocx": 1messages. - Asked the read-only receipt page for the capabilities of the node and run users.
- Read the old release (aa650c80c410) and tree8 at c22eb96ffd.
- Read the host's shared Claude home, which is bound into this sandbox at
<workspace>/.claude. Its session titles and first lines tie each Remote Control name to a run hash. The swk-ai service comes from that session's own transcript and memory note. - Nothing was written to any server.
Hooked repositories (status shows a node): bootstrap-qcow2 (bq2-node), cleave (cleave-node), crystal-robots (crobots-node), glint (glint-node), interactor (interactor-node), mechanical-turk (node-mt), ollama (ollama-node), stone (stone-node), swk-ai (swk-ai-node).
- jkembedded-audio-board has an
ocx2-hookwith no node. It only exports to git and has no runs. - Other after-receive hooks:
wakeon ollama, stone and gp-crystal;fossilon stone. - All node users hold only
gjorzh, orgjorz2hfor node-mt. swk-ai-node's capabilities are not readable.
One row per live run or session
| Remote Control name | Repo, run (where) | Shape / pattern | Node | process.user | Hears | Last record activity / last Claude answer | Wall ends |
|---|---|---|---|---|---|---|---|
| glint (current) | glint f62d622a55 (own thread) | Claude terminal session; Codex handoff; ends true; claude-session.md 530e05e270 |
glint-node (server) | run-4965e946 | * |
check-in 10-27 01:40Z / 01:40Z | 11-22 00:14Z |
| glint (older) | glint b2d65da166 | Claude terminal session; run-claude-terminal d97e84c1d2 | glint-node | run-f85e691a | * |
10-23 00:15Z / 10-23 00:16Z (replaced, never ended) | 11-21 12:17Z |
| crystal-robots (current) | crystal-robots 3c42ee4b9a | claude-session.md; sends Codex tasks (8 on 10-26) | crobots-node | run-3b21425d | * |
10-26 15:33Z / 15:33Z | 11-22 06:32Z |
| crystal-robots | 546a05a4dd | claude-session.md | crobots-node | run-24e9eebd | * |
10-23 01:17Z (replaced, per its own handoff) | 11-22 00:31Z |
| crystal-robots | 8ed286a74e | run-claude-codex-terminal aa6c09227a | crobots-node | run-1ab99c01 | * |
10-23 00:37Z (replaced) | 11-21 19:20Z |
| stone (v1) | stone 332c8a30ba | Claude terminal session; run-claude-terminal aabf7d12a1 | stone-node | run-af0dbe70 | * |
10-26 12:55Z | 10-28 15:16Z (11:16 EDT Wed) |
| stone (untitled; probably the one stone talks to) | stone thread e320232451, not a v1 run | pre-v1 console session opus-stone (09-24); each turn is a "Question:" woken by the wake hook |
none (pre-v1) | opus-stone | stone's posts | 10-27 01:52Z | none |
| interactor | interactor f960dfe6a8 | run-claude-terminal d97e84c1d2 | interactor-node | run-84e1b850 | * |
check-in 10-22 22:09Z; no forum posts | 11-20 15:58Z |
| swk-ai | swk-ai 9d9c6722f2 | prompt matches claude-session.md, --node swk-ai-node |
swk-ai-node | run-d208124d | (unreadable) | 10-27 01:58Z | about 11-25 15:26Z if 30d (not verified) |
| (untitled) | swk-ai 8430486bbf (thread ce79a77d39) | same objective; double start at 15:26Z | swk-ai-node | run-1b11b787 | ? | Claude idle since 10-26 16:09Z. Stone asked how to stop it at 16:18Z; outcome unknown | same |
| (no RC; MCP tunnel) | mechanical-turk 35003d31bf | one-shot ocx2 --mcp-tunnel, secret slowpen-mcp-1, run/slowpen-mcp-1 |
node-mt | run-c1740c5d | n/a | status: in_care true, release 82aa2e40899f | 11-15 15:55Z |
| cleave | cleave, pre-v1 "call" 18ec7f20e8 (10-09) | Claude --remote-control, pre-v1 launcher |
pre-v1 node 6cbe285e95 | claude-49343b | Remote Control and session messages only (last forum post handed to it: 10-11) | 10-26 10:24Z | none |
| ollama ("ocx") | ollama, pre-v1 workspace b2de8b0c2c (10-04) | this session; sandbox started 10-04 12:21Z by the pre-v1 console | none | opus-ocx2 | typed input only | 10-26 17:02Z check-in | none |
| mechanical-turk | run 4e808fdd79 | run-claude-terminal 8b024a5ebf, 7d | node-mt | run-1e0ac0ab | — | ended budget 10-26 21:09Z. A request ("send CK the link for review") was on its input line, unanswered |
gone |
| bootstrap-qcow2 | run d64fa14411 | same pattern, 7d | bq2-node | run-58530641 (also bootstrap-qcow2-agent on cleave) |
— | ended budget 10-26 21:09Z |
gone |
| remote node (cleave's aarch64) | cleave tickets | Docker container from cleave ocx-node/, ocx2 poll every 60 s, release aa650c80c410, root /opt/ocx, own r-senders.json (6h, 4096 processes) |
aarch64-1 (holds gioy) | aarch64-1-build | — | last build ended 10-26 04:53Z | — |
Runs that a new daemon would pick up at its first start
The new daemon reads everything when it starts. The hook never went back for runs it had missed.
- cleave 57c73e54e3: an edit of run 675d802896, from ec2-user. It is a
claude -psession hearing stone and ec2-user, 8h wall. It has waited since 10-14, because its user had another run in care at the time. A cleave-node daemon would start it, or refuse it if run-888413aa has no password in the new credentials file. Stop it before migrating. - bootstrap-qcow2 4bf43c40a0, 1033437e64, 51c04f65dc: addressed to aarch64-1 in a repository aarch64-1 has no clone of. They are harmless: they ask more than aarch64-1's limits allow, so they would be refused.
Patterns in use
- Tech-note 821db8ab257f on ollama, served by content hash at
/ollama/raw/HASH?m=text/plain:- claude-session.md (530e05e270)
- codex-task.md (126f7a820d): user codex-task, shares the patch, needs
y - run-claude-codex-terminal.md (aa6c09227a)
- run-claude-terminal.md, versions aabf7d12a1, d97e84c1d2, 8b024a5ebf and c5f5f12886
- Wiki pages:
- mechanical-turk
run/slowpen-mcp-1 - swk-ai
run/swk-ai(not readable from here) - ollama
run/claude - ollama
run/codex: its fence is written json `` with two backticks, so the page probably can't be read as a pattern - older pages (cleave/ollama
sandbox/claude, ollamasession/*andworkspace/*), not seen in any recent run
- mechanical-turk
- The aarch64 builds and BSP runs give their fields inline.
- The run message fields are identical in aa650c80c410 and tree8, so no pattern needs a field change.
swk-ai: the new service (from its session's own messages, 10-26 15:26 to 10-27 01:58)
- The page:
/swk-ai/ext/swk-aiis a static binary, linked into Fossil's extroot. The link points at/var/lib/ocx/release2/agents/run-d208124d/projects/swk-ai/9d9c6722f2…/bin/swk-ai, which is inside the session run's workspace; each rebuild replaces it there.index-pageis set to/ext/swk-ai(confirmed:/swk-ai/homeredirects there). It is a chat for "Bash", the Fossil userbash, who holdsC. Its rule is that it never writes the file system. The one exception is staging a photo on tmpfs, thenfossil attachment addto the wiki page "swk-ai images". - Each message is an OCX run. The page calls
/var/lib/ocx/release2/current/ocx2 --json --repository REPO --user swk-ai create MSG --pattern run/swk-ai --node swk-ai-node --title 'swk-ai/bash: …' | --to LAST.- It sends as
swk-ai, an admin login with a random password nobody keeps. This was chosen because runs sent by a user holding onlyRcannot have apasswordstep. process.useriscodex(g i o 2 4 C b m).- The agent script
ocx/swk-agentanswers withocx2 post. It sends its live steps to Fossil chat by POSTing/chat-senditself, attaches images to a wiki page, and keeps the wiki page "swk-ai interests". - The page follows a run's steps on
/chat-polland shows the answer from the forum. Today the server's node acts at once; answers came back in about 5 s.
- It sends as
- Greeting scheduler: a long-lived process the page starts on the server, as Fossil's CGI account. It sends greeting runs at 5:50 and 14:50 Detroit time and exits after 24 hours with no visits. It is found by scanning processes.
What each needs under the new design
Every node user (glint-node, crobots-node, stone-node, interactor-node, node-mt, bq2-node, cleave-node, ollama-node, swk-ai-node):
- Grant
C,4andw, since they hold only gjorzh. - Add
ywhere Codex tasks share their patch: crystal-robots, glint, ollama, possibly swk-ai. - Set a password by hand.
approvenever changes a user it did not make. - Give each a nodes.json entry with a new clone made over HTTP, and set
chat-timeline-useron each repository.
Every session restarted under the daemon:
- It becomes a new run, a new Claude conversation and a new Remote Control name.
- Its run user's password must be set by an admin and put under
runsin the credentials file.createmakes run users whose password is never shown.
Live sessions under old watchers. From reading the code; not tried.
- The new daemon skips any run whose lock is held (daemon.cr:
next unless Node.care(...).none?). - The old hook was what fed their inbox and signalled stops.
- So after the hook is replaced, these sessions get no forum posts and no Codex
endednotices, andocx2 stopwill not reach them. They keep running until their wall, still reachable by Remote Control. - If the host reboots, the new node never answers them
lost. Theirstartednames the served repository's server-code, sostarted_here?is false. Whether a stop then works is not tested. - Order: stop the replaced sessions (glint b2d65da166, crystal-robots 8ed286a74e and 546a05a4dd, swk-ai 8430486bbf) and cleave 57c73e54e3 while the old hook still runs.
- Do not prune the release directories these sessions bind: 69ac27743041, 841a4853d5ff, 3869da228e7d, 82aa2e40899f.
Per row:
- stone v1: ends Wed 11:16 EDT anyway. Restart it under the daemon if wanted.
- opus-stone: depends on the pre-v1
wakehook.ocx2 hookkeeps other hooks, but wake is OCX code running on the server, against the design. Keep wake, or move opus-stone to a v1 session: a decision for stone. - mechanical-turk and bootstrap-qcow2: need new session runs. Use a longer wall than 7d.
- mechanical-turk tunnel: if restarted, set
slowpen-mcp-1again withocx2 --repository CLONE secretin the daemon's clone. The served repository's setting is never cloned. - cleave session and the ollama session: neither depends on the v1 hook, so no change is needed.
- aarch64-1: keeps working after accept. Its old
polluses only the receipt page, and receipt.cr is byte-identical in both releases. To move it to the daemon:- nodes.json and the daemon replace
ocx-node.sh; its credentials file format is the same. - add
C,4andw. - bump
OCXVERin the image.
- nodes.json and the daemon replace
- swk-ai:
- Move the CGI binary out of the run workspace before the session run is replaced.
- Put
codex's password in swk-ai-node's credentials fileruns. - With
chat-timeline-userset, timeline lines go into the same chat room the page follows and Bash can read. The page must ignore that user's lines. createon the server no longer acts at once, so answer time grows by the daemon's wake, pull and start. Measure it.- Check the fields the page parses from
create --json. - The greeting scheduler is a server-side process: a decision for stone.
- Runs as
codexqueue behind each other: one run per user in care, which stone already accepted.
What I could not see, and who could
- Whether the old watchers and sandboxes are alive, other than node-mt's tunnel.
- The node directory locks, hook.log, the passwords files, and the
chat-timeline-usersettings. - The extroot link target and the greeting scheduler process.
- Anything on swk-ai's record, including
run/swk-aiand swk-ai-node's capabilities. - The aarch64 container's state.
Root or ec2-user on the server host could see these with ps, the files, fossil setting, and ocx2 status as setup, which lists in-care runs and their processes. A swk-ai admin login could read the swk-ai record, and the aarch64 machine's owner the container.
Another workflow agent is writing into the same scratchpad/migration directory and overwrote my runs.py, so my files are under b/.
Files are in /tmp/claude-0/-var-lib-ocx-agents-opus-ocx2-projects-ollama-b2de8b0c2c6700eb5c686b1747b5aaa1e2d2d01370ac55f2e5a151a67e03b48a/3f7cfe25-28aa-4c55-827c-bc0618da81e6/scratchpad/migration/:
b/parse.pyb/runs.pyb/dump/b/swk-assistant.txtstatus/clones/
Survey D: other dependencies
Survey D, read-only, done from outside on 2026-10-27 between 02:05 and 02:35 UTC (22:05–22:35 EDT on Oct 26). I wrote nothing to any server.
Sources: anonymous pages and status/receipt/questions JSON for all 31 repos; git ls-remote of every export plus shallow fetches of their branch heads; GitHub, Forgejo and GitLab ls-remote; the Forgejo repo-search API; copies of anonymous clones (10 repos; swk-ai refused); aa650c80c4 source and docs read from the ollama clone. Working files are in /tmp/claude-0/-var-lib-ocx-agents-opus-ocx2-projects-ollama-b2de8b0c2c6700eb5c686b1747b5aaa1e2d2d01370ac55f2e5a151a67e03b48a/3f7cfe25-28aa-4c55-827c-bc0618da81e6/scratchpad/migration/ (d/, status/, git/, gh/, gitprobe/, stone-tree/).
Nothing showed swk-ai anonymously. What I know of its service comes from local copies of its dev run's session record, which a sibling survey left in scratchpad/migration/swk-session-text.txt and swk-tools.txt. I did not see the swk-ai repository itself.
Rows: one per service or dependency
| # | Service / dependency | Who relies on it | Today (evidence) | What the new release changes | Migration step |
|---|---|---|---|---|---|
| 1 | Git exports written by OCX's hook | Forgejo mirrors, and through them GitLab, GitHub, Xcode Cloud and GitHub Pages | 10 repos carry ocx2-hook: bootstrap-qcow2, cleave, crystal-robots, glint, interactor, jkembedded-audio-board (export-only, no --node), mechanical-turk, ollama, stone, swk-ai. Of these, glint, mechanical-turk and swk-ai have no export. The export matches Fossil's branch leaves on stone 32/32, ollama 442/442, bootstrap-qcow2 165/165, cleave 4/4 and crystal-robots 33/33. Interactor is already behind: check-in 06ca64d527 (2026-10-22 22:09Z, branch session/f960dfe6…) is in Fossil but not in the export, whose head there is still a3b87b3e1f (10-21 16:40Z). Forgejo's ocx/interactor last update also reads 10-21T16:40:47Z. |
The hook becomes Fossil's own %F git export --if-mirrored -R %R. USAGE says that after accept, ROOT/ocx2-hook --log … %R runs the new CLI, which rejects those arguments: nothing is exported until ocx2 --repository REPO hook is run on each of the 10 repos. The new export runs on every arrival, posts included, not only check-ins (ollama has 442 branches). |
Re-run hook on all 10 right after accept. Time an export on an ollama copy first. Interactor's gap should clear at the first export after the reinstall. |
| 2 | Git exports with no hook (21 repos) | Forgejo ocx/* mirrors at 8 h intervals: armbian-build, BeagleBadge, badge-launcher, battlesnake-rules, bb-imager-rs, make-things-book, microblocks-smallvm, vsx-examples, webide-agent | Current, since nothing new has been checked in. Exception: fossil-scm.org's export stops at 2026-09-17 while Fossil has check-ins from 10-26. Something on the host keeps pulling that repo; no mirror reads its export. | None. With --if-mirrored, installing the hook on these is safe. |
Optional: install hook on them so the exports follow future check-ins. |
| 3 | The program that serves /ext/git |
Every export reader | Behaviour matches the old ocx v1 release (/var/lib/ocx/release/current/ocx-cgi, built 2026-10-02), not ocx2. /stone/ext/git/zzz.git answers "zzz has no git export" with a bare 404 status line, which matches v1's git_http.cr. ocx2 since 2950d18201 (10-06) would answer "zzz is not this repository". /stone/ext/git/ollama.git is served. Forgejo ocx/stone pulls https://ollama.openbeagle.org/ollama/ext/git/stone.git, a cross-repo URL. git-next is not present. |
Nothing, as long as git stays on v1. ocx2's git program, in aa650c80c4 and in the tree, refuses cross-repo names. If git is pointed at ocx2, the stone → Forgejo → GitLab → GitHub → Xcode Cloud chain stops. |
Before retiring v1 or repointing git, change Forgejo ocx/stone to /stone/ext/git/stone.git. |
| 4 | GitHub mirror of crystal-robots | GitHub Pages (jadonk.github.io/crystal-robots) | github.com/jadonk/crystal-robots matches the export on all 33 shared heads (dev 2690b21326, main 87e8f0c9be); GitHub also has 2 branches of its own. Path: export → Forgejo ocx/crystal-robots (15 min) → Forgejo push mirror → GitHub (per the crystal-robots forum). |
Stalls with row 1 until the hook is reinstalled. | Same as row 1. |
| 5 | GitHub mirror of stone | Xcode Cloud and TestFlight builds of the Stone app | Export main cec5772bc7 is the same commit on Forgejo ocx/stone, GitLab jkembedded/ocx/stone and github.com/embedconsult/stone (32/32 heads). Commits carry FossilOrigin-Name, which Stone's build stamp reads. |
Same as rows 1 and 3. | Same as rows 1 and 3. |
| 6 | Other GitHub repos named in forums | None of them follows the export | just-kitting/interactor, BeagleBadge, embedconsult/social-badge, beagleboard/smallvm and embedconsult/bootstrap-qcow2 are upstreams or separate lineages; their heads differ from the exports. | — | — |
| 7 | Remote node aarch64-1 | cleave's Claude session claude-49343b (holds R), which sends cleave ticket runs (puser aarch64-1-build); also bootstrap-qcow2-agent |
Runs in a Docker container from cleave trunk ocx-node/ (Dockerfile, ocx-node.sh, docker-compose.yml, restart: unless-stopped). It builds ocx2 at OCXVER=aa650c80c410 and runs ocx2 poll every 60 s, with the clone at /data/aarch64-1.fossil and r-senders.json from ocx-node/. Only cleave is watched. Clone code in every started/ended report: d3448bfaf66fa0756d219fa0683a687590720525 (cleave's server code is 6cbe285e95…). About 40 runs, 10-19 to 10-26; the last ended 10-26 04:53Z; none are open in my copy. Reports are pushed with ocx-message tags. Node user caps on cleave: gioyjrzh. It has no C, 4 or w. |
poll is removed (commands/poll.cr); the replacement is ocx2 daemon NODES under a service manager. The node user needs goC4w, and w matters here because reports go through Fossil's ticket pages. An admin must set chat-timeline-user on cleave. Accepting the release on the server does not break this node: poll needs only the unchanged receipt page (receipt.cr is identical in both releases). |
Change cleave's ocx-node/ files: daemon, nodes.json, new OCXVER. Give aarch64-1 C, 4 and w. Set chat-timeline-user on cleave. Docker's restart policy is not systemd's KillMode=process: when the daemon exits, Docker restarts the container and kills running watchers and builds. So pick another supervisor inside the container, or accept runs going lost at each restart. |
| 8 | Runs to aarch64-1 on bootstrap-qcow2 never answered | run-58530641 | Runs 4bf43c40a0, 1033437e64 and 51c04f65dc (10-19 to 10-22) name node aarch64-1, which has no user and no clone on bootstrap-qcow2. They have no started or ended. |
A daemon reads the whole record at start, so adding a bootstrap-qcow2 entry for aarch64-1 would decide these old runs. | Stop or close them before adding such an entry. |
| 9 | Retired node user aarch64-builder (cleave) |
none | Refused 2 runs (10-13, 10-16); caps iogjrzh. |
— | Can be dropped. |
| 10 | swk-ai service (/swk-ai/ext/swk-ai) |
the person shown as SWK/Bash (login bash); the maintainer |
Live: home redirects to /ext/swk-ai, which needs a login. On other repos it answers 403 {"error":"swk-ai runs only as an extension of the SWK AI Fossil repository"}. swk-ai is private: no anonymous clone, /ext/git 403, and the repo has no export. OCX's hook (--node swk-ai-node) logged its most recent run on swk-ai at 01:56:44Z, with 5 artifacts. From the dev run's session record: a static Crystal CGI, symlinked from the shared extroot to /var/lib/ocx/release2/agents/run-d208124d/projects/swk-ai/9d9c6722…/bin/swk-ai, which is inside the dev run's workspace (run 9d9c6722f2 on swk-ai-node). It reads the repo database read-only. It sends each message as a run with /var/lib/ocx/release2/current/ocx2 --json --repository … --user swk-ai create … --pattern run/swk-ai --node swk-ai-node --title "swk-ai/bash: …", using an admin login swk-ai because R-only senders may not have a password step. A scheduler process it starts itself (found through /proc, exits after 24 h idle) sends greeting runs at 5:50 and 14:50 Detroit time. Pattern run/swk-ai: run user codex (g i o 2 4 C b m), password step, wall 1 h, remove_on: saved. The agent posts from its clone, sends live steps to /chat-send with a Referer, and attaches images to wiki page "swk-ai images". The page long-polls /chat-poll and reads the forum. |
Needs a daemon node for swk-ai-node, since create on the server no longer acts at once (its output also drops acted, and --node becomes required; swk-ai already passes it). Needs chat-timeline-user on swk-ai. The codex password must be supplied by an admin in the daemon's credentials file, because the old node reset it to an unknown value. Once chat-timeline-user is on, timeline rows land in the same chat the page polls. |
Move the live binary to a stable path outside any run workspace before moving or ending run 9d9c6722f2. If that run ends with remove_on: saved, or moves off this host, the site goes down. Set a known codex password and put it in the credentials file. Check that the page ignores timeline-user rows in chat. |
| 11 | Stone app (iOS, 16 repos on the phone, including SWK AI) | the maintainer's phone login stone, which holds a…C… on most repos and lacks C on glint and mechanical-turk |
Keeps full clones and syncs them with embedded Fossil 2.26. Since 76bbab50bc (10-25) it wakes a sync through Fossil's /chat-poll (RemoteWake.swift, docs/chat-poll-wake.md). That needs chat-timeline-user, not set yet according to the 10-25 post. It uses no OCX pages in code apart from dead v1 endpoints: /ext/ocx/status (403) and /ext/chat?merge_review= (TicketOpener). The old SSE on :8443 is gone: the port refuses connections, and 25 repos' default-csp still list it. "Verify This Build" writes audited tags from the phone. Its stated needs (docs/ocx-message-needs.md, R1–R6): a versioned schema with fixtures; exactly one ended per run, readable from the clone; questions as messages; offline-writable actions; a fixed receipt JSON; and an optional per-thread live state. |
Turning on chat-timeline-user makes Stone's wake work too. Watcher reports (started/ended) carry no ocx-message tags in the new release. Stone's plan (forum fcb8ac6d69) finds messages through tagxref, so it would miss them. That reader is not built yet. The kind response is now decision, while Stone's doc still says response. Builds stall until row 1 is done. |
Tell Stone that reports are untagged and that decision replaced response, or keep tagging. Give stone C on glint and mechanical-turk if those should wake. |
| 12 | receipt page |
Stone's planned reader, new daemons, aarch64-1's poll, clones' post --decision |
Answers anonymously (fields artifact, received, sender, receipt) and gives capabilities through capabilities_of. |
Code unchanged, but every daemon now depends on it for run-work. | Time it under load. |
| 13 | questions / console pages |
the maintainer: ollama decisions by ec2-user, 10-22 15:19–15:22Z | Anonymous GET works: questions?json=1 answers for nobody; console returns 200. Console buttons POST to /ext/ocx2-cgi/post. |
questions and post are unchanged. console reads runs from the record only, and its JSON node becomes nodes (an array). status on the served page loses in_care, offer and hook.last, and gains chat_user and the daemon's round. The maintainer's web view of what a node is doing goes away; it lives only on the agent machine. The backlog's open question about removing the CGI write forms would, if taken, break console buttons and the page form of create. |
No step needed. Tell the maintainer where live care moves. |
| 14 | Imports | maintainer, setup | Not visible anonymously. aa650c80c4's status shows no imports at all; the setup-only list and the detached import arrive with the new release. Repos whose export kept the upstream's own commits (crystal-robots, interactor, BeagleBadge, jkembedded, quadesc) were imported; quadesc (imported 10-08) has no hook. |
A page import is detached and logs to node/import.log, and the new repo gets the new export hook. |
The host or a setup user should check /var/lib/fossil for anything left by the failed beagleboard-org import of 10-21. |
| 15 | MCP tunnel run "Slowpen" (mechanical-turk) | an outside agent through OpenAI's Secure MCP Tunnel | Run 35003d31bf, in node-mt's care, on old release 82aa2e40899f; wall 30d, started 10-16 15:55Z. Uses secret $$secret:slowpen-mcp-1$$. |
Secrets set on the served repo do not reach a daemon, because settings don't sync. They must be set on the node's clone. No page shows the value. | Whoever holds the tunnel key sets it on the node clone, or a new key is issued. |
| 16 | Old v1 hook wake |
v1 sessions woken through FIFOs: opus-ocx2 on ollama (this coordinating session; its FIFO is …/wake, created Oct 4), opus-stone on stone, and an idle session on gp-crystal |
status lists wake among other hooks on ollama, stone and gp-crystal. The program is /var/lib/ocx/release/current/wake. |
hook and unhook leave other hooks alone. |
Part of moving everything over: these become ocx2 session runs. Move opus-ocx2 last, since it coordinates. |
| 17 | Unknown hook fossil on stone |
? | status shows only the program name. | Left in place. If it is a second fossil git export, two exports will run. |
The host should run fossil hook list -R /var/lib/fossil/stone.fossil. |
| 18 | Old v1 pages /ext/ocx, /ext/agent, /ext/chat, /ext/docs |
skin menus ("Agents", "Docs") on 20 repos; Stone's TicketOpener |
/ext/ocx returns 200 ("OCX console"); /ext/agent, /ext/chat and /ext/docs return 403 to anonymous. |
Not touched by accept. | Retire them with v1, and drop the menu links then. |
| 19 | Project apps in the shared extroot: /ext/crystal-robots, /ext/gpcr/ |
their users | Both answer 200. I found no OCX use. | — | Keep in the extroot. |
Notes
What I could not see, and who can:
- Server host:
- extroot contents and symlink targets: which program
gitandswk-aiactually are; - full hook commands (including stone's
fossil); - whether
chat-timeline-useris set (the newstatuswould show it); ROOT/node/hook.log,import.logand care;- each repo's
last-git-export-repoand why interactor's export missed06ca64d527; - the cron that pulls fossil-scm.org;
- v1
ocxdandwakeprocesses; - the
ocx-secret-*settings.
- extroot contents and symlink targets: which program
- A setup user:
export --dry-runon interactor (shows the last failure), the import list, and swk-ai's records, run9d9c6722f2's pattern and wall, andswk-ai-node's capabilities. - The maintainer: the aarch64 machine itself, and the Forgejo and GitLab push-mirror settings (the Forgejo push-mirror API needs a login).
Inferred, not proven: that /ext/git runs v1's ocx-cgi. The evidence is the refusal text and the bare 404 status line. One ls -l on the host settles it.
Timing hazards for the user's "migrate at the same time" request:
- Exports stop at accept until
hookis re-run on each of the 10 repos (rows 1, 4, 5). - swk-ai's live binary sits in a run workspace (row 10).
- A first daemon start acts on old unanswered runs (row 8).
- Docker restarts kill aarch64-1's watchers (row 7).
aarch64-1 and Stone keep working after accept; swk-ai's runs, and every other run that needs a server node, stop until their daemons exist.