diff --git a/.abcd/development/brief/06-delivery/03-out-of-scope.md b/.abcd/development/brief/06-delivery/03-out-of-scope.md index 3eb75053..09084c4f 100644 --- a/.abcd/development/brief/06-delivery/03-out-of-scope.md +++ b/.abcd/development/brief/06-delivery/03-out-of-scope.md @@ -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) **Later-phase items with no intent id.** These four were written into the brief diff --git a/.abcd/development/intents/drafts/itd-2609081951381895-abcd-ships-an-openai-compatible-api-oracle-adapter-the-first.md b/.abcd/development/intents/drafts/itd-2609081951381895-abcd-ships-an-openai-compatible-api-oracle-adapter-the-first.md new file mode 100644 index 00000000..a881cb4f --- /dev/null +++ b/.abcd/development/intents/drafts/itd-2609081951381895-abcd-ships-an-openai-compatible-api-oracle-adapter-the-first.md @@ -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/._ diff --git a/.abcd/development/intents/drafts/itd-2609090746410233-a-lifeboat-packs-from-a-worktree-a-branch-or-an-abandoned-fe.md b/.abcd/development/intents/drafts/itd-2609090746410233-a-lifeboat-packs-from-a-worktree-a-branch-or-an-abandoned-fe.md new file mode 100644 index 00000000..82f720c9 --- /dev/null +++ b/.abcd/development/intents/drafts/itd-2609090746410233-a-lifeboat-packs-from-a-worktree-a-branch-or-an-abandoned-fe.md @@ -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/._ diff --git a/.abcd/development/intents/drafts/itd-2609090746414083-a-lifeboat-packs-from-a-lab-session-home-the-throwaway-exper.md b/.abcd/development/intents/drafts/itd-2609090746414083-a-lifeboat-packs-from-a-lab-session-home-the-throwaway-exper.md new file mode 100644 index 00000000..e5f6c895 --- /dev/null +++ b/.abcd/development/intents/drafts/itd-2609090746414083-a-lifeboat-packs-from-a-lab-session-home-the-throwaway-exper.md @@ -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/._ diff --git a/.abcd/development/research/notes/2026-08-15-decomposition-calibration.md b/.abcd/development/research/notes/2026-08-15-decomposition-calibration.md index e6285e10..a7a23e36 100644 --- a/.abcd/development/research/notes/2026-08-15-decomposition-calibration.md +++ b/.abcd/development/research/notes/2026-08-15-decomposition-calibration.md @@ -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 diff --git a/.abcd/work/issues/open/iss-2609081951416843-setup-discovery-ahoy-could-probe-openrouter-reachability-and.md b/.abcd/work/issues/open/iss-2609081951416843-setup-discovery-ahoy-could-probe-openrouter-reachability-and.md new file mode 100644 index 00000000..d8352884 --- /dev/null +++ b/.abcd/work/issues/open/iss-2609081951416843-setup-discovery-ahoy-could-probe-openrouter-reachability-and.md @@ -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. diff --git a/.abcd/work/issues/open/iss-2609091037191879-a-release-cut-in-progress-is-invisible-to-every-other-sessio.md b/.abcd/work/issues/open/iss-2609091037191879-a-release-cut-in-progress-is-invisible-to-every-other-sessio.md new file mode 100644 index 00000000..0e4c2f92 --- /dev/null +++ b/.abcd/work/issues/open/iss-2609091037191879-a-release-cut-in-progress-is-invisible-to-every-other-sessio.md @@ -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. diff --git a/.abcd/work/issues/open/iss-2609151150180399-the-abcd-intent-skill-text-grounds-section-shows-the-ready-g.md b/.abcd/work/issues/open/iss-2609151150180399-the-abcd-intent-skill-text-grounds-section-shows-the-ready-g.md new file mode 100644 index 00000000..f5e66fe7 --- /dev/null +++ b/.abcd/work/issues/open/iss-2609151150180399-the-abcd-intent-skill-text-grounds-section-shows-the-ready-g.md @@ -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. diff --git a/.abcd/work/issues/open/iss-2609151150180583-docs-lint-exempt-paths-cannot-excuse-a-file-from-links-resol.md b/.abcd/work/issues/open/iss-2609151150180583-docs-lint-exempt-paths-cannot-excuse-a-file-from-links-resol.md new file mode 100644 index 00000000..fd47c474 --- /dev/null +++ b/.abcd/work/issues/open/iss-2609151150180583-docs-lint-exempt-paths-cannot-excuse-a-file-from-links-resol.md @@ -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. diff --git a/.abcd/work/issues/open/iss-2609170627427239-the-status-line-badge-s-default-state-reads-abcd-which-says.md b/.abcd/work/issues/open/iss-2609170627427239-the-status-line-badge-s-default-state-reads-abcd-which-says.md new file mode 100644 index 00000000..344cad6d --- /dev/null +++ b/.abcd/work/issues/open/iss-2609170627427239-the-status-line-badge-s-default-state-reads-abcd-which-says.md @@ -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. diff --git a/.abcd/work/issues/open/iss-2609170640135192-a-local-branch-whose-pull-request-has-merged-is-never-pruned.md b/.abcd/work/issues/open/iss-2609170640135192-a-local-branch-whose-pull-request-has-merged-is-never-pruned.md new file mode 100644 index 00000000..1079eb1d --- /dev/null +++ b/.abcd/work/issues/open/iss-2609170640135192-a-local-branch-whose-pull-request-has-merged-is-never-pruned.md @@ -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.