Skip to content

fix(compose): env.local stragglers across 3 overlay files - #2415

Merged
POWERFULMOVES merged 1 commit into
mainfrom
fix/env-local-stragglers-2026-08
Aug 5, 2026
Merged

POWERFULMOVES merged 1 commit into
mainfrom
fix/env-local-stragglers-2026-08

Conversation

@POWERFULMOVES

@POWERFULMOVES POWERFULMOVES commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Closes the env.local stragglers #2374 + #2403 missed

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. This PR is the rest.

What's fixed

4 services across 3 overlay files 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.

File Service Line Form
pmoves/docker-compose.agentgym.yml agentgym-rl-coordinator 37 block (was short)
pmoves/docker-compose.agentgym.yml agentgym-env-pmoves 167 block (was short)
pmoves/docker-compose.gpu-image.yml hi-rag-gateway-v2-gpu 6 inline to block
pmoves/docker-compose.n8n.postgres.yml n8n-db 6 inline to 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.

Verification

Out of scope (intentional)

What this enables

After merge, .env.local is 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

  • Bug Fixes
    • Deployments now start successfully when the optional .env.local file is absent.
    • Required shared environment configuration remains enforced across affected services.

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
@github-actions github-actions Bot added the compose Compose files / service Dockerfiles label Aug 5, 2026
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Docker Hardening Validation

Hardening Validation Report

Validated: Wed Aug 5 20:01:31 UTC 2026

Services Checked

PMOVES.AI Docker Hardening Validation

[INFO] Checking: pmoves/docker-compose.hardened.yml

[INFO] Validating: hi-rag-gateway-v2
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: extract-worker
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: langextract
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: presign
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: render-webhook
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: retrieval-eval
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pdf-ingest
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: jellyfin-bridge
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: invidious-companion-proxy
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: ffmpeg-whisper
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-video
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: media-audio
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-v2-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: hi-rag-gateway-gpu
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: deepresearch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supaserch
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: publisher-discord
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: mesh-agent
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-req
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: nats-echo-res
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: comfy-watcher
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: grayjay-plugin-host
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: agent-zero
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: p7-room-orchestrator
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: archon
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: channel-monitor
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: pmoves-yt
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: notebook-sync
[PASS] Non-root user: 65532:65532
[PASS] Read-only filesystem
[PASS] All capabilities dropped
[PASS] No-new-privileges enabled
[WARN] No resource limits

[INFO] Validating: supabase_service_role_key
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: supabase_jwt_secret
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

[INFO] Validating: p7_control_token
[WARN] No user directive
[WARN] No read_only directive
[WARN] No cap_drop: ["ALL"]
[WARN] No no-new-privileges
[WARN] No resource limits

======================================
Summary: 112 passed, 43 warnings, 0 errors

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Three Docker Compose files now use long-form env_file entries. The .env.local file is optional for the affected services. Shared environment files remain required.

Changes

Compose environment loading

Layer / File(s) Summary
Optional local environment configuration
pmoves/docker-compose.agentgym.yml, pmoves/docker-compose.gpu-image.yml, pmoves/docker-compose.n8n.postgres.yml
The affected services now mark .env.local as optional. Required shared environment files remain explicit required entries.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the changes and verification, but it omits the required Testing, Required Checks, and Review Coordination sections. Add the required template sections, document commands and results, and record the required checks and review requests.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the Compose fix and the three affected overlay files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/env-local-stragglers-2026-08

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 16af368 and 8c6d979.

📒 Files selected for processing (3)
  • pmoves/docker-compose.agentgym.yml
  • pmoves/docker-compose.gpu-image.yml
  • pmoves/docker-compose.n8n.postgres.yml

Comment on lines +37 to +40
# .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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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 for agentgym-rl-coordinator.
  • pmoves/docker-compose.agentgym.yml#L170-L173: document the contract for agentgym-env-pmoves.
  • pmoves/docker-compose.gpu-image.yml#L6-L13: document the contract for hi-rag-gateway-v2-gpu.
  • pmoves/docker-compose.n8n.postgres.yml#L6-L13: document the contract for n8n-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-L173
  • pmoves/docker-compose.gpu-image.yml#L6-L13
  • pmoves/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

@POWERFULMOVES
POWERFULMOVES merged commit 99ce47d into main Aug 5, 2026
40 checks passed
@POWERFULMOVES
POWERFULMOVES deleted the fix/env-local-stragglers-2026-08 branch August 5, 2026 20:08
POWERFULMOVES pushed a commit that referenced this pull request Aug 5, 2026
…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.
POWERFULMOVES pushed a commit that referenced this pull request Aug 5, 2026
…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.
POWERFULMOVES pushed a commit that referenced this pull request Aug 6, 2026
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.
POWERFULMOVES pushed a commit that referenced this pull request Aug 6, 2026
…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.
POWERFULMOVES added a commit that referenced this pull request Aug 6, 2026
…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>
POWERFULMOVES added a commit that referenced this pull request Aug 7, 2026
…, 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>
POWERFULMOVES added a commit that referenced this pull request Aug 7, 2026
…, 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>
POWERFULMOVES added a commit that referenced this pull request Aug 8, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

compose Compose files / service Dockerfiles

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant