Follow-up polish items from the Docker release audit. The critical correctness fixes (routing status honesty, provider whitelist, tier override validation, pricing cache health UI, .env.example wiring, MANIFEST_TRUST_LAN docs, OpenClaw branding) are being shipped in the companion PR. This issue tracks the remaining items that didn't make that pass.
Compose hardening leftovers (docker/docker-compose.yml)
HTTP status codes for non-chat error responses
Gate `/api/v1/public/usage` behind an opt-in env var
Verify + demote Better Auth "User not found" log level
Parameterize `og:url` / `og:image` from `BETTER_AUTH_URL`
CI smoke test for `read_only: true` compose boot
Narrow the Dockerfile `*.md` cleanup inside node_modules
Minor — filter diagnostic/error `agent_messages` rows out of the "messages today" counters
- (already landed in the Phase 1/2 PR for workspace-card and per-agent analytics, not for `/api/v1/messages` itself). Consider adding a `status` filter parameter to `/api/v1/messages` so the UI can offer an "errors only" toggle without a schema change.
Follow-up polish items from the Docker release audit. The critical correctness fixes (routing status honesty, provider whitelist, tier override validation, pricing cache health UI,
.env.examplewiring, MANIFEST_TRUST_LAN docs, OpenClaw branding) are being shipped in the companion PR. This issue tracks the remaining items that didn't make that pass.Compose hardening leftovers (
docker/docker-compose.yml)/tmptmpfs:tmpfs: - /tmp:size=64m. A misbehaving upload or stream buffer today can grow unbounded into container memory.pids_limitfrom 256 to 512. Node + Better Auth + proxy fanout can burst past 100 pids easily, and 256 is close enough to the ceiling to cause surprise EAGAIN failures.wget -qO-withnode -e "fetch('http://127.0.0.1:3001/api/v1/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))". BusyBox wget support for `-qO-` is shaky across Alpine variants; node is guaranteed to be present in the runtime image.HTTP status codes for non-chat error responses
Gate `/api/v1/public/usage` behind an opt-in env var
Verify + demote Better Auth "User not found" log level
Parameterize `og:url` / `og:image` from `BETTER_AUTH_URL`
CI smoke test for `read_only: true` compose boot
Narrow the Dockerfile `*.md` cleanup inside node_modules
Minor — filter diagnostic/error `agent_messages` rows out of the "messages today" counters