Move non-agent launch helpers out of internal/agents #704

Closed
opened 2026-07-08 22:04:47 +00:00 by coilyco-ops · 8 comments
Member

Problem

internal/agents/ollamaprobe and internal/agents/modelconfig are not agents.

The internal/agents tree should hold agent harness implementations and the registry. These two packages are shared support code:

  • ollamaprobe is a local model endpoint/model availability probe used by Goose, OpenCode, and doctor-style checks.
  • modelconfig classifies model-name/config failures across Codex, Claude, OpenCode, and the Ollama probe.

Keeping them under internal/agents makes the package boundary read as if Ollama is an agent and as if model-config classification is owned by the agent registry. That is misleading, especially while debugging launch gates.

Current imports to update

  • internal/agents/goose/smoke.go imports internal/agents/ollamaprobe.
  • internal/agents/opencode/smoke.go imports internal/agents/ollamaprobe.
  • cmd/ward/doctor_probes.go imports internal/agents/ollamaprobe.
  • internal/agents/codex/smoke.go, internal/agents/claude/smoke.go, internal/agents/opencode/smoke.go, and internal/agents/ollamaprobe/ollamaprobe.go import internal/agents/modelconfig.

Do

Move these packages to a neutral shared namespace. Suggested shape:

  • internal/launchgate/ollamaprobe
  • internal/launchgate/modelconfig

A shorter internal/probes/ollama / internal/modelconfig split is also acceptable if it reads better in the tree. Pick the smallest move that makes the ownership obvious.

Then update imports, tests, and any docs/comments that refer to the old package paths.

Acceptance

  • No non-agent support packages remain directly under internal/agents/.
  • Agent implementations still import the shared launch-gate helpers cleanly.
  • ward exec test passes.
  • No behavior changes beyond package ownership/import paths.
## Problem `internal/agents/ollamaprobe` and `internal/agents/modelconfig` are not agents. The `internal/agents` tree should hold agent harness implementations and the registry. These two packages are shared support code: * `ollamaprobe` is a local model endpoint/model availability probe used by Goose, OpenCode, and doctor-style checks. * `modelconfig` classifies model-name/config failures across Codex, Claude, OpenCode, and the Ollama probe. Keeping them under `internal/agents` makes the package boundary read as if Ollama is an agent and as if model-config classification is owned by the agent registry. That is misleading, especially while debugging launch gates. ## Current imports to update * `internal/agents/goose/smoke.go` imports `internal/agents/ollamaprobe`. * `internal/agents/opencode/smoke.go` imports `internal/agents/ollamaprobe`. * `cmd/ward/doctor_probes.go` imports `internal/agents/ollamaprobe`. * `internal/agents/codex/smoke.go`, `internal/agents/claude/smoke.go`, `internal/agents/opencode/smoke.go`, and `internal/agents/ollamaprobe/ollamaprobe.go` import `internal/agents/modelconfig`. ## Do Move these packages to a neutral shared namespace. Suggested shape: * `internal/launchgate/ollamaprobe` * `internal/launchgate/modelconfig` A shorter `internal/probes/ollama` / `internal/modelconfig` split is also acceptable if it reads better in the tree. Pick the smallest move that makes the ownership obvious. Then update imports, tests, and any docs/comments that refer to the old package paths. ## Acceptance * No non-agent support packages remain directly under `internal/agents/`. * Agent implementations still import the shared launch-gate helpers cleanly. * `ward exec test` passes. * No behavior changes beyond package ownership/import paths.
Author
Member

🔒 Reserved by ward agent --harness goose — container engineer-goose-ward-704 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-07-08T22:04:53Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#704 · branch issue-704 · harness goose · workflow direct-main
  • Run: engineer-goose-ward-704 · ward v0.466.0 · dispatched 2026-07-08T22:04:53Z
  • Comment thread: 0 included in the pre-flight read, 0 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.466.0).

— Goose, via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --harness goose` — container `engineer-goose-ward-704` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-07-08T22:04:53Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#704` · branch `issue-704` · harness `goose` · workflow `direct-main` - **Run:** `engineer-goose-ward-704` · ward `v0.466.0` · dispatched `2026-07-08T22:04:53Z` - **Comment thread:** 0 included in the pre-flight read, 0 stripped (ward's own automated comments). Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.466.0). </details> <!-- ward-agent-signature --> — Goose, via `ward agent`
Author
Member

⚠️ Reopened: this run's work did not land on main

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

  • Repo: coilyco-flight-deck/ward
  • Salvage branch: ward-salvage/ward-16eb4ad0
  • Reason: missing same-repo closing reference
  • Container uptime at reap: 4m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token)

Reap diagnostics

--- reap diagnostics ---
ward version:      v0.466.0
version source:    pinned via WARD_VERSION/--ward-version (v0.466.0)
HEAD:              4622e276a147
origin/main:       c3442c3d180d
ancestry:          HEAD is NOT yet on origin/main - residual work remains to land
decision gate:     missing same-repo closing reference
reason:            missing same-repo closing reference
provenance:        present
run-owned landed:  no
working tree:      8 dirty path(s)
container uptime:  4m (baked Forgejo PAT age proxy)
--- end reap diagnostics ---

Recover

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

Working tree at reap time

 M cmd/ward/agent_review.go
 M cmd/ward/doctor.go
 M internal/agents/claude/smoke.go
 M internal/agents/codex/smoke.go
 M internal/agents/goose/smoke.go
 M internal/agents/opencode/smoke.go
 M internal/agents/opencode/smoke_test.go
?? internal/launchgate/

— Goose, via ward agent

## ⚠️ Reopened: this run's work did not land on `main` An ephemeral `ward container` (goose mode) dispatched for this issue finished but its work was **not merged to `main`**, so the reaper preserved it on a branch before teardown and reopened the issue (its `closes #704` never reached `main`). Recover from the salvage branch below. - **Repo:** `coilyco-flight-deck/ward` - **Salvage branch:** `ward-salvage/ward-16eb4ad0` - **Reason:** missing same-repo closing reference - **Container uptime at reap:** 4m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token) ## Reap diagnostics ``` --- reap diagnostics --- ward version: v0.466.0 version source: pinned via WARD_VERSION/--ward-version (v0.466.0) HEAD: 4622e276a147 origin/main: c3442c3d180d ancestry: HEAD is NOT yet on origin/main - residual work remains to land decision gate: missing same-repo closing reference reason: missing same-repo closing reference provenance: present run-owned landed: no working tree: 8 dirty path(s) container uptime: 4m (baked Forgejo PAT age proxy) --- end reap diagnostics --- ``` ## Recover ```bash git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-16eb4ad0 git checkout -b ward-salvage/ward-16eb4ad0 FETCH_HEAD ``` ## Working tree at reap time ``` M cmd/ward/agent_review.go M cmd/ward/doctor.go M internal/agents/claude/smoke.go M internal/agents/codex/smoke.go M internal/agents/goose/smoke.go M internal/agents/opencode/smoke.go M internal/agents/opencode/smoke_test.go ?? internal/launchgate/ ``` <!-- ward-agent-signature --> — Goose, via `ward agent`
Author
Member

🔒 Reserved by ward agent --harness codex — container engineer-codex-ward-704 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-07-09T00:06:54Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#704 · branch issue-704 · harness codex · workflow pr
  • Run: engineer-codex-ward-704 · ward v0.470.0 · dispatched 2026-07-09T00:06:54Z
  • Comment thread: 1 included in the pre-flight read, 1 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.470.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --harness codex` — container `engineer-codex-ward-704` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-07-09T00:06:54Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#704` · branch `issue-704` · harness `codex` · workflow `pr` - **Run:** `engineer-codex-ward-704` · ward `v0.470.0` · dispatched `2026-07-09T00:06:54Z` - **Comment thread:** 1 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-08T22:09:04Z) - stripped: @coilyco-ops (2026-07-08T22:04:54Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.470.0). </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: blocked - review summary: blocked: codex: exit status 1

Review panel verdicts:

  • codex: ERROR: codex: exit status 1 (conf 0.00)
  • claude: ERROR: claude: exit status 1 (conf 0.00)
  • goose: ERROR: goose: exit status 1 (conf 0.00)

— Codex, via ward agent

WARD-OUTCOME: blocked - review summary: blocked: codex: exit status 1 Review panel verdicts: - codex: ERROR: codex: exit status 1 (conf 0.00) - claude: ERROR: claude: exit status 1 (conf 0.00) - goose: ERROR: goose: exit status 1 (conf 0.00) <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: blocked - review gate blocked before PR creation
review summary: blocked: codex: exit status 1
The review panel failed closed on reviewer auth, so I stopped before opening a PR. The namespace move itself is clean and the test gate passed, but the land step is blocked until the reviewer can run.

WARD-OUTCOME: blocked - review gate blocked before PR creation review summary: blocked: codex: exit status 1 The review panel failed closed on reviewer auth, so I stopped before opening a PR. The namespace move itself is clean and the test gate passed, but the land step is blocked until the reviewer can run.
Author
Member

⚠️ Reopened: this run's work did not land on main

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

  • Repo: coilyco-flight-deck/ward
  • Salvage branch: ward-salvage/ward-14f676cf
  • Pull request: not opened - PR creation failed: forgejo: parse created pull request: unexpected end of JSON input
  • Reason: run workflow does not land on main (--workflow pr/patch-only)
  • Container uptime at reap: 6m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token)

Reap diagnostics

--- reap diagnostics ---
ward version:      v0.470.0
version source:    pinned via WARD_VERSION/--ward-version (v0.470.0)
HEAD:              79f67cb7aebc
origin/main:       a2a544f1a892
ancestry:          HEAD is NOT yet on origin/main - residual work remains to land
decision gate:     workflow does not land on main (--workflow pr/patch-only)
reason:            run workflow does not land on main (--workflow pr/patch-only)
provenance:        not read (workflow hold)
run-owned landed:  no
working tree:      clean
container uptime:  6m (baked Forgejo PAT age proxy)
--- end reap diagnostics ---

Recover

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

— Codex, via ward agent

## ⚠️ Reopened: this run's work did not land on `main` An ephemeral `ward container` (codex mode) dispatched for this issue finished but its work was **not merged to `main`**, so the reaper preserved it on a branch before teardown and reopened the issue (a closing reference for #704 never reached `main`). Recover from the salvage branch below. - **Repo:** `coilyco-flight-deck/ward` - **Salvage branch:** `ward-salvage/ward-14f676cf` - **Pull request:** not opened - PR creation failed: forgejo: parse created pull request: unexpected end of JSON input - **Reason:** run workflow does not land on main (--workflow pr/patch-only) - **Container uptime at reap:** 6m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token) ## Reap diagnostics ``` --- reap diagnostics --- ward version: v0.470.0 version source: pinned via WARD_VERSION/--ward-version (v0.470.0) HEAD: 79f67cb7aebc origin/main: a2a544f1a892 ancestry: HEAD is NOT yet on origin/main - residual work remains to land decision gate: workflow does not land on main (--workflow pr/patch-only) reason: run workflow does not land on main (--workflow pr/patch-only) provenance: not read (workflow hold) run-owned landed: no working tree: clean container uptime: 6m (baked Forgejo PAT age proxy) --- end reap diagnostics --- ``` ## Recover ```bash git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-14f676cf git checkout -b ward-salvage/ward-14f676cf FETCH_HEAD ``` <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-ward-704 on host kais-macbook-pro-2.local.

Reserved by ward agent --harness codex (reserved 2026-07-09T22:44:06Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h TTL). --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#704 · branch issue-704 · harness codex · workflow pull-requests-and-merge
  • Run: engineer-codex-ward-704 · ward v0.540.0 · dispatched 2026-07-09T22:44:06Z
  • Comment thread: 4 included in the pre-flight read, 2 stripped (ward's own automated comments).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.540.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-ward-704` on host `kais-macbook-pro-2.local`. Reserved by `ward agent --harness codex` (reserved 2026-07-09T22:44:06Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h TTL). `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh**. That is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#704` · branch `issue-704` · harness `codex` · workflow `pull-requests-and-merge` - **Run:** `engineer-codex-ward-704` · ward `v0.540.0` · dispatched `2026-07-09T22:44:06Z` - **Comment thread:** 4 included in the pre-flight read, 2 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-08T22:09:04Z), @coilyco-ops (2026-07-09T00:12:52Z), @coilyco-ops (2026-07-09T00:13:36Z), @coilyco-ops (2026-07-09T00:13:49Z) - stripped: @coilyco-ops (2026-07-08T22:04:54Z), @coilyco-ops (2026-07-09T00:06:57Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.540.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: merge-ready

details

workflow: pull-requests-and-merge; review summary: review gate skipped by ~/.ward/config.yaml default

  • implementation felt mechanical. the move was already in place, so this run validated the branch, opened PR #877, and waited for CI.
  • confidence: high.
  • surprises: forgejo had no open PR for issue 704, and the mergeable flag lagged behind the green status.
  • follow-ups: merge PR #877 when the director loop is ready.
WARD-OUTCOME: merge-ready <details><summary>details</summary> workflow: pull-requests-and-merge; review summary: review gate skipped by ~/.ward/config.yaml default - implementation felt mechanical. the move was already in place, so this run validated the branch, opened PR #877, and waited for CI. - confidence: high. - surprises: forgejo had no open PR for issue 704, and the mergeable flag lagged behind the green status. - follow-ups: merge PR #877 when the director loop is ready. </details>
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#704
No description provided.