Overview
| Artifact ID: | 3df9353a19da88b49955bce1e4ed4123d4082d4b0e506be581cf25b42c3aa829 |
|---|---|
| Ticket: | 8986816c0b54397283360a1f7653da7e818981a3
A new release cannot reach both the server and the client: stage and accept were not carried across the split |
| User & Date: | x86-1-session 2026-11-04 14:17:05 |
Changes
- icomment:
```json { "ocx": 2, "to": "x86-1", "run": { "workspace": [ { "step": "directory", "at": "$$root$$/$$process_user$$/projects/$$repository_name$$/$$run$$", "remove_on": "saved" }, { "step": "files", "of": "498c3c05990cb97a6cb2950ce578ca7ffaa82bacd01c015fdd63704e575dc6d5", "into": "$$workspace$$/tree" } ], "sandbox": { "uid": 1000, "gid": 1000, "linux_capabilities": [], "network": true, "isolate_terminal": true, "ends_with_parent": true, "read_only": [ "/usr", "/bin", "/sbin", "/lib", "/lib64", "/etc/resolv.conf", "/etc/hosts", "/etc/nsswitch.conf", "/etc/ssl/certs" ], "read_write": [ "$$workspace$$" ], "homes": [ "/root/.codex" ], "created_files": [ { "at": "/etc/passwd", "text": "$$process_user$$:x:1000:1000::$$workspace$$:/bin/sh\n" } ], "proc": "/proc", "dev": "/dev", "tmp": "/tmp" }, "limits": { "wall": "2h", "cpu": 3600, "processes": 512, "file_size": "256M" }, "process": { "user": "codex-task", "command": [ "/bin/sh", "-c", "read -r run || exit 2; objective=$(printf '%s' \"$run\" | jq -r .objective) || exit 2; cp -a $$tree$$ $$workspace$$/base || exit 2; nice -n 10 /usr/bin/codex exec --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check \"$1 $objective\" < /dev/null; codex=$?; cd $$workspace$$ || exit 2; diff -ruN base tree > change.patch; [ $? -le 1 ] || exit 2; exit $codex", "codex-task", "This directory holds the files of a check-in, with no version control: make in its files the change this objective asks, and nothing more; remove any file you made only to build or check it; do not commit. Your last message says what you changed and what you checked. The objective:" ], "cwd": "$$tree$$", "keep": { "stderr": "2K", "stdout": "4K", "stdout_when": "always" }, "unversioned_files": [ { "at": "$$workspace$$/change.patch", "as": "codex-$$run$$.patch" } ], "env": { "HOME": "$$workspace$$", "USER": "$$process_user$$", "PATH": "/usr/local/bin:/usr/bin:/bin" } }, "objective": "Make the node's daemon keep going when its server cannot be reached for a while, instead of stopping. Today one network failure stops it: the aarch64-1 Docker node's daemon stopped on Nov 3 with \"stopped: the server could not be reached: Error connecting to ...\" and pulled nothing for 35 hours, because Daemon.serve (src/ocx/daemon.cr) propagates any failure of a clone's round or chat wait, ending every clone's fiber, and serve starts the daemon only once.\n\nThe contract:\n- When a clone's round or chat wait fails only because the server could not be reached (src/ocx/server/pages.cr, the rescue of IO::Error, Socket::Error and OpenSSL::Error that raises \"the server could not be reached\"; and the pull's \"its remote could not be reached\", src/ocx/fossil/sync.cr Sync.unsynced), that clone logs the round with its failure in daemon.log, as a failed round logs today, waits a bounded pause, and tries its next round. Other clones go on as before. Give that one failure its own exception class, a subclass of Refused raised at those two places, so nothing else is caught: every other failure still propagates and stops the daemon, as now.\n- The pause is a fixed constant of a minute or so, no growing backoff, no setting, no counter. A round that then reaches the server goes on as usual, losing no wake (the round's own comment on Pull and Wait).\n- The daemon still ends when the release's current link moves, including while it pauses.\nAdd specs: a server unreachable for one round and then reached again, the daemon still running and its next round succeeding, daemon.log showing the failed round; another failure (a refused login, say) still stopping the daemon; current moving during the pause ending it. Use the existing daemon specs' fixtures (spec/ocx/daemon_spec.cr and its siblings). Say it in the daemon's documentation where its failures are described (search docs/ and USAGE.md for \"could not be reached\" and the daemon's stop), plainly. Do not edit scripts/ or ocx-rootfs/hosts.json. Follow docs/crystal.md, KEEP.md, PLAN.md and the guards. Run the full `crystal run ci.cr`, make it pass, and give its last line in your last message. Before your last message, remove lib/ and anything else `shards install` or the build made (bin/, .shards/, .crystal caches): the patch is made by `diff -ruN` over the whole directory, and the symbolic links shards makes under lib/ loop and stop it. Judge every choice in this task by README.md's four virtues, as the maintainer asks of every turn: Clarity (it can be stated: the contract below, and nothing it leaves unsaid); Loose Coupling (it can be replaced: clean boundaries, nothing tied to an unpredictable or external part); Demonstrability (it can be demonstrated: specs that prove each clause); Parsimony (it can be bounded: no mechanism, state or abstraction beyond what the contract needs; the smallest mechanism that satisfies it and can be demonstrated). A person runs each release step and can redo it or fix a link by hand, so add nothing to make retries, races or recovery automatic beyond what is asked. In your last message, name for each thing you added the contract clause it satisfies.", "clone": "fa361107a96cf737cbba73269a20490cf7b227ff" } } ``` - login: "x86-1-session"
- mimetype: "text/x-markdown"