Development record
abcd's help renders in labelled command groups, and the grouping is gated like every other surface claim
Widened on 2026-09-21 by the product thinker: the grouped list is the person's, one line above it says
--agentexpands it, and--help --agentrenders two blocks, people then agents and hosts. The scope invariant below ("no verb hidden") stands for execution: every verb runs the same whichever block lists it. The verb consolidation is its own record (itd-2609212130136102), and the one-sentence explainer per verb another (itd-2609212113220149).
Press Release
abcd's command list reads as a map instead of an alphabet.
abcd --helprenders its verbs under labelled groups: set-up, records, conformance checks, repository portability, release. A reader looking for the verb that fits the job scans five headings rather than twenty lines in alphabetical order. Every invocation is unchanged. No verb is renamed, moved, nested, or hidden, and the release derives as additive because the surface diff sees nothing to report.The grouping is also gated, which is the half that makes it last. The committed command-tree snapshot records each visible verb's group, a test asserts the rendered help actually carries the headings, and a second test fails when a newly registered visible verb declares no group.
"I inherited the repo and typed
abcd --helpon day one," said Henry, a new hire. "I could read every line, so nothing was broken. What I could not do was tell which three of them I needed that morning, because alphabetical order putsahoynext tobanlistand tells you nothing about either.""The part I care about is that it cannot rot," said Kira, who maintains the surface. "If I add a verb and forget its group, the test tells me. If a group changes, the snapshot diff shows it. That is the same bar every other claim about this surface is already held to."
Why This Matters
abcd --help lists twenty-two lines: twenty visible verbs, plus help and
completion, which cobra generates. A twenty-first verb, hook, is registered
and hidden. Five further verbs are reserved but unbuilt. The list is legible
today and there is no demonstrable legibility failure to point at, which the
research recorded in
2026-08-22-ideate-cli-verb-taxonomy-restructure.md
tested and confirmed. What alphabetical order costs is not readability but
orientation: it carries no information about what any verb is for.
That same research killed the obvious alternative. Regrouping into a noun-verb
hierarchy fails here for reasons specific to this repository: abcd already
nests under the object wherever the semantic-ambiguity trigger fires
(lint, docs lint, memory lint; intent audit; banlist add), sixteen of
the twenty-one registered verbs already own sub-commands across seventy-three
command paths, and the pre-1.0 no-alias rule in adr-40 forecloses the migration
path the external precedents relied on.
What is left is a rendering problem, and cobra answers rendering problems directly. This intent takes that answer and attaches the detectors the adversarial review found missing from it.
What's In Scope
- Command groups on the root:
AddGroupon the root and aGroupIDon every visible top-level verb, plusSetHelpCommandGroupIDandSetCompletionCommandGroupIDso cobra's two generated commands are filed rather than falling into the "Additional Commands" bucket. - No verb hidden, renamed, moved, or nested.
rulesandspecstay listed. They are operator-facing, and theoperator_internalkey inrecord-lint.jsonmeans needs no surface chapter, which is a lint exemption rather than a user-visibility verdict. Hiding them would make--helpcontradict theahoy-installed marker block, which tells every managed repository to runabcd rules. - The snapshot records the group: A group field on the surface snapshot's
Command, populated for visible top-level verbs and empty for sub-commands, so a regroup is visible in the committed command tree and its drift test. - A test asserts the rendered help. Nothing asserts root help text today, so the render is currently unguarded in both directions.
- A test fails on a visible top-level verb with no group. Hidden commands are exempt: they never render, so a group would be a claim about nothing.
What's Out of Scope
- Any change to a verb's name, position, or invocation.
- Hiding any currently visible verb.
- Folding
changelogunderlaunch. - Adding a kind to the surface break taxonomy. The taxonomy is closed by
design, and
surface.Diffreturns only breaks: the release guardrail fails any cut whose diff is non-empty unless a record declaresimpact: breaking. A "non-breaking regroup kind" is therefore a contradiction, because adding the kind is what would make a regroup breaking. A regroup is invisible to the diff, and that is the correct behaviour. The snapshot field, not the taxonomy, is where a regroup becomes visible.
Mechanism
We expect grouped help to shorten the time a reader takes to find the right verb because the grouping carries information alphabetical order does not: the reader discards four groups wholesale rather than reading twenty summaries. This is falsifiable. If the groups are drawn badly enough that a reader reads every entry anyway, the change costs a screen of vertical space and returns nothing, and the honest response is to say so rather than redraw them indefinitely.
We expect the detectors to matter more than the grouping because a detector
blind at the grain of a claim is blind at that grain, however sound it is
elsewhere. iss-246 is the recorded instance, in its corrected form: the
surface_coverage rule existed and passed while sub-verb-level claims in the
record drifted, because the rule could not see inside a surface row. The fix
extended the detector to that grain and corrected the three documents. A
snapshot that records no group is blind to groups in exactly the same way, and
a grouping shipped without one would repeat the defect it was chosen over.
Scope Conditions
- Holds for a CLI whose top level is a set of acts rather than resources. Should abcd grow a genuine resource with several verbs that no existing verb owns, the noun-verb question reopens as a real one rather than a tidiness one.
- Holds for cobra. The grouping mechanism is a cobra feature, so a change of command framework re-decides this.
- Holds while no third-party author registers verbs. An extension ecosystem would break the ungrouped-verb test, because the core cannot assign a group to a verb it does not register.
- The group titles and membership are a presentation choice, not a taxonomy claim. They carry no adr-40 bucket meaning and must not be read as one.
SOTA
The alternative: Presentational command groups in the CLI framework, as
kubectl renders them (beginner and intermediate sections) and Terraform does
(main commands against all other commands). cobra implements this natively
through AddGroup and GroupID.
Maturity: Mature, and de-facto standard for cobra CLIs of this size.
Path: adopt the SOTA alternative (path 1). Path 1 is normally a hard stop for maintainer approval, because adoption means a new dependency. Here it adds none: the repository already pins cobra v1.10.2, which carries the feature, so the gate has nothing to weigh. The three native additions (the snapshot field and the two tests) are a small complement cobra does not offer rather than a bespoke build. Whether that reading of the path is right is an open question below rather than a decision this intent takes for the maintainer.
Rejected alternatives, with reasons recorded in the ideate verdict
2026-08-22-ideate-cli-verb-taxonomy-restructure.md:
a noun-verb restructure with category nouns; hiding operator-facing verbs;
Heroku-style colon topics; an extension-verb growth valve.
Acceptance Criteria
- Given
abcd --help, when it renders, then the person's verbs appear under labelled groups (set-up, records, checks, portability, release), with one line above them saying--agentexpands the list with the verbs agents and hosts call. - Given
abcd --help --agent, when it renders, then two blocks appear, the person's groups then an agents-and-hosts block, and every visible verb is in exactly one block. - Given any verb, when it runs, then it runs the same whichever block lists it; a visible top-level verb registered with no group or block fails a test.
- Given the surface snapshot, when a verb's group or block changes without regeneration, then the release gate fails naming the verb.
- Given a verb's command page, when it is read, then it says which block the verb is in, and each line of the agent block names the page an agent reads next.
- Given
abcd rulesandabcd spec, when--helprenders, then they keep their places; nothing is renamed or nested.
Decisions
Ruled by the product thinker on 2026-09-21:
- Two blocks behind one flag: the default list is the person's groups with the expanding line above;
--agentshows both blocks. Nothing is hidden from execution. - Group titles: set-up (
ahoy,update), records (capture,intent,spec,decide,build,drain,memory), checks (lint), portability (embark,disembark), release (launch); the agent block holdsimplement,reading,history,statusline,changelog,guard hook,intent audit ingest,ideate record,mode. - The snapshot's schema version bumps for the block field;
changelogsits in the agent block.
Open Questions
None open; decisions 2 and 3 settle the four this record carried.
Audit Notes
Fidelity review — receipt rcp-cdad1c08a756 (verifier intent-auditor claude-fable-5-1).
Provenance: intent-auditor@claude-fable-5-1 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:a5093def235101890b0ba5cb8060612e82f504450885985e82d28a296fb20155 Input attestations: diff:4bac5e5d (feat(cli): abcd's help renders in labelled command groups), read in the tree at main 811fba17@sha256:1a38691fd8f9092a0f6281f00bda5427509404a12ff9ad9ded6e3e727b8d838f;
Acceptance rollup: MET 6 · MET_WITH_CONCERNS 0 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET: the live
abcd --helprenders Set-up, Records, Checks, Portability and Release under the one line naming --help --agent, and the test pins the section titles, the line's position above the first group and each group's members evidence: internal/surface/cli/helpgroups.go:56 — "helpExpandLine =Run "abcd --help --agent" to expand this list with the verbs agents and hosts call." evidence: internal/surface/cli/helpgroups.go:44 — "var helpPeopleGroups = []*cobra.Group{" evidence: internal/surface/cli/helpgroups_test.go:66 — "func TestRootHelpListsThePersonsGroups" - ac-2 — MET: with --agent the render writes the people block then the agents-and-hosts block, and the test walks every available top-level command asserting it is listed under exactly one section evidence: internal/surface/cli/helpgroups.go:287 — "if agent {" evidence: internal/surface/cli/helpgroups_test.go:112 — "func TestRootHelpAgentRendersBothBlocks" evidence: internal/surface/cli/helpgroups_test.go:133 — "want exactly one section"
- ac-3 — MET: placement only sets GroupID and annotations, an agents-block verb is executed through the CLI in the test, and a visible top-level verb with no declared group fails TestEveryVisibleVerbHasAGroup, whose detector is proved able to fail by TestUngroupedVerbIsNamed evidence: internal/surface/cli/helpgroups_test.go:219 — "func TestPlacementChangesNoInvocation" evidence: internal/surface/cli/helpgroups_test.go:189 — "func TestEveryVisibleVerbHasAGroup" evidence: internal/surface/cli/helpgroups.go:211 — "func ungroupedVerbs(root *cobra.Command) []string {"
- ac-4 — MET: the snapshot carries Group and Block per command, the release guard refuses when the binary's surface differs from the committed snapshot and names each moved verb through PlacementChanges, and the guard test asserts the refusal reads
abcd capture: group records → checksevidence: internal/core/surface/snapshot.go:95 — "Group stringjson:"group,omitempty"" evidence: internal/core/surface/snapshot.go:275 — "func PlacementChanges(committed, current Snapshot) []string {" evidence: internal/core/changelog/guard.go:195 — "if !bytes.Equal(wantBytes, gotBytes) {" evidence: internal/core/changelog/guard_test.go:477 — "abcd capture: group records → checks" - ac-5 — MET: every command page backing a visible top-level verb declares
block:and the test holds it to the tree's placement; each agents-block line ends(read commands/<page>.md)and the test reads that page and requires it to mention the entry evidence: internal/surface/cli/helpgroups_test.go:277 — "func TestCommandPagesDeclareTheirBlock" evidence: internal/surface/cli/helpgroups.go:306 — "fmt.Fprintf(w, " %-*s %s (read %s)\n", width, e.name, e.short, e.page)" evidence: internal/surface/cli/helpgroups_test.go:163 — "which does not exist" - ac-6 — MET: rules and spec are placed as visible top-level verbs (set-up and records) and the test asserts both are unhidden, top-level and listed in the default help evidence: internal/surface/cli/helpgroups_test.go:239 — "func TestRulesAndSpecKeepTheirPlaces" evidence: internal/surface/cli/helpgroups.go:91 — ""rules": {group: groupSetUp}," evidence: internal/surface/cli/helpgroups.go:97 — ""spec": {group: groupRecords},"
Gap audit:
- honoured:
- the command list reads as a map: five labelled groups, every invocation unchanged, no verb renamed, moved, nested or hidden evidence: internal/surface/cli/helpgroups.go:16 — "Placement is presentation only. No verb is hidden, renamed, moved or nested by" evidence: internal/surface/cli/helpgroups_test.go:219 — "TestPlacementChangesNoInvocation"
- the grouping is gated: the snapshot records the placement, a test asserts the rendered help, and a newly registered visible verb with no group fails a test evidence: internal/surface/cli/helpgroups_test.go:307 — "func TestSurfaceSnapshotRecordsHelpPlacement" evidence: internal/surface/cli/helpgroups_test.go:189 — "TestEveryVisibleVerbHasAGroup"
- the snapshot's schema version bumps for the placement fields and older versions stay readable (decision 3) evidence: internal/core/surface/snapshot.go:35 — "Version 2 added each command's help placement (Command.Group and" evidence: internal/core/surface/snapshot.go:49 — "var readableVersions = map[int]bool{1: true, 2: true, 3: true, SchemaVersion: true}"
- help and completion are filed under set-up rather than an Additional Commands bucket evidence: internal/surface/cli/helpgroups.go:133 — "root.SetHelpCommandGroupID(groupSetUp)"
- diverged:
- decision 2 names the agents block as nine entries; the delivered block lists eighteen (banlist, docs, guard, ideate, identity, inbox, peers, report, site added) under a technical ruling the orchestrator recorded on 2026-09-25 as subject to the product thinker's review on return, and build and drain are absent from records because they are not built evidence: internal/surface/cli/helpgroups.go:104 — ""banlist": {group: groupAgents, page: "commands/banlist.md"}," evidence: dcn-2609250000000021 — "Help placement of the verbs itd-146's decision 2 does not name: the orchestrator's technical ruling"
- missing: (none)
Scope-condition dispositions:
- cond-2609212139580802 — survived: every placed entry is an act (a verb path), and the groups sort acts by who runs them, so the top level is still a set of acts evidence: internal/surface/cli/helpgroups.go:88 — "var helpPlacements = map[string]helpPlacement{"
- cond-2609212139580635 — survived: the grouping is cobra's own AddGroup/GroupID and the render replaces only the root's help function, as the condition assumed evidence: internal/surface/cli/helpgroups.go:131 — "root.AddGroup(helpPeopleGroups...)" evidence: internal/surface/cli/helpgroups.go:154 — "root.SetHelpFunc(func(cmd *cobra.Command, args []string) {"
- cond-2609212139582531 — untested: no third party registers a verb in this tree, so nothing in the delivery exercised or contradicted the assumption
- cond-2609212139588587 — survived: the placement carries no adr-40 bucket meaning by its own statement, and a regroup is reported by the release guard as a stale snapshot to regenerate rather than as a surface break
evidence: internal/surface/cli/helpgroups.go:18 — "carry no adr-40 bucket meaning"
evidence: internal/core/changelog/guard.go:217 — "const regenerateRemedy = "regenerate and commit it with
go generate ./internal/surface/cli""
Grounds
- pursued: the run lands build, drain, implement, reflect and reclassify, and an alphabet of forty verbs is where a newcomer gives up; we expect a person to find their verb in the grouped list and an agent to find the second block from the line above it; shown wrong if the first agent transcripts after it ships still grep the binary for verbs
Frontmatter
| id | itd-146 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | minor |
.abcd/development/intents/shipped/itd-146-abcd-s-help-renders-in-labelled-command.md
open on GitHub ↗ · commit history ↗
References4
- adr-2609212115255771Phases and milestones are retired: sequencing is dependencies rendered as status, the checkpoint is the derived releaserelated
- itd-134Every abcd-managed CLI greets like abcd does: one command scaffolds a banner for a managed repo, rendered from that repo's canonical identity block — name, tagline, version — as a committed, language-neutral artefact (the generator emits the rendered banner, not code), so a CLI in any language opens with its own identity without hand-drawing anything. Split out of itd-112 at its 2026-08-21 grill: itd-112 keeps abcd's own banner and the colour ladder; this intent carries the managed-repo generator and the per-repo accent question.related
- itd-2609212113220149Every verb's help opens with one sentence an agent can act onrelated
- itd-2609212130136102abcd's verbs consolidate: modes become flags and five checks become one lintrelated
Referenced by13
- iss-261026203158220704-scope defines operator-internal verbs, rules and spec among them, as wiring with no commands/ file; itd-146 says operator_internal only means 'needs no surface chapter' and treats rules as user-facing.related
- iss-2610262031588576itd-146 places a changelog verb in the root help's agent block; 04-naming's register of exempt surfaces, which says every exemption is on the record, does not list it.related
- iss-2610262033090287itd-146 puts a `changelog` verb in the agent help block; the launch chapter says the changelog verb is retired and refused as an unknown commandrelated
- iss-2610262033133368itd-146 says the ahoy-installed marker block tells every managed repository to run `abcd rules`; the ahoy chapter says a default install writes that block into no conventions filerelated
- iss-2610262037453214itd-146 groups memory with the person's records verbs in help; 37-memory says help lists the memory verb with the agentsrelated
- iss-2610262039384176itd-146 groups `spec`, `drain` and `memory` under records, `lint` under checks and `changelog` in the agent block; the surfaces register's help table puts those verbs with the agents and `changelog` in neither blockrelated
- iss-2610262043574593itd-146 lists `memory` among the person's records verbs; itd-2610091918433290 says `/abcd:memory` is an agent's command for memory notesrelated
- iss-2610262044580425itd-146 files drain in the person's records group; itd-82 says drain joins the person's list only when itd-82 shipsrelated
- iss-2610262044589669itd-146 keeps rules and spec listed so --help matches the marker block; itd-2610090831227812 makes rules and spec agent-onlyrelated
- itd-2609212113220149Every verb's help opens with one sentence an agent can act onbuilt on by
- itd-2609212130136102abcd's verbs consolidate: modes become flags and five checks become one lintbuilt on by
- itd-2610090831227812A person who types `/abcd:` sees the commands people usebuilt on by
- spc-2609212139586554abcd-s-help-renders-in-labelled-command-groups-and-the-groupimplemented by
mentions12
- adr-40Review, audit, lint, and gate are four buckets, separated by what each compares
- dcn-26092100000000012026-09-21 — Phases and milestones are retired, and the word roadmap with them (product thinker, at an interactive interview after an independent research pass; adr-2609212115255771 supersedes adr-9). Sequencing is dependencies plus the lifecycle shelves, rendered as a Now / Next / Later status block on the `abcd` board and the site (itd-2609212103568351), never stored; the checkpoint is the derived release plus each intent's acceptance criteria, with an optional `target_release` the cut reports and moves forward (itd-2609212103572513); the unit below a spec is the step, a section not a family (itd-2609212103565953); an issue carries no spec by design; the batch is the run's internal order; one page maps the families (itd-2609211913453478). itd-24 becomes release retrospectives; itd-34 drops its phase rule. Same interview: `build` is the verb a person types and `implement` the loop (itd-2609201916151817 decision 8), the loop takes an issue key (decision 10), only the loop writes a verdict (decision 9); the person's command list is grouped with an agents block behind `--agent` (itd-146), every verb opens with a does/writes/refuses sentence (itd-2609212113220149), modes become flags and five checks one lint (itd-2609212130136102, breaking); the status-line badge is guarded and reset (itd-2609212130146198); a new capture or draft is matched and linked at filing, never refused (itd-2609212137116617); abcd's text names the product thinker or the technical facilitator and never the maintainer (itd-2609212137129937, captured for the run, no sweep today); the lab conventions become `abcd lab` (itd-2609212137128014); a managed repository's site goes live by one verb behind a provider seam (itd-2609061543533170).
- dcn-26092500000000212026-09-25 — Help placement of the verbs itd-146's decision 2 does not name: the orchestrator's technical ruling for itd-146, taken by the implementing lane of autonomous run A and subject to the product thinker's review on return (recorded, not asked). The principle applied is the intent's own: a verb goes in the block of whoever runs it, and where a verb could go either way it goes to the agents-and-hosts block, because itd-2609212130136102 AC5 caps the person's list at fourteen verbs and decision 2's thirteen (with `build` and `drain`, not yet built and left out until they are) leave room for one. People, set-up: `rules` (criterion 6 keeps it in the person's default list; a person inspects the rule set the loader injects, and the `ahoy` marker block tells them to run it), plus cobra's generated `help` and `completion` (a person runs both; itd-146 counts them apart from the verbs, "twenty visible verbs, plus help and completion", so they do not press on the fourteen; and neither has a command page an agents-block line could name). Agents and hosts, each line naming the page read next: `banlist` (commands/banlist.md; its lists are maintained by the agent at the person's word and enforced by the commit gate), `docs` (docs.md; its lint folds into `lint docs` under itd-2609212130136102 and `cite` maintains a baseline), `guard` (guard.md; the agent asks it before running a shell command, and `guard hook` is the host's adapter), `ideate` (ideate.md; the gauntlet runs in the host from the page, and the binary's one act is `ideate record`), `identity` (identity.md; folds into `lint identity`, and `init` runs inside prepare-this-repo), `inbox` (inbox.md; the session-start greeting hands it to the agent in abcd's own checkout), `peers` (peers.md; AGENTS.md has the agent run it before capturing, resolving or picking a record), `report` (report.md; the agent in a managed repository fills the template), `site` (site.md; build and check run in the release gate, and the check folds into `lint site`), `version` (version.md; hosts and agents read it, and it becomes `--version`). Decision 2's agent entries take these pages: `implement`, `reading`, `history`, `mode` their own; `changelog` commands/launch.md (the page that runs the cut it previews); `statusline` commands/ahoy.md (the page whose install wires it); `guard hook` guard.md; `intent audit ingest` intent.md; `ideate record` ideate.md. Group ids: set-up, records, checks, portability, release, agents. The snapshot records `group` and `block` at schema version 2, and version 1 stays readable because every release tag before this one carries it.
- dcn-26092500000000232026-09-25 — How itd-2609212130136102's consolidation is built where its record leaves a choice: the implementing lane's technical rulings in autonomous run A, subject to the product thinker's review on return (recorded, not asked). The identity mode is spelt `--identity`, as the intent's scope names it, not `--identity-check`. A spelling that moved WHOLE (`ahoy dry-run`, `ahoy identity-check`, `version`, `docs lint`, `site check`) becomes a stub carrying cobra's `Deprecated` field, which lists it nowhere and keeps it out of the person's count; it accepts any argument and flag the old spelling took, runs nothing, and answers exit 2 naming its successor, with cobra's deprecation line routed to stderr so a `--json` caller reads exactly one refusal on stdout. A verb whose BARE form moved while its sub-verbs stay (`identity`, whose `render` and `init` stay; `ahoy remote`, whose `apply` stays) keeps its place and only its bare invocation answers; deprecating it would have hidden live sub-verbs. `lint identity` is what bare `identity` printed (the block and every surface's verdict), because that is the check; `identity render` proposes a correction, a distinct act, and stays, which reads the intent's "identity render" among the five spellings as the identity family's check (itd-146's lane read it the same way). Bare `lint` runs every target that judges the repository: docs, identity and the outbound policy over committed files were already rules (`docs-currency`, `identity-positioning`, `privacy-hygiene`), and the site joins as a `site-gates` rule, Where-gated on `.abcd/site.json`, rendering into a temporary directory outside the repository and removing it so bare lint still writes nothing, at warn severity as docs-currency is; `lint outbound` stays out of the bare run because its subject is text the caller hands it. `version --check` names `update --check`, the rest of `version` names `--version`; `update --check` prints the old `version --check` report, takes no tag, excludes `--yes` and never constructs the updater. `intent new` is refused as an unknown sub-verb in every shape, including before prose, so it can never be filed as a draft titled "new …". The snapshot records `moved_to` at schema version 4 (version 3 stays readable, the last tag's shape); the brief's appendix omits a whole-moved stub and names the successor where the bare form moved, `surface_coverage` needs no row for a moved spelling and refuses one that names it, and the generated CLI reference omits the stubs. `commands/version.md` stays as a page with no block that runs `--version`. The site workflow's release path probes the released binary's `lint` listing and falls back to `site check` for a tag cut before this release. The spec's remainder spec for removing the stubs is not minted: a remainder close keeps the intent planned, and the run brief closes it shipped, so the removal is captured as an issue instead (implementer of lane consolidate).
- iss-246`surface_coverage` is blind inside a row, so `shipped` means "the top-level verb exists" and every unbuilt sub-verb hides behind it.
- iss-2608221126066632Live recurrence, 2026-08-22: two concurrent sessions in two current checkouts each minted itd-144 and itd-145 in the same window — four records, two ids — resolved by hand-renumbering one side to itd-146/147. This is the second, undocumented path into the sequential-id collision recorded as iss-2608220150157512, which describes the stale-view path adr-45 already anticipated. Staleness was NOT the cause here: one session fast-forwarded 46 commits immediately before minting and still collided. The structural fact is that intents and specs mint max+1 (nextIntentID) while withIntentMintLock in internal/core/intent/create.go is advisory and scoped to a single checkout, so it cannot see a sibling worktree; two current checkouts therefore allocate the same id by construction. The durable fix is the timestamp mint adoption recorded as iss-2608210737260468. Recorded deliberately because capture has no add-evidence path and itd-87 (recurrence escalation) is unbuilt, so this evidence would otherwise exist only in two session transcripts.
- iss-2608221310142705New top-level verbs face no design-time test outside the assessment family, and the ideate verdict on the verb taxonomy left one unclaimed. adr-40 already imposes a design-time test, but only on assessment surfaces and only on one axis: what is compared to what, with a surface that would perform two acts split at design time rather than documented as a bundle. It says nothing about whether a proposed verb belongs at the top level at all, so a non-assessment verb faces no test. The 2026-08-22 ideate verdict (research/notes/2026-08-22-ideate-cli-verb-taxonomy-restructure.md) killed an open-ended 'restructure when confusable pairs appear' deferral because a condition with no detector is the phantom gate enforcement-claims-are-facts forbids. What it put in that place is a design-time question asked when a verb is proposed: does an existing record-owning verb already own this act? The question is answerable by the human designing the verb, which a trigger conditioned on future confusion is not. Five unbuilt verb names are already in play across three different statuses, so the test has live subjects: dredge, loot and audit sit in the reserved table of brief/02-constraints/04-naming.md; audit and reflect sit on its metaphor-exemptions list; and oracle is in neither, appearing only as a design-target sub-verb under a note recording that no oracle verb is registered. It currently exists only inside a research note, which is not where a design-time rule can be found by the person who needs it. Decide its home: a principle under development/principles/, a line in the naming register at brief/02-constraints/04-naming.md beside the existing metaphor-vs-exempt criterion and the bare-command-as-render discipline, or an explicit decision to leave it in the verdict record. itd-146 carries the same question as an open question; this capture exists so the test survives that intent not shipping.
- iss-2610090849280432The issue-resolution gate (RS004) does not count a Refs: line that names an issue alongside an intent, such as 'Refs: itd-2610090831227812, iss-2610090831317531, itd-146': DECLARE_RE in scripts/check-issue-resolution.sh accepts a line listing iss- ids and nothing else, so the issue on a mixed line reads as an undeclared mention. The refusal then asks for exactly one declaration line, which the commit already appears to carry, and never says the line was passed over because it also names an intent, so the author cannot tell what is wrong. Found on 2026-10-09 when make preflight refused a records commit.
- iss-2610262039536939itd-2609212130136102 caps the person's default verb list at fourteen; the README says neither surface caps it and lists seventeen.
- iss-2610262045411383itd-2609212130136102 caps the person's list at fourteen verbs; itd-2610090831227812 rules that neither surface caps it
- itd-2610301327282266abcd's help fits the screen it is read on
- spc-2610100613109045a-person-who-types-abcd-sees-only-the-commands-people-use