Development record
Plugin verbs render as /abcd:abcd:<verb> instead of /abcd:<verb>: the verb files live in commands/abcd/, and the harness maps a commands/ subdirectory to a namespace segment, so the directory name duplicates the plugin prefix. Verbs need to live flat under commands/ (or the subdirectory renamed away from the plugin name) for the documented /abcd:<verb> surface.
issueresolvedmajoriss-161
Plugin verbs render as /abcd:abcd:<verb> instead of /abcd:<verb>: the verb files live in commands/abcd/, and the harness maps a commands/ subdirectory to a namespace segment, so the directory name duplicates the plugin prefix. Verbs need to live flat under commands/ (or the subdirectory renamed away from the plugin name) for the documented /abcd:<verb> surface.
Frontmatter
| id | iss-161 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-161-plugin-verbs-render-as-abcd-abcd-verb.md
open on GitHub ↗ · commit history ↗
Referenced by1
- iss-162The surface's own guidance is unreachable under the double namespace: ahoy's next-step output (and the command docs) reference /abcd:ahoy and skill-style args like 'install', but the harness registers the verb as /abcd:abcd:ahoy — following the printed instruction yields 'Unknown command: /abcd:ahoy' / 'Args from unknown skill: install'. The rendered guidance must match the registered command names, whatever iss-161 settles on.blocks
mentions7
- dcn-26080500000000022026-08-05 — iss-44 + iss-160 + iss-161 + iss-162 (v0.5.0 item D, one work item): the plugin surface is reconciled with every document describing it, and the reconciliation is a MOVE rather than a rename, because the harness's namespace rule leaves no other answer. Verb files under `commands/abcd/` registered as `/abcd:abcd:<verb>` — a `commands/` subdirectory IS a namespace segment, and this one was named after the plugin, so the prefix appeared twice and every documented `/abcd:<verb>` was an unknown command (iss-161). Flattening into `commands/` is what makes the printed guidance runnable, which is why iss-162 needed no rewrite at all: all eighteen verb files already spelled `/abcd:<verb>` in their self- and cross-references — verified by grep across every one rather than assumed — so the guidance was correct prose about a name nothing registered. On iss-160 the fix direction was settled by evidence, not preference: the loader registers every markdown file under `commands/`, requiring no frontmatter and exempting no name (this repo's own iss-110 records `agents/README.md` registering as an agent; the published plugin reference describes commands purely as flat `.md` files with no ignore list), so NO in-place form keeps a readme unregistered and the only reliable home is outside the auto-discovery root. It goes to the brief's surface registry, which already enumerates the same surface and is already machine-checked against it — folding the doc into the gate that guards it rather than leaving a second enumeration to drift. The cost is one repointed link in a 2026-07-12 plan, paid because `links_resolve` is a blocker and a dangling pointer is not history. iss-44's three instances close with them: `ahoy` gains a section per sub-verb (with `identity-check` carrying an explicit CLI-only note, because its exit code is the point of wiring it into a hook — an absence recorded as a decision is not a gap), every `make build` remedy is replaced by the `go run ./cmd/abcd …` fallback the same paragraphs already carried, and `memory`'s renders stop naming a front door from `internal/core`, which is transport-agnostic by boundary rule: the heading a plain-CLI reader sees must not claim they invoked a plugin command they may not have installed. Detectors first, both watched failing: a surface-parity test over the real command tree and the real directory (flat-and-commands-only, every sub-verb reachable or scoped, no unrunnable remedy), and a string-literal check over `internal/core/memory` — literals, not comments, because prose explaining a surface may name it. `surface_coverage` gains a `bare_command` field so the flat directory's top-level board file is excluded the way README already is, rather than demanding a registry row that cannot exist; hardcoding the name would have been wrong in a lint engine that ships to repos whose plugin is not called abcd. Left alone deliberately: the historical citations of `commands/abcd/` across decisions, shipped intents, closed specs, research and resolved issues — they describe the tree as it was, and rewriting them would trade a true record for a tidy one. Not fixed here, and reported instead: the release-gate manifest's `promptHash` pins prompt text this change edits, by an algorithm nothing in the tree computes or verifies, so it is left untouched rather than guessed at.
- iss-217add a cross-agent session-capture source as an optional plugin
- iss-343commands/prepare-this-repo.md locates the record at commands/abcd/prepare-this-repo.md and says the repo root is three levels up, but the file lives flat at commands/prepare-this-repo.md (two levels up) since the iss-161 flattening — an agent following it resolves $ABCD one dir above the repo and every Phase 0/1 read misses, under a no-search-fallback directive
- iss-387the release-gate manifest pins 17 briefDocs while four shipped surface chapters (guard, ideate, identity, banlist) are outside the pin, so every full-tier crosscheck attests coverage it never ran
- iss-392bughunt round-3 confirmed nitpick batch — zero-padded record-id filenames evade the id-uniqueness lint in all three families; the go-version lockstep test skips .yaml workflows; scripts/*.sh lack the eol=lf pin the repo's own policy states; agents/CHANGELOG announces lifeboat-reviewer 0.1.1 while the prompt carries 0.1.0; five live records still route to the pre-flattening commands/abcd/ and retired docs/reference pages
- iss-2608231021254712The relationship between the CLI command tree and the plugin command surface is an open decision with no record that says so, so it is invisible to anyone scanning open work. The 2026-08-22 verb-taxonomy hand-run routed five parts and filed four. The fifth was HELD: whether the CLI tree is an engine API that the flat plugin surface merely calls, so the two need not carry the same spellings. It was not filed because an ADR records a ratified choice and the maintainer had not ruled, which was the right call at the time and is now the problem: nothing prompts the ruling. Its only durable homes are prose. research/notes/2026-08-15-decomposition-calibration.md names it in one HELD line inside a graded entry, and research/notes/2026-08-22-ideate-cli-verb-taxonomy-restructure.md discusses decoupling only as part of the idea it killed, so a reader of the verdict would reasonably conclude the question died with the restructure. It did not. The killed proposal was a noun-verb hierarchy with invented category nouns; the surviving question is narrower and independent of it. What makes it live rather than academic: the two surfaces are ALREADY not one to one, in both directions and by explicit config. Three commands are host-delegated markdown with no Go verb, and changelog, spec and rules are Go verbs with no markdown surface. So decoupling as a principle is precedented and partially in force, and what has never been decided is whether that is a deliberate architecture or an accumulation of exceptions. The verdict's leg 2 and leg 3 supply the evidence either way: iss-161 records that the harness structurally refuses a nested markdown surface, so the plugin side cannot mirror a nested CLI even if wanted; and the strongest recorded objection is that decoupling deletes the three-way name join, on which the surface_coverage sub-verb pass depends, against roughly 109 fenced binary invocations and 18 argument-hint lines under commands/. Deciding it settles whether a future CLI-side change may diverge from the plugin spelling at all, which is a precondition for any grouping, nesting or rename proposal that touches only one side. Not urgent, and deliberately carrying no proposal: this capture exists so the question is answerable from the ledger rather than only from a research note a later reader has no reason to open.
- itd-2610090831227812A person who types `/abcd:` sees the commands people use