Skip to content

Three defects the first live daemon run found - #239

Merged
thedancingdeveloper merged 1 commit into
mainfrom
fix/live-daemon-findings
Aug 8, 2026
Merged

Three defects the first live daemon run found#239
thedancingdeveloper merged 1 commit into
mainfrom
fix/live-daemon-findings

Conversation

@thedancingdeveloper

Copy link
Copy Markdown
Contributor

The Stage 2 execution tests ran against a real Docker daemon for the first time, on the Node B deployment. Both failed. Neither was deployment plumbing.

1. The sandbox command wrapper assumed GNU coreutils

Every agent command was wrapped in timeout --signal=TERM 30s. The long option and the unit suffix are GNU. Against BusyBox — Alpine, the small acceptance image — every command in the sandbox returned 1 with timeout: unrecognized option: signal=TERM.

Read literally that looks like the agent's command failing, not the harness's wrapper being unportable. That misattribution is the failure this repository has paid for most often (#216 blamed the model for four passes).

The existing unit test asserted "7s" in exec_call — it pinned the GNU spelling rather than the portability, which is exactly how this shipped. It now asserts the portable form, and a second test fails if --signal or a unit suffix returns.

2. Two copies of the daemon check, one of them fixed

DockerItemEnvironment.check() still carried the --format template defect that DockerEnvironmentFactory.check() had removed hours earlier, so an unreachable daemon reported a Go reflect error instead of naming the daemon. Both now share the helpers, with a test that they answer identically.

3. serve crash-looped instead of coming up degraded

A local fleet configured with no routes exited 2 — the API and GUI never came up to say why, and the supervisor restarted it every 60 seconds. Three lines away, the missing-reviewer case already argues the opposite: "Not fatal, and not silent: preflight blocks the start with exactly this reason." The two now agree. Nothing unsafe is permitted: preflight still refuses to start a project whose roles are not routed, and a fleet with no routes claims nothing.

All three were invisible to local runs and to CI, because this is the first environment with a real daemon, a BusyBox sandbox image and a supervisor.

The Stage 2 execution tests ran against a real Docker daemon for the first
time, on the Node B deployment. Both failed. Neither was deployment plumbing.

1. The sandbox command wrapper assumed GNU coreutils.

   Every agent command was wrapped in `timeout --signal=TERM 30s`. The long
   option and the unit suffix are GNU. Against BusyBox -- Alpine, the small
   acceptance image -- every command in the sandbox returned 1 with

       timeout: unrecognized option: signal=TERM

   which reads as the agent's command failing rather than the harness's own
   wrapper being unportable. That misattribution is the failure this
   repository has paid for most often. `-s TERM` with bare seconds is
   accepted by GNU and BusyBox alike.

   The existing test asserted `"7s" in exec_call` -- it pinned the GNU
   spelling rather than the portability, which is how this shipped.

2. There were two copies of the daemon check, and only one was fixed.

   `DockerItemEnvironment.check()` still carried the `--format` template
   defect that `DockerEnvironmentFactory.check()` had removed hours earlier:
   an unreachable daemon reported a Go reflect error instead of naming the
   daemon. Both now share `_diagnosis`/`_server_version`, and a test asserts
   the two answer identically so they cannot drift again.

3. `serve` crash-looped instead of coming up degraded.

   A local fleet configured with no routes exited 2, so the API and GUI never
   came up and the sentence explaining why was visible only to whoever read
   container logs -- while the process manager restarted it every 60 seconds.
   Three lines away, the missing-reviewer case already argues the opposite:
   "Not fatal, and not silent: preflight blocks the start with exactly this
   reason, so the fleet may as well exist and say why now." The two now
   agree. Nothing unsafe is permitted by starting: preflight still refuses a
   project whose roles are not routed, and a fleet with no routes claims
   nothing.

All three were invisible to local runs and to CI, because this is the first
environment with a real daemon, a BusyBox sandbox image and a supervisor.
@thedancingdeveloper
thedancingdeveloper merged commit 75e76ed into main Aug 8, 2026
3 checks passed
@thedancingdeveloper
thedancingdeveloper deleted the fix/live-daemon-findings branch August 8, 2026 09:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant