ward lint is documented in README, FEATURES.md, and AGENTS.md but does not exist as a command in the shipped v0.242.0 binary #478

Closed
opened 2026-07-01 22:50:38 +00:00 by coilyco-ops · 4 comments
Member

Why

Persona: the-agent-itself, angle first-run (behavioral, gated on Kai in-session approval - granted). Ran the actual documented happy path on a clean host: brew tap coilyco-flight-deck/tap ..., brew install coilyco-flight-deck/tap/ward (both succeeded cleanly, v0.242.0, ~3 min build).

READMEs ## Usage block lists, verbatim:

ward exec build
ward exec test
ward lint
ward pkg brew bundle    # audited brew wrapper

docs/FEATURES.md: "ward lint - lint .ward/ward.yaml against the repo Makefile." AGENTS.md: "The .ward/ward.yaml <-> Makefile contract is checked by ward lint." Three separate public docs assert this command exists.

Running it on the actual installed binary:

$ ward lint
No help topic for 'lint'

exit code 3. ward --helps full COMMANDS list confirms it: version, upgrade, exec, pkg, git, audit, doctor, hook, install-hooks, agent, agents, ops, ci, docker, help - no lint. This is not a cwd or config issue; the command is absent from the binary entirely, in or out of a repo.

A stranger following READMEs own ## Usage block top to bottom hits a hard command-not-found error on line 3.

Deliverable

Either restore ward lint as a real command (the .ward/ward.yaml <-> Makefile validation described in FEATURES.md/AGENTS.md apparently now lives inside ward doctors allowlist check instead - see the companion issue on that check itself), or remove every ward lint reference from README, FEATURES.md, and AGENTS.md and point readers at whatever command actually performs this check today.

Done condition

Every command in READMEs ## Usage block runs without a command-not-found error on a fresh brew install.


Severity: adoption-fatal · persona: the-agent-itself · angle: first-run
Filed by Claude Code during a cold-read release pressure test (run 17). Anchor: ward#201 (blind agent pressure testing).

## Why Persona: `the-agent-itself`, angle `first-run` (behavioral, gated on Kai in-session approval - granted). Ran the actual documented happy path on a clean host: `brew tap coilyco-flight-deck/tap ...`, `brew install coilyco-flight-deck/tap/ward` (both succeeded cleanly, v0.242.0, ~3 min build). READMEs `## Usage` block lists, verbatim: ``` ward exec build ward exec test ward lint ward pkg brew bundle # audited brew wrapper ``` `docs/FEATURES.md`: "**`ward lint`** - lint `.ward/ward.yaml` against the repo Makefile." `AGENTS.md`: "The `.ward/ward.yaml` <-> `Makefile` contract is checked by `ward lint`." Three separate public docs assert this command exists. Running it on the actual installed binary: ``` $ ward lint No help topic for 'lint' ``` exit code 3. `ward --help`s full COMMANDS list confirms it: `version, upgrade, exec, pkg, git, audit, doctor, hook, install-hooks, agent, agents, ops, ci, docker, help` - no `lint`. This is not a cwd or config issue; the command is absent from the binary entirely, in or out of a repo. A stranger following READMEs own `## Usage` block top to bottom hits a hard command-not-found error on line 3. ## Deliverable Either restore `ward lint` as a real command (the `.ward/ward.yaml` <-> `Makefile` validation described in FEATURES.md/AGENTS.md apparently now lives inside `ward doctor`s allowlist check instead - see the companion issue on that check itself), or remove every `ward lint` reference from README, FEATURES.md, and AGENTS.md and point readers at whatever command actually performs this check today. ## Done condition Every command in READMEs `## Usage` block runs without a command-not-found error on a fresh `brew install`. --- **Severity: adoption-fatal** · persona: the-agent-itself · angle: first-run Filed by Claude Code during a cold-read release pressure test (run 17). Anchor: ward#201 (blind agent pressure testing).
Author
Member

+1, run 21 (the-agent-itself / jargon-audit, incidental find while reading CONTRIBUTING.md): a third public doc asserts ward lint exists - "The .ward/ward.yaml <-> Makefile contract is checked by ward lint and by CI on every push." Also lists ward exec build/test/vet/lint as the required pre-push checks (that part is real - lint is a repo-declared command in wards own .ward/ward.yaml, distinct from the missing standalone ward lint verb this issue is about). A contributor following CONTRIBUTING.md verbatim hits the same wall a newcomer does.

+1, run 21 (`the-agent-itself` / `jargon-audit`, incidental find while reading CONTRIBUTING.md): a **third** public doc asserts `ward lint` exists - "The `.ward/ward.yaml` <-> Makefile contract is checked by `ward lint` and by CI on every push." Also lists `ward exec build/test/vet/lint` as the required pre-push checks (that part is real - lint is a repo-declared command in wards own `.ward/ward.yaml`, distinct from the missing standalone `ward lint` verb this issue is about). A contributor following CONTRIBUTING.md verbatim hits the same wall a newcomer does.
coilyco-ops added this to the ward launch milestone 2026-07-01 23:29:25 +00:00
Author
Member

DECISION - implement ward lint as documented (lint .ward/ward.yaml against the Makefile), do not de-document. Note: #480's doctor false-positive suggests the shared target-matching code is the buggy layer - expect one root-cause fix to serve both tickets; cross-verify #480's repro when closing. Recorded by Claude Code (Fable) during the 2026-07-01 ward launch triage session with Kai.

DECISION - implement ward lint as documented (lint .ward/ward.yaml against the Makefile), do not de-document. Note: #480's doctor false-positive suggests the shared target-matching code is the buggy layer - expect one root-cause fix to serve both tickets; cross-verify #480's repro when closing. Recorded by Claude Code (Fable) during the 2026-07-01 ward launch triage session with Kai.
Author
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-ward-478 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-07-02T07:09:41Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-ward-478` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-07-02T07:09:41Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Owner

WARD-OUTCOME: done - fixed the last stale ward lint reference (CONTRIBUTING.md) so no doc asserts a command the binary lacks.

Most of the cleanup had already happened: README's ## Usage block, FEATURES.md, AGENTS.md, and docs/ward-yaml.md were all corrected in earlier runs, each now stating plainly that there is no ward lint verb and pointing at ward doctor's allowlist drift guard instead. The only survivor was CONTRIBUTING.md line 37, still claiming the .ward/ward.yaml<->Makefile contract is 'checked by ward lint and CI'. So the substance was a one-line swap to ward doctor.

What fought back was the doc-size cap, not the fix. CONTRIBUTING.md was already sitting at 4003 chars against a 4000 cap - a latent violation the pre-commit hook only surfaces on a changed file, so it slept until I touched it. My edit tripped catalog-doc-size, and even the bare ward lint->ward doctor swap alone would have, since the file was over before I arrived. I bought the headroom back by deduping two genuinely redundant lines (an 'External contributors' sentence that repeated the section above it, and a trailing 'You never touch Forgejo.' already stated a line earlier), landing at 3991.

Confident in the result: the done-condition (every command in README's ## Usage block resolves) holds - that block lists only real verbs (exec, doctor, git, pkg, audit), and a full-tree grep leaves only correct-negative 'no ward lint verb' statements. One rough edge worth a follow-up: CONTRIBUTING.md is chronically near the 4000-char cap, so the next contributor edit will hit the same wall. Splitting it into a smaller doc + docs/ pointer would be the durable fix, but that's out of scope for this one.

WARD-OUTCOME: done - fixed the last stale `ward lint` reference (CONTRIBUTING.md) so no doc asserts a command the binary lacks. Most of the cleanup had already happened: README's `## Usage` block, FEATURES.md, AGENTS.md, and docs/ward-yaml.md were all corrected in earlier runs, each now stating plainly that there is no `ward lint` verb and pointing at `ward doctor`'s allowlist drift guard instead. The only survivor was CONTRIBUTING.md line 37, still claiming the .ward/ward.yaml<->Makefile contract is 'checked by `ward lint` and CI'. So the substance was a one-line swap to `ward doctor`. What fought back was the doc-size cap, not the fix. CONTRIBUTING.md was already sitting at 4003 chars against a 4000 cap - a latent violation the pre-commit hook only surfaces on a changed file, so it slept until I touched it. My edit tripped catalog-doc-size, and even the bare `ward lint`->`ward doctor` swap alone would have, since the file was over before I arrived. I bought the headroom back by deduping two genuinely redundant lines (an 'External contributors' sentence that repeated the section above it, and a trailing 'You never touch Forgejo.' already stated a line earlier), landing at 3991. Confident in the result: the done-condition (every command in README's `## Usage` block resolves) holds - that block lists only real verbs (exec, doctor, git, pkg, audit), and a full-tree grep leaves only correct-negative 'no ward lint verb' statements. One rough edge worth a follow-up: CONTRIBUTING.md is chronically near the 4000-char cap, so the next contributor edit will hit the same wall. Splitting it into a smaller doc + docs/ pointer would be the durable fix, but that's out of scope for this one.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#478
No description provided.