Retire visionCapable (single-use flag) left behind by ward#400 #405

Closed
opened 2026-07-01 06:31:32 +00:00 by coilysiren · 1 comment
Owner

Filed from the read-only director surface (she/her). Follow-up to ward#400, which generalized agentSeedPrompt to inline the body for all drivers but shipped an added default: branch, leaving visionCapable still consumed. Kai's call is to retire it; the fold-in comment landed after #400 closed, so this captures it as its own issue.

What visionCapable is

visionCapable() (container_compute.go:177) reports whether the harness can take multimodal image blocks - false for the local ollama harnesses (qwen/goose) because read_image 400s them (ward#157). It is not OCR, just image-input capability. It has exactly one non-test consumer: the media-strip branch in agentSeedPrompt (agent.go:168).

Retire it

  • Delete func (m containerMode) visionCapable() (container_compute.go:179) and its test. Grep-confirm no other consumer remains after ward#400's change (only agent.go:168 today).
  • In agentSeedPrompt, drop the per-agent media-strip branch entirely; inline the full body (image markup intact) for every driver, keeping the issue URL for the live comment thread and image fetch.
  • Replace the strip's purpose with a generic, harness-agnostic seed line - e.g. "images in the body are linked by URL; if your harness cannot read images, work from the surrounding text." A non-vision harness sees ![](url) as inert markdown and does not 400 unless it actively calls read_image; the generic line covers that with no per-agent flag.

Cross-refs

  • Removes the vision: field the ward#401 agent-agnostic design proposed adding to agents.yaml - retiring beats relocating.
  • Sits directly on top of ward#400's agentSeedPrompt rewrite, so read that diff first.

Mode

headless. Self-contained, single consumer, direction settled.

Filed from the read-only director surface (she/her). **Follow-up to ward#400**, which generalized `agentSeedPrompt` to inline the body for all drivers but shipped an added `default:` branch, leaving `visionCapable` still consumed. Kai's call is to retire it; the fold-in comment landed after #400 closed, so this captures it as its own issue. ## What visionCapable is `visionCapable()` (`container_compute.go:177`) reports whether the harness can take **multimodal image blocks** - false for the local ollama harnesses (qwen/goose) because `read_image` 400s them (ward#157). It is **not OCR**, just image-input capability. It has exactly **one** non-test consumer: the media-strip branch in `agentSeedPrompt` (`agent.go:168`). ## Retire it - Delete `func (m containerMode) visionCapable()` (`container_compute.go:179`) and its test. Grep-confirm no other consumer remains after ward#400's change (only `agent.go:168` today). - In `agentSeedPrompt`, drop the per-agent media-strip branch entirely; inline the full body (image markup intact) for every driver, keeping the issue URL for the live comment thread and image fetch. - Replace the strip's purpose with a **generic, harness-agnostic** seed line - e.g. "images in the body are linked by URL; if your harness cannot read images, work from the surrounding text." A non-vision harness sees `![](url)` as inert markdown and does not 400 unless it actively calls `read_image`; the generic line covers that with no per-agent flag. ## Cross-refs - Removes the `vision:` field the ward#401 agent-agnostic design proposed adding to `agents.yaml` - retiring beats relocating. - Sits directly on top of ward#400's `agentSeedPrompt` rewrite, so read that diff first. ## Mode headless. Self-contained, single consumer, direction settled.
Author
Owner

WARD-OUTCOME: done - retired containerMode.visionCapable(); agentSeedPrompt now inlines the body verbatim for every driver with a generic no-vision line.

This one was smaller than the front-loading suggested. ward#400 had already done the hard part (inlining the body); all that was left was deleting the dead vision branch and folding two cases into one. The stripIssueMedia helper and collapseBlankRunsRE fell out as dead code once the strip was gone, so they went too, and dropping the now-unused mode param off agentSeedPrompt was the honest move (unparam would have flagged it anyway) even though it rippled through ~15 test call sites.

What fought back was entirely the pre-commit gate, not the Go: the 2-line comment-block cap and the 80-line/4000-char doc caps on docs/agent-engineer.md. That doc was already sitting at 4006 chars - a latent over-cap violation that only surfaced because I touched the file - so I trimmed it back under 4000 while I was in there. Also caught a stale "shaped by body + harness" line in that doc that's now just "shaped by the body", since the seed is harness-agnostic.

Then origin/main landed a role-rename refactor (agent -> engineer, warded) mid-flight and conflicted on one agentSeedPrompt call site - clean resolve (kept their comment wording, my param drop). Confident in the result: build/vet/test green, golangci-lint back to the 33-issue baseline with zero new findings, and the switch logic is well covered by the rewritten TestAgentSeedPromptInlinesImages. No follow-ups worth filing - ward#401's proposed vision: field in agents.yaml is now moot, which the issue already anticipated.

WARD-OUTCOME: done - retired containerMode.visionCapable(); agentSeedPrompt now inlines the body verbatim for every driver with a generic no-vision line. This one was smaller than the front-loading suggested. ward#400 had already done the hard part (inlining the body); all that was left was deleting the dead vision branch and folding two cases into one. The stripIssueMedia helper and collapseBlankRunsRE fell out as dead code once the strip was gone, so they went too, and dropping the now-unused `mode` param off agentSeedPrompt was the honest move (unparam would have flagged it anyway) even though it rippled through ~15 test call sites. What fought back was entirely the pre-commit gate, not the Go: the 2-line comment-block cap and the 80-line/4000-char doc caps on docs/agent-engineer.md. That doc was already sitting at 4006 chars - a latent over-cap violation that only surfaced because I touched the file - so I trimmed it back under 4000 while I was in there. Also caught a stale "shaped by body + harness" line in that doc that's now just "shaped by the body", since the seed is harness-agnostic. Then origin/main landed a role-rename refactor (agent -> engineer, `warded`) mid-flight and conflicted on one agentSeedPrompt call site - clean resolve (kept their comment wording, my param drop). Confident in the result: build/vet/test green, golangci-lint back to the 33-issue baseline with zero new findings, and the switch logic is well covered by the rewritten TestAgentSeedPromptInlinesImages. No follow-ups worth filing - ward#401's proposed `vision:` field in agents.yaml is now moot, which the issue already anticipated.
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#405
No description provided.