fix(compose): env.local stragglers across 3 overlay files - #2415
Conversation
PR #2374 made `.env.local` an opt-in env_file (long-form `path: ... required: false`) in the main compose + core overlay + ui overlay. The follow-up #2403 caught the remaining ui-overlay stragglers (grayjay-plugin-host, grayjay-server, jellyfin-bridge -- the last removed before this PR was scoped). This PR is the rest: 4 services across 3 overlay files that still listed `.env.local` in the short form, which is REQUIRED by default in docker-compose. Bring-up on any node without `.env.local` hard-fails these 4 services with "Couldn't find env file: .../.env.local" — same class of bug the original #2374 was meant to fix, missed because the per-overlay env_file lists were grep'd once and not exhaustively. Stragglers closed: pmoves/docker-compose.agentgym.yml - agentgym-rl-coordinator (line 37) - agentgym-env-pmoves (line 167) pmoves/docker-compose.gpu-image.yml - hi-rag-gateway-v2-gpu (line 6, inline -> block) pmoves/docker-compose.n8n.postgres.yml - n8n-db (line 6, inline -> block) All 3 files: 102/102 services across all overlays (`make -C pmoves compose-split` regenerates core/agents/media/ui/workers/apps/juicefs cleanly; agentgym/gpu-image/n8n.postgres are hand-maintained overlays and are not touched by compose-split). YAML parses clean. `pmoves/docker-compose.yml` and `pmoves/docker-compose.core.yml` were verified separately — every `.env.local` reference is already in the long form with `required: false`. This PR is the final sweep. Comment on each fix matches the #2374/#2403 wording verbatim so a future grep on the literal "short-form listing made it REQUIRED" will land on the same explanation. agent_signature: ACK::Mavis::ENV-LOCAL-STRAGGLERS-2026-08
Docker Hardening ValidationHardening Validation ReportValidated: Wed Aug 5 20:01:31 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: p7-room-orchestrator [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret [INFO] Validating: p7_control_token ====================================== |
📝 WalkthroughWalkthroughThree Docker Compose files now use long-form ChangesCompose environment loading
Estimated code review effort: 2 (Simple) | ~10 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pmoves/docker-compose.agentgym.yml`:
- Around line 37-40: Update operational documentation for the optional
.env.local contract at pmoves/docker-compose.agentgym.yml lines 37-40
(agentgym-rl-coordinator) and 170-173 (agentgym-env-pmoves),
pmoves/docker-compose.gpu-image.yml lines 6-13 (hi-rag-gateway-v2-gpu), and
pmoves/docker-compose.n8n.postgres.yml lines 6-13 (n8n-db). Document that
.env.local may be absent, identify the three required shared files, and specify
their override order consistently across all four service definitions.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 80d3f773-6f48-4fa3-aa56-2a8103a375a9
📒 Files selected for processing (3)
pmoves/docker-compose.agentgym.ymlpmoves/docker-compose.gpu-image.ymlpmoves/docker-compose.n8n.postgres.yml
| # .env.local is a per-node opt-in; short-form listing made it REQUIRED | ||
| # and hard-failed bring-up on nodes without it. | ||
| - path: .env.local | ||
| required: false |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Document the optional .env.local contract across the overlays.
The Compose interface now allows .env.local to be absent for four services. Update the operational documentation with the affected services, the three required shared files, and the override order.
pmoves/docker-compose.agentgym.yml#L37-L40: document the contract foragentgym-rl-coordinator.pmoves/docker-compose.agentgym.yml#L170-L173: document the contract foragentgym-env-pmoves.pmoves/docker-compose.gpu-image.yml#L6-L13: document the contract forhi-rag-gateway-v2-gpu.pmoves/docker-compose.n8n.postgres.yml#L6-L13: document the contract forn8n-db.
As per coding guidelines, **/*: Update documentation and schemas when interfaces change.
📍 Affects 3 files
pmoves/docker-compose.agentgym.yml#L37-L40(this comment)pmoves/docker-compose.agentgym.yml#L170-L173pmoves/docker-compose.gpu-image.yml#L6-L13pmoves/docker-compose.n8n.postgres.yml#L6-L13
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@pmoves/docker-compose.agentgym.yml` around lines 37 - 40, Update operational
documentation for the optional .env.local contract at
pmoves/docker-compose.agentgym.yml lines 37-40 (agentgym-rl-coordinator) and
170-173 (agentgym-env-pmoves), pmoves/docker-compose.gpu-image.yml lines 6-13
(hi-rag-gateway-v2-gpu), and pmoves/docker-compose.n8n.postgres.yml lines 6-13
(n8n-db). Document that .env.local may be absent, identify the three required
shared files, and specify their override order consistently across all four
service definitions.
Source: Coding guidelines
…release Three entries appended at the bottom of pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md: 1. PR #2415 (RELEASE, 2026-08-05T20:08Z) — env.local stragglers across 3 hand-maintained compose overlays. The entry was lost in the rebase/reset cycle that left main at `0ae6a99fd8`. Re-adding so the AGNOTE chain reflects the actual merge history. 2. PR #2416 (RELEASE, 2026-08-05T20:39Z) — validate-composes + validate-tac ratchets. Same: lost in the rebase cycle, re-added. 3. PR #2418 (CLAIM, 2026-08-05T22:15Z) — this PR's own validate-dockerfile-paths ratchet. Third ratchet from the #2358 meta-callout, same shape as the prior two, with the 5 broken builds fixed in the prior commit and the 26-entry baseline of intentional orphans. GRAPHITI_MARK comments added for all three so the Graphiti ingest picks them up. No code changes in this commit.
…release Three entries appended at the bottom of pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md: 1. PR #2415 (RELEASE, 2026-08-05T20:08Z) — env.local stragglers across 3 hand-maintained compose overlays. Lost in the rebase/reset cycle that left main at 0ae6a99; re-adding so the AGNOTE chain reflects the actual merge history. 2. PR #2416 (RELEASE, 2026-08-05T20:39Z) — validate-composes + validate-tac ratchets. Same: lost in the rebase cycle, re-added. 3. PR #2417 (CLAIM, 2026-08-05T22:15Z) — this PR's own validate-dockerfile-paths ratchet. Third ratchet from the #2358 meta-callout, same shape as the prior two, with the 5 broken builds fixed in the prior commit and the 26-entry baseline of intentional orphans. GRAPHITI_MARK comments added for all three so the Graphiti ingest picks them up. No code changes in this commit.
The validate-dockerfile-paths ratchet (P1 commit) caught these
on its first run. Each one is a compose `build:` stanza that
points at a Dockerfile that doesn't exist — the ratchet's exact
"merged before the issue was addressed" pattern.
5 fixes (4 files):
1. pmoves/docker-compose.vps.override.yml:43-44
`agent-zero` had `build: { dockerfile: Dockerfile }` with
no `context:`. Default context is `.` (pmoves/), so the
resolved path was `pmoves/Dockerfile` which doesn't exist.
Added `context: .` + `dockerfile: ./services/agent-zero/
Dockerfile` to match the build stanza in pmoves/docker-
compose.yml:2911-2913.
2-3. pmoves/docker-compose.yml:5207-5211 (github-branch-
naming) + 5247-5251 (github-crossrepo-sync)
Both services had `build: { context: ./services/<name>,
dockerfile: Dockerfile }` but the service directories
don't exist in this repo (the implementation lives in
separate `pmoves-github-branch-naming` / `pmoves-github-
crossrepo-sync` repos). Dropped the `build:` block; the
prebuilt `image: ${...IMAGE:-ghcr.io/...:pmoves-latest}`
env var default is the canonical path. Matches the
`publisher-discord` (line 3891) + `github-crossrepo-pr`
(line 3891 neighborhood) pattern of prebuilt-only.
4-5. Same fix applied to pmoves/docker-compose.workers.yml:
695-699 (github-branch-naming) + 735-739 (github-crossrepo-
sync) — these are a hand-curated split of the main file and
had the same broken `build:` stanzas.
After this commit: validate-dockerfile-paths reports 0 broken
builds on the fleet. The next commit (docs) re-adds the missing
AGNOTE entries for the prior ratchet PRs (#2415, #2416) plus the
release marker for this PR.
…release Three entries appended at the bottom of pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md: 1. PR #2415 (RELEASE, 2026-08-05T20:08Z) — env.local stragglers across 3 hand-maintained compose overlays. Lost in the rebase/reset cycle that left main at 0ae6a99; re-adding so the AGNOTE chain reflects the actual merge history. 2. PR #2416 (RELEASE, 2026-08-05T20:39Z) — validate-composes + validate-tac ratchets. Same: lost in the rebase cycle, re-added. 3. PR #2417 (CLAIM, 2026-08-05T22:15Z) — this PR's own validate-dockerfile-paths ratchet. Third ratchet from the #2358 meta-callout, same shape as the prior two, with the 5 broken builds fixed in the prior commit and the 26-entry baseline of intentional orphans. GRAPHITI_MARK comments added for all three so the Graphiti ingest picks them up. No code changes in this commit.
…he dev touched ≠ file the runner builds' (#2358) (#2417) * feat(ratchets): validate-dockerfile-paths — durable answer to "file the dev touched ≠ file the runner builds" (#2358) Third pattern from the operator's #2358 meta-callout. Same shape as the validate-composes + validate-tac ratchets (PR #2416): no- network, ~100ms scan, baseline file committed and reviewable in PR diffs, count only goes DOWN over time. Two failure modes: 1. BROKEN_BUILD — a compose `build:` stanza points at a Dockerfile that doesn't exist on disk. (5 real instances fixed in the next commit: agent-zero in vps.override.yml, github-branch-naming + github-crossrepo-sync in docker-compose.yml + docker-compose.workers.yml.) 2. ORPHAN_DOCKERFILE — a Dockerfile in the repo that no compose references AND isn't in the operator-acknowledged baseline. Initial baseline has 26 entries with reasons. Files: - pmoves/tools/validate_dockerfile_paths.py (~280 lines, zero deps beyond pyyaml; same `!override` / `!reset` Compose-tag tolerance as validate_composes) - pmoves/tools/tests/test_validate_dockerfile_paths.py (11 tests, all pass; covers broken-build, baseline-aware orphan detection, sibling-submodule skipping, env-var default substitution, JSON output shape) - pmoves/configs/dockerfiles/_known_orphans.yaml (baseline with 26 entries + reasons; reduce-by-pr pattern) - .github/workflows/validate-dockerfile-paths-ratchet.yml (fires on any Dockerfile*, any docker-compose*.yml, the ratchet script, the ratchet tests, the baseline file, or the workflow itself) - pmoves/Makefile (3 new targets: validate-dockerfile-paths, validate-dockerfile-paths-json, validate-dockerfile-paths-list-orphans) The sibling-submodule / vendor / provisions paths are explicit- skip: the ratchet can't statically check external repos. Out-of- scope paths include anything under pmoves/vendor/, anything with "provisions" in the path, and the common sibling-submodule patterns (PMOVES-Archon, PMOVES.YT, Pmoves-cipher, etc.). The operator keeps those synced via `make submodules`. Counts at initial pass (on this PR): 90 dockerfiles in the scan dirs, 78 referenced by compose, 26 in baseline. Zero findings. 35/35 ratchet tests pass. * fix(compose): 5 real broken build targets the ratchet surfaced The validate-dockerfile-paths ratchet (P1 commit) caught these on its first run. Each one is a compose `build:` stanza that points at a Dockerfile that doesn't exist — the ratchet's exact "merged before the issue was addressed" pattern. 5 fixes (4 files): 1. pmoves/docker-compose.vps.override.yml:43-44 `agent-zero` had `build: { dockerfile: Dockerfile }` with no `context:`. Default context is `.` (pmoves/), so the resolved path was `pmoves/Dockerfile` which doesn't exist. Added `context: .` + `dockerfile: ./services/agent-zero/ Dockerfile` to match the build stanza in pmoves/docker- compose.yml:2911-2913. 2-3. pmoves/docker-compose.yml:5207-5211 (github-branch- naming) + 5247-5251 (github-crossrepo-sync) Both services had `build: { context: ./services/<name>, dockerfile: Dockerfile }` but the service directories don't exist in this repo (the implementation lives in separate `pmoves-github-branch-naming` / `pmoves-github- crossrepo-sync` repos). Dropped the `build:` block; the prebuilt `image: ${...IMAGE:-ghcr.io/...:pmoves-latest}` env var default is the canonical path. Matches the `publisher-discord` (line 3891) + `github-crossrepo-pr` (line 3891 neighborhood) pattern of prebuilt-only. 4-5. Same fix applied to pmoves/docker-compose.workers.yml: 695-699 (github-branch-naming) + 735-739 (github-crossrepo- sync) — these are a hand-curated split of the main file and had the same broken `build:` stanzas. After this commit: validate-dockerfile-paths reports 0 broken builds on the fleet. The next commit (docs) re-adds the missing AGNOTE entries for the prior ratchet PRs (#2415, #2416) plus the release marker for this PR. * docs(agnote): re-add #2415 + #2416 entries lost in rebase + new #2417 release Three entries appended at the bottom of pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md: 1. PR #2415 (RELEASE, 2026-08-05T20:08Z) — env.local stragglers across 3 hand-maintained compose overlays. Lost in the rebase/reset cycle that left main at 0ae6a99; re-adding so the AGNOTE chain reflects the actual merge history. 2. PR #2416 (RELEASE, 2026-08-05T20:39Z) — validate-composes + validate-tac ratchets. Same: lost in the rebase cycle, re-added. 3. PR #2417 (CLAIM, 2026-08-05T22:15Z) — this PR's own validate-dockerfile-paths ratchet. Third ratchet from the #2358 meta-callout, same shape as the prior two, with the 5 broken builds fixed in the prior commit and the 26-entry baseline of intentional orphans. GRAPHITI_MARK comments added for all three so the Graphiti ingest picks them up. No code changes in this commit. * fix(compose): regenerate workers overlay after comment edits The ratchet PR updated inline comments in docker-compose.yml for github-branch-naming / github-crossrepo-sync (explaining why there's no build block) but didn't run `make -C pmoves compose-split` to propagate the changes to docker-compose.workers.yml. Validate Compose Files was correctly reporting drift. Verified idempotent (compose-split produces same output on re-run). 💘 Generated with Crush * fix(compose): regenerate overlays after rebase onto #2420 Rebase brought in #2420's json-file log rotation on tier anchors. Regenerate base/core/agents/apps overlays to match. Workers was already correct (compose-split on the pre-rebase branch fixed it). 💘 Generated with Crush * fix(ratchet): use is_file() not exists() for Dockerfile BROKEN_BUILD check exists() returns True for directories — a compose build.dockerfile that resolves to a directory (e.g. unset ${FOO} collapsing to the context dir) would pass the gate even though Docker can't use it. is_file() ensures only real files satisfy the check. Addresses Codex P2 on #2417. 💘 Generated with Crush --------- Co-authored-by: mavis <mavis@pmoves.ai> Co-authored-by: Agent Zero <agent.zero@pmoves.ai>
…, no lanes closed The register carries 121 CLAIM lines against 115 RELEASE lines. Seven CLAIMs dated 2026-07-30 onward have no matching RELEASE. This records, per lane, whether the work it cites actually merged — so the owning agent can close from evidence instead of memory. Deliberately writes ZERO RELEASE lines. Verified: 30 additions, 0 deletions, no "RELEASE `" line added. These are Mavis's and CRUSH's lanes; under Village Rule they sign off their own work. Producing a sign-off on another agent's behalf would make the coordination surface less trustworthy, not more — which is the exact problem this sweep exists to address. Verified shipped (RELEASE appears to be all that is missing): line 1466 CRUSH B850 Knuckles convergence #2288 MERGED line 1552 Lane 2228 a2ui-renderer service-source #2227 MERGED line 1587 Lane 2228 yt-cookies Auth refactor #2327/#2333/#2346 MERGED line 1624 PR #2417 dockerfile-paths ratchet #2415/#2416/#2417 MERGED line 1594 Issue #2217 item 4 Archon auth entry says "closed", no RELEASE Needs an owner answer — no PR cited, nothing merged found: line 1500 Lane 3 supabase-stack-default-up ~7 days open line 1511 Lane 4 test_all_tts_engines -> pterm ~6 days open Probably shipped, owner to confirm: line 1559 Lane 5 NATS broker / void-publish fix no PR cited, but the ARCHON stream landed in #2397 and was verified on 5090, consistent with completion. Not asserted. Method is recorded in the entry so it is reproducible rather than trusted: counts read from origin/main, PR numbers extracted per CLAIM line, merge state via `gh pr view --json state,mergedAt`. Automated CLAIM-to-RELEASE pairing is unreliable here because Mavis publishes every lane under one agent id, so a later RELEASE on any lane masks earlier open ones — hence a verification list, not a reconciliation. Four of the seven are bookkeeping. Lines 1500 and 1511 are the two that matter for stabilization: nothing merged, and nothing records what happened. Out of scope by design: submodule sync + audit (z890-claude's active lane). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…, no lanes closed (#2465) The register carries 121 CLAIM lines against 115 RELEASE lines. Seven CLAIMs dated 2026-07-30 onward have no matching RELEASE. This records, per lane, whether the work it cites actually merged — so the owning agent can close from evidence instead of memory. Deliberately writes ZERO RELEASE lines. Verified: 30 additions, 0 deletions, no "RELEASE `" line added. These are Mavis's and CRUSH's lanes; under Village Rule they sign off their own work. Producing a sign-off on another agent's behalf would make the coordination surface less trustworthy, not more — which is the exact problem this sweep exists to address. Verified shipped (RELEASE appears to be all that is missing): line 1466 CRUSH B850 Knuckles convergence #2288 MERGED line 1552 Lane 2228 a2ui-renderer service-source #2227 MERGED line 1587 Lane 2228 yt-cookies Auth refactor #2327/#2333/#2346 MERGED line 1624 PR #2417 dockerfile-paths ratchet #2415/#2416/#2417 MERGED line 1594 Issue #2217 item 4 Archon auth entry says "closed", no RELEASE Needs an owner answer — no PR cited, nothing merged found: line 1500 Lane 3 supabase-stack-default-up ~7 days open line 1511 Lane 4 test_all_tts_engines -> pterm ~6 days open Probably shipped, owner to confirm: line 1559 Lane 5 NATS broker / void-publish fix no PR cited, but the ARCHON stream landed in #2397 and was verified on 5090, consistent with completion. Not asserted. Method is recorded in the entry so it is reproducible rather than trusted: counts read from origin/main, PR numbers extracted per CLAIM line, merge state via `gh pr view --json state,mergedAt`. Automated CLAIM-to-RELEASE pairing is unreliable here because Mavis publishes every lane under one agent id, so a later RELEASE on any lane masks earlier open ones — hence a verification list, not a reconciliation. Four of the seven are bookkeeping. Lines 1500 and 1511 are the two that matter for stabilization: nothing merged, and nothing records what happened. Out of scope by design: submodule sync + audit (z890-claude's active lane). Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…2478) `3c7326a1a` (PR #2450, mavis creative pipeline v0) replaced an 82-line region of the Active Claim Register with 14 lines: 6 insertions, 74 deletions. The 6 insertions were the creative-pipeline entry written TWICE (the duplicate being the corrupted copy removed in #2476). The 74 deletions were six unrelated entries, none of them mentioned in that PR. Lost: Mavis::ENV-LOCAL-STRAGGLERS-2026-08-05 (PR #2415) Mavis::VALIDATE-COMPOSES-TAC-RATCHETS-2026-08-05 (PR #2416) Mavis::VALIDATE-DOCKERFILE-PATHS-RATCHET-2026-08-05 (PR #2417) 4090-claude::MINT-TOKENOMICS-FORKSYNC-TAC-YT-EGRESS (PR #2457, merged 20:52) 4090-claude::AUDIO-SEGMENTATION-TRUNK-INVENTORY (PR #2457, merged 20:52) 4090-claude::CLAIM-REGISTER-VERIFICATION-SWEEP (PR #2465, merged 21:24) #2465 and #2457 merged at 20:52 and 21:24; #2450 merged at 21:00 and 21:24 from a base that predated them, so their content was silently reverted minutes after landing. Classic stale-base overwrite on an append-only shared doc — the register has no gate that would notice, because a deletion is a valid diff. Restored verbatim from `3c7326a1a^` and re-inserted at the same anchor (immediately after the CRUSH-GLM52 CIPHER-TENSORZERO-S5-OPENROOM mark), so document order is unchanged from before the loss. Verified after the edit: all six GRAPHITI_MARKs present exactly once, the two entries #2450 legitimately added (creative-pipeline v0, openroom slice 2) still present exactly once, zero conflict markers, +81/-0. Nothing here is mine to close — the three Mavis lanes stay Mavis's under Village Rule. This restores the record only. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Closes the env.local stragglers #2374 + #2403 missed
PR #2374 made
.env.localan opt-in env_file (long-formpath: ... required: false) in the main compose + core overlay + ui overlay. The follow-up #2403 caught the remaining ui-overlay stragglers. This PR is the rest.What's fixed
4 services across 3 overlay files still listed
.env.localin the short form (which is REQUIRED by default in docker-compose). Bring-up on any node without.env.localhard-fails these 4 services with "Couldn't find env file: .../.env.local" — same class of bug the original #2374 was meant to fix, missed because the per-overlay env_file lists were grep'd once and not exhaustively.pmoves/docker-compose.agentgym.ymlagentgym-rl-coordinatorpmoves/docker-compose.agentgym.ymlagentgym-env-pmovespmoves/docker-compose.gpu-image.ymlhi-rag-gateway-v2-gpupmoves/docker-compose.n8n.postgres.ymln8n-dbAll 3 files: 102/102 services across all overlays (
make -C pmoves compose-splitregenerates core/agents/media/ui/workers/apps/juicefs cleanly; agentgym/gpu-image/n8n.postgres are hand-maintained overlays and are not touched by compose-split). YAML parses clean.Verification
pmoves/docker-compose.ymlandpmoves/docker-compose.core.ymlseparately verified - every.env.localreference is already in the long form withrequired: false. This PR is the final sweep.make compose-splitregeneration needed (these 3 overlays are not auto-generated).Out of scope (intentional)
pmoves/docs/architecture/evoswarm-agentgym-rl-integration.md) still show the old short-form in YAML examples. Doc-only - not a runtime issue. Can be a follow-up doc sweep.What this enables
After merge,
.env.localis reliably opt-in across the entire PMOVES fleet: nodes that don't ship the file no longer hard-fail bring-up; nodes that do ship the file get the override. The 8 PMOVES compose overlays now agree on the same contract.agent_signature: ACK::Mavis::ENV-LOCAL-STRAGGLERS-2026-08
Summary by CodeRabbit
.env.localfile is absent.