Login
OCX: unaudited
Login

← list

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)
entry point cgi login nobody capabilities ghjorz (g: clone, o: check-out) repository /var/lib/fossil/cleave.fossil dir /var/lib/fossil root /var/lib/ocx/agents-daemon remote

answer

result

Added project description and targets for Cleave. 2. 7c58d420d0abd0ced5d0956c7e7025db534b1a6460fa960c0f43eeb7a4e7f506 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Add phased plan for the BeagleY-AI voice image

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 3. 1c084721b08251326e39620222fca84698a97eb9d529b6358018dd7e5d577696 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Plan: record chosen speaker and mic; note mic bias check

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 4. cf898bb4230039e91d03837b2b43769b89fd0c11f15d5c2a360b46398fd0989f - branch: task/18ec7f20e8 - user: claude-49343b - comment: Plan: use upstream Armbian as the BeagleY-AI BSP for a generic aarch64 BQ2

Correct the TAC5112 finding: tac5x1x-i2c.c is in beagleboard 6.12 (just not enabled) but not in mainline.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 5. cc70989f267bd59cabddebde04291922b0a5e36d9ee4d2ff837a98072cfbd6ff - branch: task/18ec7f20e8 - user: claude-49343b - comment: Add Armbian userpatches extension for JK Embedded Audio Board drivers

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 6. 3a02733fea41cc75a73de0a27253eba0ea4f0f14f6198d895cb6809a5c103ffa - branch: task/18ec7f20e8 - user: claude-49343b - comment: Plan: BQ2 builds the BeagleY-AI boot chain and kernel; Armbian is reference only

Add bsp/beagley-ai/manifest.md (versions, patches, U-Boot passes, binman gap) and a kernel config fragment for the audio board; drop the Armbian userpatches overlay. Record confirmed MICBIAS routing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 7. 833782f37cd4e196d3ac5b5a333d59489b99b7310421af9af6a2a1d0295fb7a1 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Start the Crystal replacement for U-Boot binman on K3: FDT and DER

src/cleave/fdt.cr reads and writes flattened device trees; src/cleave/der.cr encodes and parses ASN.1 DER. tools/fdtdump.cr and tools/derdump.cr inspect FIT images and TI x509 certificates (checked against Armbian's BeagleY-AI tiboot3.bin, tispl.bin and u-boot.img).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 8. c4393f68e30aa5267a1d85662614bc6f687398378d926eece147c35aeee14484 - branch: task/18ec7f20e8 - user: claude-49343b - comment: TI K3 x509 certificates in Crystal (ti-secure, ti-secure-rom)

src/cleave/ti_x509.cr encodes the certificates binman builds through openssl config templates; src/cleave/rsa_key.cr signs with sha512WithRSA through libcrypto (LibreSSL in BQ2). Serial and dates come from the content and SOURCE_DATE_EPOCH, so output is reproducible.

spec/reference_spec.cr rebuilds every per-image certificate in Armbian's BeagleY-AI tispl.bin: identical apart from serial, dates and signature. spec/fixtures/custMpk.pem is TI's public test key from U-Boot.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 9. f2255c1ad7f518c6411915cf8b64bf39c06ac5b1ad967a4ad4b8c66c0a32983b - branch: task/18ec7f20e8 - user: claude-49343b - comment: TI K3 board config compiler in Crystal; check tiboot3.bin against binman

src/cleave/ti_board_config.cr compiles board/pm/rm/sec-cfg YAML against schema.yaml and packs combined configs. For BeagleY-AI it produces the same bytes as binman for both combined-tifs-cfg and combined-dm-cfg, and the combined ROM certificate matches apart from serial, dates and signature (spec/reference_spec.cr, run with CLEAVE_REFERENCE and CLEAVE_UBOOT).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 10. 64dc61c8f7e37f6394c674aee3ebbf329f7a5f5d422086520660ef1db453c35f - branch: task/18ec7f20e8 - user: claude-49343b - comment: Binman interpreter in Crystal for TI K3 images

src/cleave/binman.cr builds the images in a device tree's /binman node: templates merged as dtoc does, sections, blobs, U-Boot/TF-A/OP-TEE/DM file entries, ti-board-config, ti-secure, ti-secure-rom and FIT with hash values. Unsupported layout, compression and FIT signing are refused, not ignored.

spec/binman_spec.cr describes BeagleY-AI's /binman (k3-binman.dtsi plus the board dtsi) and rebuilds tispl.bin, u-boot.img and tiboot3.bin from payloads taken out of Armbian's binman-built images: all payloads are identical, and tiboot3.bin differs only in its certificate.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 11. 7cc3a0f893fb59a9fce1bdacb7ad39f4f1a5f409eba108137c9ca21c0ad83180 - branch: task/18ec7f20e8 - user: claude-49343b - comment: cleave-binman command line, compatible with U-Boot's binman invocation

Accepts the arguments U-Boot's Makefile passes to tools/binman/binman. Run on the real /binman node of Armbian's BeagleY-AI u-boot.dtb, it rebuilds tispl.bin and u-boot.img with the same images, configurations and payloads. docs/cleave-binman.md covers use, scope and how it was checked.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 12. 8030f680a559d107f57e09e3a541db1fe273618206a9f2362faeaf82756f55a0 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Plan and manifest: binman is replaced by cleave-binman; note flex/bison path

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 13. 9d257d40a0ff6736a83771ad78d74fdabfef6fd7835400d8f332e1b9b00d0555 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Plan: aarch64 build host is fossil.openbeagle.org, pending the OCX hook

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 14. e97a0f4ae819de055415481d566175f31cebecbd14ced9650a02ded05b311181 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Streaming tar reader that keeps ownership, modes, links and devices

Reads the 540 MB bq2-rootfs-0.4.0-arm64 seed in about 19 s with entry counts matching tar's listing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 15. 94e56acdb86c7968470743443e39668e25e41f8c65029eb10032f71184c0aa4c - branch: task/18ec7f20e8 - user: claude-49343b - comment: Rootless ext2 writer that copies a tar archive into a filesystem image

src/cleave/ext2.cr writes ext2 rev 1 (4 KiB blocks, 256-byte inodes, sparse superblocks, filetype dirents) directly into a file region, streaming file data. Keeps tar ownership, modes, hard links, fast and slow symlinks and device nodes. A test tree with a double-indirect file, 400-entry directory, hard link, setuid file and both symlink kinds passes e2fsck -fn 1.47.1 cleanly, and debugfs rdump matches the source.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 16. e4eb50d02a26a1484b7921248cb7a8795f7cb478cc720d0b9f7e3aa226fc96a4 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Rootless FAT16 writer with long file names for the boot partition

src/cleave/fat16.cr writes FAT16 (two FATs, 512-entry root, volume label, VFAT long names, subdirectories) into a file region. A 128 MiB test image passes fsck.fat 4.2 with no messages, and pyfatfs reads every file back, long names included.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 17. 995f1e22f784919503a6310261b1fa50fb718564d56b1b4e91f16c84551f06f7 - branch: task/18ec7f20e8 - user: claude-49343b - comment: cleave-image: rootless SD card image writer (MBR, FAT16 boot, ext2 root)

With the BQ2 0.4.0 arm64 seed and Armbian's BeagleY-AI boot files it writes a 3.2 GiB image in about 14 s; the FAT partition passes fsck.fat, the ext2 root passes e2fsck -f, and two runs with the same SOURCE_DATE_EPOCH are byte-identical. Kernel and extlinux.conf go on the boot partition because U-Boot's bootflow scan only searches bootable partitions. local/ is ignored for uncommitted secrets such as Wi-Fi settings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 18. 3c8633a2c8880690d85ed7405882bf2ca91fc2cefed41d2e19f4d9882ce695e9 - branch: task/18ec7f20e8 - user: claude-49343b - comment: cleave-init: a Crystal PID 1 that supervises services

Mounts the configured filesystems, remounts / rw, sets the hostname and supervises services from /etc/cleave/init.yml: dependency order (oneshots must succeed), restart with doubling back-off, per-service logs, orphan reaping (pruning Crystal's pending child statuses), and busybox-compatible shutdown signals ending in reboot(2). Falls back to /bin/sh on fatal errors.

spec/init_spec.cr runs it as PID 1 in user/PID/mount/UTS namespaces: order, restarts, failed dependencies, no zombies, and power-off all check out.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 19. af95bff43fd372f8d583bf33177c7f9806c7a1056ff8bb0fe5ffd73062f6b3ac - branch: task/18ec7f20e8 - user: claude-49343b - comment: ext2: later layers replace files, symlinks and devices from earlier ones

Replaced names are unlinked and, once no name refers to them, their blocks and inode are freed. A two-layer test (replaced 3 MB file, symlink replaced by a file, one name of a hard link replaced) passes e2fsck -fn. tools/mkext2.cr now takes several archives.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 20. 483e80e4e8195c48e151aea2bdeeb54352ac4646bda8f71d60923ba4badfb7b9 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Root layers from directories, PARTUUID placeholders, /boot by root disk

cleave-image: --root-dir adds a directory as a root-owned layer, in order with --root archives; @BOOT_PARTUUID@/@ROOT_PARTUUID@ in boot files become the MBR PARTUUIDs (for root=PARTUUID=...). cleave-init: mount source root-disk-partition:N names partition N on the disk holding /, so /boot is found on mmcblk0 or mmcblk1 (specced against a fake sysfs).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 21. f333ef8aabbbce62468d301c9dabbadb33c2b3463fd7fb2e5d82e608fbbbddf1 - branch: task/18ec7f20e8 - user: claude-49343b - comment: BeagleY-AI image content and build script

image/beagley-ai/boot: extlinux menu (cleave-init, busybox init, rescue shell) with root=PARTUUID. image/beagley-ai/rootfs: init.yml (mdev, syslog, serial root shell, DHCP, NTP), passwd/group/shadow, udhcpc script, and an ld-musl path that fixes the 0.4.0 seed's missing libunwind directory. tools/build-beagley-ai-image.sh cross-compiles cleave-init for aarch64 musl against the seed's libraries and assembles the image; an end-to-end run with Armbian's boot files and a placeholder kernel passes fsck.fat and e2fsck.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 22. 27c78329ac0b9ad9af4d6d784b8bd59d5130578981f64cd77faec3bae0ca2600 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Plan: Phase 1 status

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 23. 4b71fc6133733fefefd92fa356156ba7bab10d57ab6a2102526f832d6fa95231 - branch: task/18ec7f20e8 - user: claude-49343b - comment: cleave-init config is JSON: /etc/cleave/init.json

Requested in the thread (75db098451): JSON is the more familiar syntax. Config, Mount and Service take an optional "comment" field since JSON has no comments. cleave-init no longer links libyaml. The board config inputs to cleave-binman stay YAML, as U-Boot defines them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 24. 6e2aff85e791373b95801d0ab2bab9c6520cac54d356e06906484d02c8b38f5d - branch: trunk - user: jkridner - comment: Add fossil.openbeagle.org docker builds 25. ca8ad579212d9f6160a3dc37daa140c41ab1427837df76e653d840fd0b21627a - branch: task/18ec7f20e8 - user: claude-49343b - comment: Merge trunk: aarch64-builder Dockerfile for fossil.openbeagle.org

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 26. cee7d0d2c7033ca663482312584954a76ba96fb1c3cddfae4ffcfe17c6bf978b - branch: task/18ec7f20e8 - user: claude-49343b - comment: aarch64-builder: serve fossil.openbeagle.org as OCX protocol v1 nodes

Dockerfile: Fossil (static) plus ocx2 built with Crystal 1.18.2 from OCX's ocx2 branch (OCXVER), laid out as an OCX release; a runtime on Alpine with bubblewrap and the build tools runs see (Crystal/shards, clang/lld/LLVM, gcc, make, git, curl and BQ2's libraries); Fossil serves /museum with --extroot /ocx/ext for OCX's page. ocx-entrypoint.sh: accepts the image's release on first use (later images only stage it as next for an admin), installs the hook as each REPO:USER node in OCX_NODES acting as OCX_ADMIN, then execs fossil server. docker-compose.yml: the ocx volume, OCX_NODES/OCX_ADMIN, and the seccomp, apparmor and systempaths relaxations bubblewrap needs, without --privileged. README.md: host requirements, making a repository a node, caveats.

Checked outside Docker: first start, idempotent second start, and a v1 command run that got started and ended (exited, 0) as the node user.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 27. f564ac8e340e747b6906c852639a2d854bb1b166b58ed5128dc5f1398ad2bb31 - branch: task/18ec7f20e8 - user: claude-49343b - comment: aarch64-builder: use Alpine's Crystal instead of pinning 1.18.2

Asked in the thread (3a7f52f7d4): OCX can be more flexible with the Crystal version. The separate download stage is gone; ocx2 builds with Alpine's crystal and shards, passing --ignore-crystal-version past OCX's shard.yml pin, and runs use the same packages.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 28. 46154eb9c0e9a3223d0e4efef1d2a54577a3ef3ca9e697e15fdd1f8fe16e4d7b - branch: task/18ec7f20e8 - user: claude-49343b - comment: aarch64-builder: drop --ignore-crystal-version, which shards ignores

Current shards only warns about a shard.yml crystal pin.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 29. eae1801a75cd28bd7116d0899a25c19838841070695f836dc7896eb6010b0ad1 - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: BeagleY-AI image tools, cleave-init, and the OCX v1 aarch64 builder

Brings to trunk: cleave-binman (Crystal replacement for U-Boot's binman on TI K3), cleave-image (rootless MBR/FAT16/ext2 SD image writer), cleave-init (Crystal PID 1 with JSON config), the BeagleY-AI image layer and build script, the phased plan and BSP manifest, and aarch64-builder updated to serve OCX protocol v1 nodes. crystal spec: 20 examples, 0 failures.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 30. ff236dc16f1cb6e1adb0be68c5cd46e5169e6727fd594998b90c85217654e931 - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node: a self-contained OCX v1 build node; restore aarch64-builder

aarch64-builder/ goes back to the user's original fossil.openbeagle.org server (6e2aff85e7): that server's job is serving its repositories.

ocx-node/ is separate and serves nothing: Alpine 3.23 packages (Fossil 2.27, Crystal 1.18.2, bubblewrap, build tools) plus ocx2 built from OCX's ocx2-v1-completion branch. ocx-node.sh clones OCX_SERVER once with the node user's credentials, runs ocx2 node --check until it succeeds, then ocx2 node every OCX_EVERY seconds. The credentials file stays out of the repository.

Checked outside Docker against a scratch server serving OCX's receipt page: an admin's run was picked up on the next sync, run under bubblewrap, and its started and ended (exited, 0) reached the server as the node user.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 31. c0990b366659a4fb1e1d557846ab0aae5f4cae36351551bd8df75014b1675a70 - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node build node; aarch64-builder restored

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 32. 4006c997ab5604210a61fd50d077318fa20049e8f10be46143493d3987ed76be - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node: setup makes the node's logins on the server

'ocx-node setup' signs in with an admin login given once, makes aarch64-builder (the build machine) and builder (what builds run as) on the server through Admin > Users with random passwords and capabilities o and i only, checks each can sign in, and keeps the passwords only in /data/ocx-node.json (0600). No hand-made credentials file any more. README explains both logins plainly. Tested against a local server.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 33. ec217557fea86c2acb59cb6d64bc43df908e509454978b49da8b09206f297074 - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node setup makes its logins

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 34. 331de53b21adce67c40c76e9ce8bdca9f758d2e3cb9b93cfb5c3e7f4b5a4a81b - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node: no admin credentials in the container

setup no longer signs in as an admin or makes accounts on the server. The two ordinary accounts (aarch64-builder, builder: Check-Out and Check-In only) are made on ollama.openbeagle.org in Admin > Users; setup asks for their passwords, checks each signs in, and keeps them only in /data/ocx-node.json inside the container. Tested against a local server with right and wrong passwords.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 35. ea63912543ef2e3c4c60ffa8382d2a99de07151b4bc51ee257ccfafbde0dce3a - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node holds no admin credentials

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 36. 86a3215b285c3c05ac84d7ce205397610dcf2fe7961c07da5baa5b8bfc8491ee - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node README: copying an existing ocx-node.json into the data volume

For anyone who followed the earlier README and put the passwords in a host file. ocx-node/ocx-node.json is ignored again so it is never committed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 37. a77b61a80eb58f1bb0796282db3aa98ec95cd63153ed8eaeafd873d5fdf3557d - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node README fix

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 38. 9e061504f13d6b89ee8a270747afc3b2036de15802e9831f148dca4f99662ab8 - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node README: drop the one-time migration note

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 39. 99feab872a937f9ec065663a30f0ca742a787bd3f3b451fa473534485e71c6a8 - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node README

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 40. 9518429b43efe9d40d9c3078ba51e9c6037221de6d82f781b4fec0290a52dc80 - branch: task/675d802896 - user: run-888413aa - comment: ocx-node: follow OCX protocol v1 as served; a run pattern for aarch64 builds

The node was built from OCX's ocx2-v1-completion branch, whose run format ("runner", "command") v1 as reimplemented no longer reads. The Dockerfile now pins ocx2 to the release ollama.openbeagle.org serves (3d4263c784b6). run-aarch64.md holds the fields of a build on aarch64-builder (workspace, bubblewrap sandbox fit for Alpine, process as builder), for ocx2 create with --pattern; the README says how to send one and what comes back.

Checked outside Docker against a scratch server serving OCX's CGI: a run written from the pattern was pulled by ocx2 node, ran under bubblewrap, and its started, output and ended (exited 0) reached the server as aarch64-builder.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

41. **51841621f2dfdf942634f3f0cb4ca6d7b7cba7ccdf54ba366626f0832c30211b**
    - <span class="ocx-k">branch</span>: trunk
    - <span class="ocx-k">user</span>: run-888413aa
    - <span class="ocx-k">comment</span>: Merge task/675d802896: ocx-node follows OCX protocol v1 as served

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

42. **b0178ca48296d24ee7c7001b283ca3d432f914f9186084827226d64fcfaa9850**
    - <span class="ocx-k">branch</span>: task/75178a18b5
    - <span class="ocx-k">user</span>: run-888413aa
    - <span class="ocx-k">comment</span>: ocx-node README: who does what, where; builds are sent from the web page

Accounts are made on ollama.openbeagle.org (done), never on the aarch64 machine or by the container. setup is once ever; its passwords live in the data volume, so after fossil update only build and up -d. Builds are sent by an admin from /cleave/ext/ocx2-cgi/create with the run-aarch64.md pattern, not from the aarch64 machine. A refused reply to a non-admin run is expected and shows the node is alive. Records the first successful bring-up on the aarch64 host.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> 43. 53eb6597e1739816c5016a16489be35334549355591ba6c3cb78c86dce341879 - branch: trunk - user: run-888413aa - comment: Merge task/75178a18b5: ocx-node README clarifies where each step happens

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> 44. 8eb0df2aba9e0a7969e56a462106c5c0e20347b169acdc01bbb81bc4bbcca965 - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node: build ocx2 at the server's OCX release, 4121f101b8

The node decides who may run what, so it needs the server's rules, including the new R capability (9e329962e7); 4121f101b8 still has ocx2 node. README: keep OCXVER matched to the server's release.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 45. b54d331531bff85c1044df23be020e675a3366b2c3e1f231c4f5563b42430c69 - branch: task/18ec7f20e8 - user: claude-49343b - comment: Merge trunk; ocx-node builds ocx2 at OCX 4121f101b8

Keeps trunk's ocx-node files as they are and changes only OCXVER, from 3d4263c784 (2026-10-14) to the server's release 4121f101b8, which has the R capability (9e329962e7) the node must know to decide R senders' runs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 46. 304d8b90e38346d959ed6572479cb5f3b9278f520d52133f274b2c77f590d531 - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node at OCX 4121f101b8

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 47. 68ba172ae2a6208af043c43f8b49fbf127943f3bbd10ce4ba144d82bc8908099 - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node: one-account join as aarch64-1, and R-sent builds within r-senders.json

For OCX b7127297b3 (staged on ollama, not yet accepted; merge to trunk after). ocx-node.sh: ocx2 node asks for the node's own account (one admin press on the printed link), then clones and acts; no setup, no hand-made accounts. r-senders.default.json: what R-sent runs may ask for (network, 6h, 4096 processes, read-only system), copied into the node volume on first start. run-aarch64.md: a build pattern that fits it (files step, no password). Tested locally: join, an R-only user's build ran (exited 0, output posted), and a 7h request was refused naming the 6h cap.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 48. c5b4ef24df86e1e1ecb26a7456a92e54cda1a3f86d23a1ba4cfca93d8ce7215f - branch: task/18ec7f20e8 - user: claude-49343b - comment: ocx-node: OCXVER c8c5c2ed9c, the release with the join-link fix

c8c5c2ed9c holds R (b7127297b3) and renames node_user's field to node, which Fossil does not reserve under /ext/. Builds here with Crystal 1.18.2. Merge to trunk once it is accepted on ollama.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 49. 1b80d1cc0f807b52c6a389908a39556c224ad7b9db15be6780092adc5e0306c0 - branch: trunk - user: claude-49343b - comment: Merge task/18ec7f20e8: ocx-node joins as aarch64-1 at OCX c8c5c2ed9c

ollama serves c8c5c2ed9c (accepted by the maintainer): R for build jobs, r-senders.json limits, and the ?node= join link.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG 50. 0c1b89ac665e0ae7c73ecbc94894cb7f20e21b2924e4e45de0674808242dc0df - branch: trunk - user: claude-49343b - comment: ocx-node: OCX 07fff8dad15c, the release ollama.openbeagle.org serves; node joins with poll --login and the approve page

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaWisxTW4iSdvDGSTvJiiG

log

  1. check read_unaudited read the check-ins that change files, and every verdict's tag change with who sent it, by the served repository's receipts; keep the check-ins no verdict that counts has judged, in the order it received them · repository /var/lib/fossil/cleave.fossil

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)

optional · the branch whose check-ins are listed; every branch when absent