Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .abcd/development/brief/06-delivery/03-out-of-scope.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ gate. That is what keeps "not hand-counted" true after the day it was written.
- `itd-2609150819440345` — a claim record beside the machine-scoped worktree store says which session holds which worktree, branch or record, replacing the per-session handshake (promoted from iss-2609100519122086)
- `itd-2609151138388536` — the decisions log becomes a folder of individually minted decision records with an assembled index, `DECISIONS.md` a symlink to it, in abcd and in every managed repository; the shape retires the decisions-append gate (the rule is adr-2609151138420062; promoted from iss-2609100507439414)
- `itd-2609151516525843` — a committed declaration lifts the public visibility fence so a fresh public repository can create its committed banned-names layer on day one, and a machine-global private banned-names list in the user-level home bans a name in every repository on the machine; CI never reads the home list and no pattern from it reaches a committed file (`builds_on` itd-74, `refines` adr-56; promoted from iss-2609100506269348)
- `itd-2609081951381895` — abcd ships an OpenAI-compatible api oracle adapter, the first wired provider a local MLX server with a cloud aggregator as config-only (refines adr-25; filed 2026-09-08)
- `itd-2609090746410233` — A lifeboat packs from a worktree, a branch, or an abandoned feature test, experiment or implementation, not only from a whole repository (refines itd-88 and adr-35; realises the press release's not-yet-real widening, git-source half)
- `itd-2609090746414083` — A lifeboat packs from a lab session home, the throwaway experiment's intention, harvest and bundle, with the same coverage honesty as a repository (refines itd-88 and adr-35; the non-git half, sequenced after the lab verb family)
<!-- /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,43 @@
---
id: itd-2609081951381895
slug: abcd-ships-an-openai-compatible-api-oracle-adapter-the-first
spec_id: null
kind: null
suggested_kind: null
reclassification_history: []
builds_on: []
severity: minor
impact: additive
origin: researcher-authored
production_mode: hand-written
---

# abcd ships an OpenAI-compatible api oracle adapter — the first concrete implementation of adr-25's api oracle-backend shape. An operator configures a baseURL (and optional key) in .abcd/config.json and abcd routes oracle calls — reviews, audits — to that model over plain HTTP. The first wired provider is a local OpenAI-compatible server (Gropius MLX on localhost, no key needed); cloud aggregators such as OpenRouter ride the same adapter as pure configuration, not code. The host-delegated default is untouched: with no adapter configured nothing changes and no network call is attempted.

## Press Release

> _Seeded from a quoted-text intent capture. Expand into the full press-release narrative before planning._

## Why This Matters

abcd ships an OpenAI-compatible api oracle adapter — the first concrete implementation of adr-25's api oracle-backend shape. An operator configures a baseURL (and optional key) in .abcd/config.json and abcd routes oracle calls — reviews, audits — to that model over plain HTTP. The first wired provider is a local OpenAI-compatible server (Gropius MLX on localhost, no key needed); cloud aggregators such as OpenRouter ride the same adapter as pure configuration, not code. The host-delegated default is untouched: with no adapter configured nothing changes and no network call is attempted.

## 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

_None recorded yet._

## Audit Notes

_Empty. Populated by intent-auditor when intent moves to shipped/._
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
id: itd-2609090746410233
slug: a-lifeboat-packs-from-a-worktree-a-branch-or-an-abandoned-fe
spec_id: null
kind: null
suggested_kind: null
reclassification_history: []
builds_on: []
severity: minor
impact: additive
origin: researcher-authored
production_mode: hand-written
---

# A lifeboat packs from a worktree, a branch, or an abandoned feature test, experiment or implementation, not only from a whole repository

## Press Release

> _Seeded from a quoted-text intent capture. Expand into the full press-release narrative before planning._

## Why This Matters

A lifeboat packs from a worktree, a branch, or an abandoned feature test, experiment or implementation, not only from a whole repository

## 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

_None recorded yet._

## Audit Notes

_Empty. Populated by intent-auditor when intent moves to shipped/._
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
id: itd-2609090746414083
slug: a-lifeboat-packs-from-a-lab-session-home-the-throwaway-exper
spec_id: null
kind: null
suggested_kind: null
reclassification_history: []
builds_on: []
severity: minor
impact: additive
origin: researcher-authored
production_mode: hand-written
---

# A lifeboat packs from a lab session home, the throwaway experiment's intention, harvest and bundle, with the same coverage honesty as a repository

## Press Release

> _Seeded from a quoted-text intent capture. Expand into the full press-release narrative before planning._

## Why This Matters

A lifeboat packs from a lab session home, the throwaway experiment's intention, harvest and bundle, with the same coverage honesty as a repository

## 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

_None recorded yet._

## Audit Notes

_Empty. Populated by intent-auditor when intent moves to shipped/._
Original file line number Diff line number Diff line change
Expand Up @@ -1350,6 +1350,63 @@ Per hand-run, append:
capability for any of them, which is consistent with the design documents
having scheduled them for a later iteration.

### 2026-09-08 — the OpenAI-compatible api oracle adapter (hand-run at filing, one proposal in two framings)

- **Proposal:** one capability offered in two framings across consecutive
prompts — "an OpenRouter api adapter", then "an api adaptor for a local
server (Gropius)". Both name the same record: abcd reaching a model over a
direct HTTP API, adr-25's `api` oracle-backend shape, with the provider
(cloud aggregator vs localhost MLX server) as configuration.
- **Initial routing:** the adapter as the intent (refining adr-25, sibling of
itd-6's mcp-shape adapter); backend resolution via `oracle.backend` config
as brief plumbing already designed; provider-credential handling as covered
by existing scanner/redaction invariants (itd-152, itd-28) unless key
storage becomes abcd's job; the host-delegated-default stance as already
settled by adr-25. The ahoy-time "probe OpenRouter and offer it" discovery
behaviour surfaced as a second part inside the proposal.
- **Confirmed routing:** the human confirmed the generic
provider-agnostic intent (not a Gropius-only narrow one), and routed the
OpenRouter discovery-and-offer behaviour OUT to a captured issue
(iss-2609081951416843) rather than folding it into the intent's acceptance
criteria. No split: every piece kept its initial home. The intent filed as
itd-2609081951381895 with the first wired provider the local Gropius MLX
server and OpenRouter named as config-only.
- **Verdict:** FILE-AS-IS, with one part (ahoy discovery-and-offer) captured
separately at the human's choice.
- **Notes:** the same proposal arriving twice under two provider framings was
itself the decomposition signal — the run turned on recognising that
"OpenRouter" and "Gropius" are values of one configuration axis, not two
capabilities, so the choice put to the human was generic-vs-narrow rather
than capability-vs-trust-rule. Second run in a row where the home was
already occupied (adr-25 names the shape; itd-6 is the sibling adapter) and
the work was filling an existing slot, not minting a concept.

### 2026-09-09 — the lifeboat widens to narrower sources (hand-run at filing)

- **Proposal:** "expand the lifeboat mechanics to also cover (beside entire
repos) a worktree, lab session, and otherwise abandoned feature
test/experiment/implementation" — the widening the press release had
recorded that morning under the not-yet-real marker.
- **Initial routing:** one capability intent (narrower sources); source-kind
plumbing and the git-assuming acceptance rows to the brief's disembark
chapter as a refinement of adr-35; the harness-name confinement on a pack
from a lab home as already covered by adr-39 rule 6 and scan-before-write,
flagged rather than filed; the graveyard's tier-0 reading of abandoned
branches noted as existing behaviour (adr-35 §7). Typed links: refines
itd-88 and adr-35; touches the 2026-08-31 lab convention, the unfiled
capstone lab intent, itd-118 and itd-8. No reversal.
- **Confirmed routing:** the human SPLIT by source kind — git sources
(worktree, branch, abandoned feature work) as one intent, the lab session
home as another, because the second source is not a repository and its
packer waits on the lab verb family. Filed as itd-2609090746410233 and
itd-2609090746414083. The plumbing and trust parts kept their initial homes.
- **Verdict:** SPLIT (proposed FILE-AS-IS; the initial routing did not
survive on the count of intents, survived on every other part).
- **Notes:** the split axis was the SOURCE's nature (git vs non-git), not a
trust rule inside a capability — a new split shape for the corpus. Third run
in a row where the home was already occupied: adr-35 owns the mechanics,
itd-88 the coverage readout, and both intents fill slots those records left
rather than minting a concept.
## 2026-09-09 — sub-agent transcript capture (itd-2609090559376002)

- **Proposal:** the transcript store keeps only the top-level session
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
schema_version: 1
id: "iss-2609081951416843"
slug: "setup-discovery-ahoy-could-probe-openrouter-reachability-and"
severity: "minor"
category: "observation"
source: "user-observation"
found_during: "manual-capture"
origin: researcher-authored
production_mode: hand-written
---

Setup discovery (ahoy) could probe OpenRouter reachability and, when reachable, offer it to the user as an opt-in code-review oracle — once the OpenAI-compatible api oracle adapter ships, OpenRouter is provider config (baseURL https://openrouter.ai/api/v1 + key), and the offer is an ahoy-time question, never an auto-selected backend.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
schema_version: 1
id: "iss-2609091037191879"
slug: "a-release-cut-in-progress-is-invisible-to-every-other-sessio"
severity: "minor"
category: "observation"
source: "user-observation"
found_during: "manual-capture"
origin: researcher-authored
production_mode: hand-written
---

A release cut in progress is invisible to every other session, so a change landing on main during a cut is discovered in the changelog rather than chosen. abcd should let launch declare a cut lease that peer sessions, merges and record closes can see: a session about to merge or close a record during a lease is told which cut it would join and who is cutting, and the cutting session rules on the ordering. The convention is in AGENTS.md (concurrent sessions); this seeds the mechanical form, alongside session presence (iss-2608220750029993) and itd-33.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
schema_version: 1
id: "iss-2609151150180399"
slug: "the-abcd-intent-skill-text-grounds-section-shows-the-ready-g"
severity: "minor"
category: "bug"
source: "agent-finding"
found_during: "peer session report 2026-09-15 (a teaching-repo session planning five intents)"
origin: researcher-authored
production_mode: hand-written
found_at: "commands/intent.md"
---

The /abcd:intent skill text (Grounds section) shows the ready --grounds --json envelope carrying "redacted": 0 and asks the host to report grounds.redacted whenever it is non-zero, but GroundsResult.Redacted (internal/core/intent/grounds.go) is tagged omitempty, so the key is absent whenever the count is zero. A host following the page finds no key at all on every ordinary write (five of five in the reporting session, v0.8.0 plugin binary) and cannot tell an omitted zero from a missing field. Either the skill text says the key is omitted when zero, or the envelope carries it always; the envelope's own convention for counts elsewhere (json_empty_collections_test) should decide which.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
schema_version: 1
id: "iss-2609151150180583"
slug: "docs-lint-exempt-paths-cannot-excuse-a-file-from-links-resol"
severity: "minor"
category: "bug"
source: "agent-finding"
found_during: "peer session report 2026-09-15 (a teaching-repo session planning five intents)"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/lint/lint.go"
---

docs lint: exempt_paths cannot excuse a file from links_resolve. contentExempt (internal/core/lint/lint.go, around the function at line 2675) covers only the content-authoring checks (banned_tokens, persona_registry), so a tool-mandated mirror of a root file into a subdirectory (a repo that must carry .github/copilot-instructions.md byte-identical to its root AGENTS.md, because that tool follows no pointer) raises a links_resolve blocker per relative link that resolves from the root and not from the mirror's directory, with no way to excuse it short of dropping the links. Observed on the v0.8.0 plugin binary: three blockers on one mirror. Workaround the adopter took: name companion pages as backticked paths with a shell guard checking each exists. Either let exempt_paths (or a dedicated key) excuse a path from links_resolve, or document that the link check has no exemption so authors of tool-mandated mirrors know in advance.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
schema_version: 1
id: "iss-2609170627427239"
slug: "the-status-line-badge-s-default-state-reads-abcd-which-says"
severity: "minor"
category: "ux"
source: "user-observation"
found_during: "first run of the v0.9.0 status line after ahoy install, 2026-09-17"
origin: researcher-authored
production_mode: hand-written
found_at: "internal/core/statusline/badge.go"
---

The status-line badge's default state reads 'abcd', which says the tool is present but not that this repository is managed by it; make the managed-and-nobody-waiting badge read 'abcd-managed' in an abcd-managed repository, so the word on the row states the fact the badge exists to show, alongside the facilitator and product-thinker states.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
schema_version: 1
id: "iss-2609170640135192"
slug: "a-local-branch-whose-pull-request-has-merged-is-never-pruned"
severity: "minor"
category: "process"
source: "user-observation"
found_during: "local branch sweep of the [redacted-user] checkout, 2026-09-17"
origin: researcher-authored
production_mode: hand-written
---

A local branch whose pull request has merged is never pruned, so a checkout accumulates them until somebody sweeps by hand: this checkout held 57 on 2026-09-17, one per landed PR since early September. The sweep cannot be 'git branch --merged', because the repository allows squash and rebase merges and those leave no ancestry, so 20 of the 57 read as unmerged by ancestry and were provably merged only by patch-id or by the forge's PR state; and a branch checked out in a worktree survives the sweep until the worktree is removed. abcd knows the merge state (the resolution gates already read origin/main and the PR), so the install step or a fetch-time pass could list the merged branches and remove them on consent, never one with unmerged patches, never one a worktree holds, and never a name matching a backup pattern.