Repository navigation
Keep no Docker daemon log of agent containers (#165) - #190
Merged
Merged
Conversation
The supervisor reads an agent's output through `docker start --attach` and bounds it there. Agent containers now use `--log-driver=none`, so the daemon keeps no copy that a fast writer could grow before the supervisor stops the container, and validation refuses a container with any other log setting before it starts. Closes #165 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…165) Review round 1: a daemon copies its own cache-* log options into every container, so an exact empty-options check would refuse every agent on such a host. The rule is now keepsNoDaemonLog, with unit cases for the options only the API can set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…165) Review round 2: the inspect test accepts the daemon's cache-* options as the validator does; the rule's unit test runs in the parallel project (agent-daemon-log); docs record that only agent containers are covered. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 3 nits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
Real-Docker validation results and the required exact-head independent-review evidence remain unconfirmed.
No open issues 🎉
What changed in this PR
Disables Docker daemon logging for agent containers, addressing #165 while preserving the supervisor’s bounded output capture.
Changes:
- Creates agent containers with
--log-driver=noneand validates that configuration before launch. - Adds unit and real-Docker regression tests.
- Documents the logging choice and its agent-container-only scope.
| File | Description |
|---|---|
test/agent-daemon-log.test.ts |
Tests accepted and rejected logging configurations. |
test/agent-container.test.ts |
Adds real-Docker inspection and rejection tests. |
docs/implementation/plan-library-alignment.md |
Records #165’s resolution and scope. |
docs/implementation/agent-isolation.md |
Documents the logging isolation requirement and coverage. |
docs/designs/codeboost-plan-indexed-review.md |
Records the no-daemon-log design choice. |
agents/container/run.ts |
Validates logging configuration before launch. |
agents/container/profile.ts |
Sets --log-driver=none for agent containers. |
Review effort: Balanced
This was referenced Oct 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #165
What changes
--log-driver=none(agents/container/profile.ts). The supervisor already reads the agent's output only throughdocker start --attachand bounds it there. With the default driver, the daemon also kept its own copy, which a fast writer could grow before the supervisor stopped the container. Now the daemon keeps none.validateContainer(agents/container/run.ts) refuses a container unlesskeepsNoDaemonLog(HostConfig.LogConfig)holds before it starts: drivernone, and onlycache--prefixed options. A daemon copies its owncache-*log options into every container whatever the driver (moby v27.4.0logcache.MergeDefaultLogConfig), and withnoneno logger or cache starts.none, notlocalwithmax-size/max-file. Nothing reads the daemon's log (nodocker logs, no reattach). The design table and the T9 gate table record it.Scope
Agent containers only, as the issue's title says. The runner's own task-storage script containers (
docker run --rminagents/container/storage.ts) keep the daemon's default log until they exit. The client bounds what it reads from them. The docs say so. This could be a follow-up.Tests
test/agent-container.test.ts):docker inspectof the created container shows drivernoneand the rule holds.json-filelog and a boundedlocallog are refused.none.test/agent-daemon-log.test.ts): the rule for configurations that only the API can set. The CLI refuses--log-optwithnone, but the daemon stores whatever the API gives (checked on Docker 27.4.0).npm run typecheckpasses.real-dockerjob. No real-Docker suite was run locally; only one-off throwaway containers were used, to check CLI and API behaviour.Review record
Base
aced300for every round. Each independent round was a fresh general-purpose agent with no shared context, reviewing the full diff.nonecache-*log options into every container, so an exact "no options" check would refuse every agent on such a host. Minor: the "no options" half of the check was untested. Scope note: other containers keep the default logkeepsNoDaemonLogallowscache-*keys; unit cases cover options only the API can setConfig: {}. Minor: the unit test ran only in the Docker project. Minor: scope missing from docs. Nits: comment wording; an always-truecreatedstatus check. Declined: nonenoneValidation at the reviewed head (362fe8f, base aced300):
real-docker(Agent isolation) passed in 21m57s, run 39525946071. It ran the new real-Docker tests intest/agent-container.test.ts.test(CI) is pending.npm run typecheckpasses andtest/agent-daemon-log.test.tspasses.Review lessons (merge gate):
cache-*copy (round 1) is covered by CLAUDE.md, "Review readiness": where the versions or setups the code meets answer differently, the code must not depend on that answer.🤖 Generated with Claude Code