Allow additional repositories with the same basename in one engineer workspace #1526

Closed
opened 2026-07-23 06:15:08 +00:00 by coilyco-ops · 6 comments
Member

Problem

A director attempted one engineer dispatch with all 31 Forgejo repositories for the CODEOWNERS rollout. The launch was rejected before reservation because two additional repositories share the basename .github:

--repo "coilyco-bridge/.github" collides on workspace dir /workspace/.github with coilyco-flight-deck/.github

Ward maps every additional owner/repo to /workspace/<repo>, so distinct repositories from different owners cannot coexist when their names match. This is especially common for organization .github repositories and makes legitimate fleet-wide work impossible in one run.

Reproduction source: coilysiren/inbox#246

Required behavior

  • Accept multiple granted repositories with the same basename.
  • Assign each repository a deterministic, collision-free workspace path. An owner-qualified layout such as /workspace/<owner>/<repo> is the obvious model, but preserve a clear primary-repository cwd and consider compatibility for existing single-owner layouts.
  • Surface the resolved owner/repo -> workspace path mapping in the launch plan and seeded agent context so engineers do not guess where a repository landed.
  • Keep duplicate identical repository grants de-duplicated.
  • Fail closed only when two refs truly resolve to the same canonical repository or path after normalization.

Acceptance

  • A launch containing both coilyco-flight-deck/.github and coilyco-bridge/.github resolves successfully.
  • Tests cover duplicate basenames across owners, repeated identical refs, primary-repository path behavior, path normalization, and printed/seeded mappings.
  • Existing one-primary/one-extra workflows remain usable and documented.
  • The original 31-repository command can pass planning without splitting at basename boundaries.
## Problem A director attempted one engineer dispatch with all 31 Forgejo repositories for the CODEOWNERS rollout. The launch was rejected before reservation because two additional repositories share the basename `.github`: ```text --repo "coilyco-bridge/.github" collides on workspace dir /workspace/.github with coilyco-flight-deck/.github ``` Ward maps every additional `owner/repo` to `/workspace/<repo>`, so distinct repositories from different owners cannot coexist when their names match. This is especially common for organization `.github` repositories and makes legitimate fleet-wide work impossible in one run. Reproduction source: https://forgejo.coilysiren.me/coilysiren/inbox/issues/246 ## Required behavior - Accept multiple granted repositories with the same basename. - Assign each repository a deterministic, collision-free workspace path. An owner-qualified layout such as `/workspace/<owner>/<repo>` is the obvious model, but preserve a clear primary-repository cwd and consider compatibility for existing single-owner layouts. - Surface the resolved `owner/repo -> workspace path` mapping in the launch plan and seeded agent context so engineers do not guess where a repository landed. - Keep duplicate *identical* repository grants de-duplicated. - Fail closed only when two refs truly resolve to the same canonical repository or path after normalization. ## Acceptance - A launch containing both `coilyco-flight-deck/.github` and `coilyco-bridge/.github` resolves successfully. - Tests cover duplicate basenames across owners, repeated identical refs, primary-repository path behavior, path normalization, and printed/seeded mappings. - Existing one-primary/one-extra workflows remain usable and documented. - The original 31-repository command can pass planning without splitting at basename boundaries.
Author
Member

WARDED_WORKFLOW: blocked 🛑

details

Brokered QA could not start because this container cannot reach the Docker daemon (unix:///var/run/docker.sock). PR #1527 test.yml is green, but director merge requires a current passing brokered-QA verdict.

The in-container review gate was intentionally skipped by the temporary ward default pending brokered QA.

workflow: pull-request-and-merge; review summary: skipped in-container gate; brokered QA blocked by unavailable Docker

Felt: implementation was straightforward and the checks are green. Confidence: high in the patch; surprise: brokered QA needs a Docker-capable host.

Follow-up: rerun ward agent qa coilyco-flight-deck/ward#1526 --harness codex from a Docker-capable Ward host, then run the director merge lane.

<!-- ward-agent-signature --> WARDED_WORKFLOW: blocked 🛑 <details><summary>details</summary> Brokered QA could not start because this container cannot reach the Docker daemon (`unix:///var/run/docker.sock`). PR #1527 test.yml is green, but director merge requires a current passing brokered-QA verdict. The in-container review gate was intentionally skipped by the temporary ward default pending brokered QA. workflow: pull-request-and-merge; review summary: skipped in-container gate; brokered QA blocked by unavailable Docker Felt: implementation was straightforward and the checks are green. Confidence: high in the patch; surprise: brokered QA needs a Docker-capable host. Follow-up: rerun `ward agent qa coilyco-flight-deck/ward#1526 --harness codex` from a Docker-capable Ward host, then run the director merge lane. </details>
Author
Member

WARDED_WORKFLOW: reservation-released

release details

Run finished with WARDED_WORKFLOW: blocked 🛑.

ward container reap released container engineer-codex-ward-1526 (--harness codex): the terminal outcome supersedes the reservation, so a later redispatch no longer needs --override-reservation.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> WARDED_WORKFLOW: reservation-released <details><summary>release details</summary> Run finished with `WARDED_WORKFLOW: blocked 🛑`. `ward container reap` released container `engineer-codex-ward-1526` (`--harness codex`): the terminal outcome supersedes the reservation, so a later redispatch no longer needs `--override-reservation`. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-WORKFLOW: done

details

workflow: pull-request-and-merge; review summary: skipped in-container gate; brokered QA was intentionally skipped by the temporary ward default pending brokered QA

Felt: the fix was already on the branch, so the work was mostly landing and verification. Confidence: high. Surprise: none beyond the earlier Docker-backed brokered-QA block. Follow-up: none.

WARD-WORKFLOW: done ✅ <details><summary>details</summary> workflow: pull-request-and-merge; review summary: skipped in-container gate; brokered QA was intentionally skipped by the temporary ward default pending brokered QA Felt: the fix was already on the branch, so the work was mostly landing and verification. Confidence: high. Surprise: none beyond the earlier Docker-backed brokered-QA block. Follow-up: none. </details>
Author
Member

WARD-WORKFLOW: blocked 🛑

salvage details

An ephemeral ward container (codex mode) dispatched for this issue finished but its work was not merged to main, so cleanup preserved it on a branch before teardown and reopened the issue (a closing reference for #1526 never reached main). Recover from the salvage branch below.

  • Repo: coilyco-flight-deck/ward
  • Salvage branch: ward-salvage/ward-70175da3
  • Pull request: not opened - PR creation failed: forgejo: parse created pull request: unexpected end of JSON input
  • Reason: merge conflict integrating onto main
  • Container uptime at reap: 3m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token)

Cleanup diagnostics

--- reap diagnostics ---
ward version:      v0.805.0
version source:    pinned via WARD_VERSION/--ward-version (v0.805.0)
HEAD:              ea3c255e046f
origin/main:       ea3c255e046f
ancestry:          HEAD is ALREADY on origin/main - a salvage here is a FALSE salvage (ward#504 signature)
decision gate:     provenance missing or unreadable on already-landed merge-remote-main run
reason:            merge conflict integrating onto main
provenance:        missing or unreadable
run-owned landed:  no
working tree:      clean
container uptime:  3m (baked Forgejo PAT age proxy)
--- end reap diagnostics ---

Recover

git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-70175da3
git checkout -b ward-salvage/ward-70175da3 FETCH_HEAD

— Codex, via ward agent

WARD-WORKFLOW: blocked 🛑 <details><summary>salvage details</summary> An ephemeral `ward container` (codex mode) dispatched for this issue finished but its work was **not merged to `main`**, so cleanup preserved it on a branch before teardown and reopened the issue (a closing reference for #1526 never reached `main`). Recover from the salvage branch below. - **Repo:** `coilyco-flight-deck/ward` - **Salvage branch:** `ward-salvage/ward-70175da3` - **Pull request:** not opened - PR creation failed: forgejo: parse created pull request: unexpected end of JSON input - **Reason:** merge conflict integrating onto main - **Container uptime at reap:** 3m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token) ## Cleanup diagnostics ``` --- reap diagnostics --- ward version: v0.805.0 version source: pinned via WARD_VERSION/--ward-version (v0.805.0) HEAD: ea3c255e046f origin/main: ea3c255e046f ancestry: HEAD is ALREADY on origin/main - a salvage here is a FALSE salvage (ward#504 signature) decision gate: provenance missing or unreadable on already-landed merge-remote-main run reason: merge conflict integrating onto main provenance: missing or unreadable run-owned landed: no working tree: clean container uptime: 3m (baked Forgejo PAT age proxy) --- end reap diagnostics --- ``` ## Recover ```bash git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-70175da3 git checkout -b ward-salvage/ward-70175da3 FETCH_HEAD ``` </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-WORKFLOW: reservation-released

release details

Run finished with WARD-WORKFLOW: blocked 🛑.

ward container reap released container engineer-codex-ward-1526 (--harness codex): the terminal outcome supersedes the reservation, so a later redispatch no longer needs --override-reservation.

— Codex, via ward agent

<!-- ward-agent-reservation-released --> WARD-WORKFLOW: reservation-released <details><summary>release details</summary> Run finished with `WARD-WORKFLOW: blocked 🛑`. `ward container reap` released container `engineer-codex-ward-1526` (`--harness codex`): the terminal outcome supersedes the reservation, so a later redispatch no longer needs `--override-reservation`. </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

Tracker reconciliation for #1574:

  • 973a7c7 and ea3c255 landed duplicate-basename workspace support on main.
  • This issue already records WARD-WORKFLOW: done.
  • The later blocked record identifies itself as a false salvage after the implementation had landed.

The agent is closing this completed issue so Ward no longer reports it as failed active work.

Codex, via advisor surface

Tracker reconciliation for https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/1574: * https://forgejo.coilysiren.me/coilyco-flight-deck/ward/commit/973a7c7 and https://forgejo.coilysiren.me/coilyco-flight-deck/ward/commit/ea3c255 landed duplicate-basename workspace support on `main`. * This issue already records `WARD-WORKFLOW: done`. * The later blocked record identifies itself as a false salvage after the implementation had landed. The agent is closing this completed issue so Ward no longer reports it as failed active work. <!-- ward-agent-signature --> Codex, via advisor surface
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/ward#1526
No description provided.