Skip to content
1 change: 1 addition & 0 deletions .abcd/development/brief/06-delivery/03-out-of-scope.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ gate. That is what keeps "not hand-counted" true after the day it was written.
- `itd-2610070550516046` — On the dashboard, a product thinker sees the brief and their ideas together, and puts the ideas in order (draft)
- `itd-2610071545369520` — A person confirms the assistant's verdict on each warned banned-name line instead of judging it alone (draft)
- `itd-2610071545380041` — Work about abcd itself goes to abcd as a report, never into a managed repository's own plans (draft)
- `itd-2610090831227812` — A person's /abcd: list shows only the commands people use (draft)
<!-- /index -->

**Later-phase items with no intent id.** These four were written into the brief
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
id: itd-2610090831227812
slug: a-person-who-types-abcd-sees-only-the-commands-people-use
spec_id: null
kind: null
suggested_kind: null
reclassification_history: []
builds_on: []
severity: minor
origin: researcher-authored
production_mode: hand-written
---

# A person's /abcd: list shows only the commands people use

## Press Release

> A person who types /abcd: sees only the commands people use. The commands agents run, such as the ones that apply a host's verdict or step a build loop, sit under one agent namespace or off the person's list, so the list a person scans reads as their own toolbox and an agent still finds every verb it needs. The command-line help already splits the two into For people and For agents and hosts; the plugin's command list now follows the same split.

## Why This Matters

> _Why this matters to the user — replace before planning._

## Mechanism

> _Prompted (the claim-recording gradient): why the authors expect this to work, as a falsifiable "we expect X because Y" — not the outcome restated. Replace this line with the claim, or with the exact token `None stated.` alone on its line to record the claim as considered and declined._

## Scope Conditions

> _Required (the claim-recording gradient): the population, platform, scale, or assumptions this claim holds under, one per top-level bullet — `abcd intent plan` stamps each with a persistent identity. Replace this line with those bullets, or with the exact token `None stated.` alone on its line._

## Acceptance Criteria

> _Required (the itd-1 discipline): add at least one Given-When-Then bullet describing the verifiable bar for "shipped" before this draft can be planned._

## Open Questions

- Does an agent verb leave the /abcd: list altogether, or move under one agent command page? The boundary that every verb is reachable from both the CLI and the plugin surface (AGENTS.md, Boundaries) is flagged as a possible reversal here, for the product thinker to confirm or keep.
- Which verbs are a person's and which an agent's is settled by the verb audit, iss-2610090831317531, before planning.
- Would a later recommendation of which verb fits a situation belong to this intent, or to a separate one?

## Audit Notes

_Empty. Populated by intent-auditor when intent moves to shipped/._
Original file line number Diff line number Diff line change
Expand Up @@ -2332,3 +2332,14 @@ Verdict: FILE-AS-IS, decided by the facilitator on the product thinker's "Clear?
Verdict: FILE-AS-IS. The facilitator proposed one goal or two (review/prioritise, and the picture); the product thinker chose one. The links and the stance's routing were not put to a question, so those rows are graded as unconfirmed.

Follow-up the same day on the revisit mark (itd-2610070549060530): the product thinker answered its six open questions, and ruled that the mark also raises an idea in the build pick, so the row flagged as a possible change to itd-2609211116005482 is now confirmed as an intended change, to be specified at planning.

## 2026-10-09: people's and agents' verbs kept apart (technical facilitator, routing confirmed)

| part | type | home |
|---|---|---|
| a person's /abcd: list shows only the commands people use; agent commands move under one agent namespace or off the list | capability | intent itd-2610090831227812 (draft); refines itd-146, which split the CLI help |
| a review of the whole verb set: keep, merge, rename or retire each, and class it as a person's or an agent's | audit | issue iss-2610090831317531, feeding the intent's spec |
| a rule for which class a verb belongs to | trust rule | held: a decision record only if the audit finds a verb whose class decides who may run it |
| "every verb is reachable from both the CLI and the plugin surface" | standing boundary, flagged as a possible reversal for confirmation | the intent's Open Questions, not decided here |

Verdict: SPLIT. The facilitator proposed the three-way routing and confirmed it as proposed ("Split as proposed"). The reversal flag was carried in the question, not put to a separate one, so that row is graded unconfirmed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090742488191"
slug: "when-an-idea-is-adopted-nothing-carries-the-public-primary"
severity: "minor"
category: "process"
source: "user-observation"
found_during: "2026-10-09 product thinker capture"
origin: researcher-authored
production_mode: hand-written
found_at: "ACKNOWLEDGEMENTS.md"
remedy: "When an idea graduates from a verdict into an intent, carry the verdict's public primary sources and their licence findings into the intent, and have the change that ships the intent add the ACKNOWLEDGEMENTS.md entry naming only public sources; adopt the idea, never text or code whose licence is absent or does not allow it, and make record-lint or the intent close name a shipped intent whose recorded sources have no acknowledgement."
---

When an idea is adopted, nothing carries the public primary sources it rests on into ACKNOWLEDGEMENTS.md. AGENTS.md asks for an entry in the same change that lands an adopted pattern, but ideas now arrive through ideate verdicts kept private in the home store (iss-2610090740139804), so the sources and the licence findings the research leg checked stay in a file the adopting change never reads, and a private source must never be named at all.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090744063842"
slug: "adr-0007-and-acknowledgements-md-link-the-prd-template-s"
severity: "nitpick"
category: "drift"
source: "agent-finding"
found_during: "2026-10-09 ideate research leg"
origin: researcher-authored
production_mode: hand-written
found_at: ".abcd/development/decisions/adrs/0007-grill-skill-and-glossary.md"
remedy: "Repoint the credit to the commit that last held to-prd (a permalink to that SKILL.md at its last commit) so the attribution still resolves, in the ADR and in itd-27 alike."
---

ADR 0007 and the superseded itd-27 link the PRD template's source at mattpocock/skills skills/engineering/to-prd/SKILL.md, but that skill was merged into to-spec and to-tickets upstream on 2026-07-08, so the link now answers 404 and no longer shows the source it credits.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090744073409"
slug: "the-concurrency-rule-in-abcd-rules-json-and-its-agents-md"
severity: "nitpick"
category: "drift"
source: "agent-finding"
found_during: "2026-10-09 ideate research leg"
origin: researcher-authored
production_mode: hand-written
found_at: ".abcd/rules.json"
remedy: "Change 'in drafts/' to 'planned' in the CONCURRENCY rule text and anywhere else that repeats it, and let the rule say the store has no verbs yet because the planned intent has not shipped."
---

The CONCURRENCY rule in .abcd/rules.json (and its AGENTS.md short form, if it repeats it) says the worktree store's own verbs are itd-2609091014076309, in drafts/, but that intent is in planned/; its link already points at planned/, so the prose contradicts the link beside it.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090744325698"
slug: "the-product-thinker-s-2026-10-07-lesson-that-a-user-visible"
severity: "minor"
category: "process"
source: "agent-finding"
found_during: "2026-10-09 ideate research leg"
origin: researcher-authored
production_mode: hand-written
found_at: "AGENTS.md"
remedy: "Graduate the lesson into the record, per the memory-graduates-to-record principle: a line in AGENTS.md's definition of done and a rule in a rules.json domain that recalls on fix and release prompts, saying a user-visible host fix lands only with a live before-and-after capture of the person's surface, cited in the pull request."
---

The product thinker's 2026-10-07 lesson, that a user-visible host fix is proven by a capture of a live session before and after the change and never by script output alone (v0.13.2's hook fix passed its tests while every live session still showed the error), is held only in one agent's local memory. No committed rule, principle or definition of done carries it; its only committed trace is the measurement inside iss-2610070637562567, so another session or contributor never receives it.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090747102654"
slug: "abcd-has-a-place-for-a-short-note-of-where-the-work-stands"
severity: "minor"
category: "ux"
source: "agent-finding"
found_during: "2026-10-09 ideate research leg"
origin: researcher-authored
production_mode: hand-written
found_at: "AGENTS.md"
remedy: "Give the handover note a writer and a freshness check: a verb that writes a dated where-we-are entry (appending, never replacing unread), offered at Stop and PreCompact as draft itd-2610050548126044 plans, with the session-start greeting naming the note's age; keep it in the local tier or a home store keyed on the root commit so removing a worktree does not lose it, never committed."
---

abcd has a place for a short note of where the work stands now, the local-tier handover file .abcd/.work.local/NEXT.md, but nothing keeps it: no command writes it, nothing says when it is stale, the PreCompact and Stop hooks write nothing durable to it, a session can overwrite it unread, and it is lost when the worktree holding it is removed. A short note of where the work stands, rewritten every session, is the one thing an outside agent-memory pattern adds over abcd's brief; abcd keeps it out of the repository on purpose, but leaves it unmaintained.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090748299348"
slug: "a-public-source-behind-an-idea-is-named-in-the-repository"
severity: "minor"
category: "process"
source: "user-observation"
found_during: "2026-10-09 product thinker capture"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/ideate.md"
remedy: "Tie source naming to adoption: a killed or abandoned verdict stays in the home store with its sources and never moves to the repository; publishing a verdict and the ACKNOWLEDGEMENTS.md entry happen only for an accepted idea (iss-2610090742488191), and the publish step refuses a verdict whose outcome is killed."
---

A public source behind an idea is named in the repository only once the idea is accepted. An idea that is rejected, killed or abandoned names none of its sources anywhere public (no record, research note, decision line, commit or pull request), only in its private verdict; nothing enforces this today, and ideate record currently writes every verdict's sources into the committed research notes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090824041378"
slug: "the-status-board-s-now-list-shows-a-run-s-lanes-with-an"
severity: "minor"
category: "bug"
source: "user-observation"
found_during: "2026-10-09 /abcd status board"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/statusblock/statusblock.go"
remedy: "Look an issue-keyed run up in the issue ledger and render its title (marking it as an issue), and leave a lane out of Now once its pull request has merged or its branch is gone (or have the landing record the run as done when the merge is seen); test both with an issue-keyed run fixture, one in flight and one merged, watched fail first."
---

The status board's Now list shows a run's lanes with an empty title when the run was started for an issue rather than an intent: statusblock.go builds each started run's row by looking the id up in the intent corpus only, so an issue-keyed lane (every drain lane, every 'abcd build <iss-N>' run) renders as a bare 'building:' line. It also counts a lane as building after its pull request merged: on 2026-10-09 the product thinker's view showed 24 blank 'building:' rows, the overnight drain's lanes, most merged days earlier but still recorded at the land stage because nothing moves a run on once its pull request lands.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090831317531"
slug: "abcd-s-verbs-have-never-been-reviewed-as-a-set-nothing-lists"
severity: "minor"
category: "ux"
source: "user-observation"
found_during: "2026-10-09 product thinker intent on human and agent verbs"
origin: researcher-authored
production_mode: hand-written
found_at: "commands"
remedy: "Audit every verb and command page into one table (verb, page, person or agent, keep/merge/rename/retire, and why), written as the first section of itd-2610090831227812's spec at planning, and capture a decision record only where a verb's class decides who may run it."
---

abcd's verbs have never been reviewed as a set: nothing lists every CLI verb and /abcd: command page with whether people or agents mainly use it, and whether it should be kept, merged, renamed or retired. Draft intent itd-2610090831227812 (a person's /abcd: list shows only the commands people use) needs that classification before its spec can say which pages move.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090841317423"
slug: "abcd-dashboard-start-never-starts-on-a-mac-whose-tailscale"
severity: "major"
category: "bug"
source: "user-observation"
found_during: "2026-10-09 product thinker could not open the dashboard"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/surface/dashboard/gate.go"
remedy: "Treat a listening address whose self-check cannot connect as one to drop, not a reason to stop: keep the addresses that answered (refusing to start only when none does), name the dropped one and why in the start line, and test it with a listener whose IPv6 self-connect fails while IPv4 answers, watched fail first."
---

abcd dashboard start never starts on a Mac whose Tailscale cannot reach its own IPv6 address. Start listens on both of the computer's Tailscale addresses and requires a self-check fetch to answer on every one; on 2026-10-09, with Tailscale 1.102.4 on macOS, a TCP connection to the computer's own Tailscale IPv4 address succeeded while one to its own Tailscale IPv6 address timed out, so the IPv6 self-check failed and start stopped the dashboard with 'could not be reached from this computer ... check that nothing on this computer blocks the port' (exit 1). Nothing blocks the port; the dashboard is unusable from every device.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090841586205"
slug: "abcd-s-dashboard-reaches-other-devices-only-through"
severity: "minor"
category: "future-work-seed"
source: "user-observation"
found_during: "2026-10-09 product thinker capture after the dashboard test"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/surface/dashboard/gate.go"
remedy: "Run a primary-source check first (WireGuard's protocol and wireguard-go's licence and embedding, how a peer's public key can stand for a named device, and key distribution), then offer WireGuard as an opt-in transport the person picks at dashboard setup, admitting a connection only from a peer key the person paired, with Tailscale staying the default; record the identity rule as an amendment to the dashboard's network decision."
---

abcd's dashboard reaches other devices only through Tailscale: it listens on the computer's Tailscale addresses and admits a device only when Tailscale's own lookup names it. The product thinker wants WireGuard as a built-in alternative the person may choose instead, so the dashboard does not depend on one vendor's account and coordination service. A plain WireGuard tunnel has no lookup that names a person's device, so the alternative needs its own device identity, such as each peer's public key mapped to a named device.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
schema_version: 1
id: "iss-2610090849280432"
slug: "the-issue-resolution-gate-rs004-does-not-count-a-refs-line"
severity: "minor"
category: "ux"
source: "agent-finding"
found_during: "2026-10-09 preflight of the records branch"
origin: researcher-authored
production_mode: hand-written
found_at: "scripts/check-issue-resolution.sh"
remedy: "Either read every iss- id on a Refs: or Resolves: line that lists record ids of any family (itd-, adr-, spc-, iss-) as declared, or keep the rule and have RS004 name the near-miss: 'a Refs: line naming iss-N beside an id of another family is not a declaration; put the issue ids on a Refs: line of their own'; add a case for the mixed line, watched fail first."
---

The 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.
Loading