From e0a57c935f67b2a3c7049956d117a08075ae13a7 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:29:16 +0100 Subject: [PATCH 1/9] =?UTF-8?q?docs:=20file=20three=20intent=20drafts=20fr?= =?UTF-8?q?om=20the=208=E2=80=939=20September=20design=20sessions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An OpenAI-compatible api oracle adapter, the first wired provider a local MLX server with a cloud aggregator as configuration; a lifeboat that packs from a worktree, a branch or an abandoned feature rather than only a whole repository; and a lifeboat that packs from a lab session home. All three were minted through the timestamp seam at the time and never committed. Assisted-by: Claude:claude-fable-5-1 --- ...compatible-api-oracle-adapter-the-first.md | 43 +++++++++++++++++++ ...-a-worktree-a-branch-or-an-abandoned-fe.md | 43 +++++++++++++++++++ ...-a-lab-session-home-the-throwaway-exper.md | 43 +++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 .abcd/development/intents/drafts/itd-2609081951381895-abcd-ships-an-openai-compatible-api-oracle-adapter-the-first.md create mode 100644 .abcd/development/intents/drafts/itd-2609090746410233-a-lifeboat-packs-from-a-worktree-a-branch-or-an-abandoned-fe.md create mode 100644 .abcd/development/intents/drafts/itd-2609090746414083-a-lifeboat-packs-from-a-lab-session-home-the-throwaway-exper.md 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/._ From 5bd2a9a0aa368c6a78bd79bc244101024062f44e Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:29:16 +0100 Subject: [PATCH 2/9] chore: file four issues captured between 8 and 15 September Setup discovery could probe OpenRouter reachability; a release cut in progress is invisible to every other session; the intent skill's Grounds section shows the ready gate; and docs-lint exempt paths cannot excuse a file from link resolution. Each was captured in its session and left uncommitted in this checkout. Refs: iss-2609081951416843, iss-2609091037191879, iss-2609151150180399, iss-2609151150180583 Assisted-by: Claude:claude-fable-5-1 --- ...ahoy-could-probe-openrouter-reachability-and.md | 13 +++++++++++++ ...-progress-is-invisible-to-every-other-sessio.md | 13 +++++++++++++ ...skill-text-grounds-section-shows-the-ready-g.md | 14 ++++++++++++++ ...-paths-cannot-excuse-a-file-from-links-resol.md | 14 ++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 .abcd/work/issues/open/iss-2609081951416843-setup-discovery-ahoy-could-probe-openrouter-reachability-and.md create mode 100644 .abcd/work/issues/open/iss-2609091037191879-a-release-cut-in-progress-is-invisible-to-every-other-sessio.md create mode 100644 .abcd/work/issues/open/iss-2609151150180399-the-abcd-intent-skill-text-grounds-section-shows-the-ready-g.md create mode 100644 .abcd/work/issues/open/iss-2609151150180583-docs-lint-exempt-paths-cannot-excuse-a-file-from-links-resol.md 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. From e1161c552be6f6ebb1483f9d02150bd560cdcda1 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:29:16 +0100 Subject: [PATCH 3/9] chore: capture the status-line badge wording The managed-and-nobody-waiting badge reads "abcd", which says the tool is present but not that the repository is managed by it; the ask is "abcd-managed", so the word states the fact the badge exists to show. Refs: iss-2609170627427239 Assisted-by: Claude:claude-fable-5-1 --- ...-badge-s-default-state-reads-abcd-which-says.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .abcd/work/issues/open/iss-2609170627427239-the-status-line-badge-s-default-state-reads-abcd-which-says.md 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. From 563d1e47ffb5c9178efa7953d5e1c77109c80b26 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:40:41 +0100 Subject: [PATCH 4/9] chore: capture that merged local branches are never pruned A checkout accumulates one local branch per landed pull request until somebody sweeps by hand, and the sweep cannot be ancestry-based because squash and rebase merges leave none; the PR state or the patch-ids are what prove a merge. Filed after a 57-branch sweep. Refs: iss-2609170640135192 Assisted-by: Claude:claude-fable-5-1 --- ...whose-pull-request-has-merged-is-never-pruned.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .abcd/work/issues/open/iss-2609170640135192-a-local-branch-whose-pull-request-has-merged-is-never-pruned.md 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. From c4fc433ea62515d038380352fb8002b939376798 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:58:22 +0100 Subject: [PATCH 5/9] docs: settle the headline product as the product thinker's intent, realised The press release leads with abcd helping a product thinker realise an intent as a high-fidelity prototype or demonstrator, carrying the why from idea to shipped reality; the lifeboat becomes a key capability of that product rather than the product. The adr-35 open question on framing is answered and removed, and the decisions log records the ruling of 2026-09-09 that closed both halves of it. Assisted-by: Claude:claude-fable-5-1 --- .../brief/01-product/01-press-release.md | 19 ++++++++++++------- .abcd/work/DECISIONS.md | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.abcd/development/brief/01-product/01-press-release.md b/.abcd/development/brief/01-product/01-press-release.md index 643e2f30..aed83adc 100644 --- a/.abcd/development/brief/01-product/01-press-release.md +++ b/.abcd/development/brief/01-product/01-press-release.md @@ -2,17 +2,26 @@ ## Press Release -> **abcd is a command-line tool that rescues the lessons from a stuck project — so you can rebuild from scratch without losing what you learned.** Point `/abcd:disembark to ` at a repo that's grown unwieldy — or at one that died years ago and that abcd never managed — and abcd reads it without writing a single byte back, packing the project's hard-won knowledge — decisions, principles, pitfalls, the graveyard of what failed, the spine of what was built and why — into a portable lifeboat artefact at ``, alongside a coverage report that names what it could *not* ground and the questions a human must answer. Run `/abcd:embark from ` in an empty repo, and the lifeboat unpacks into a clean foundation with the same wisdom but none of the cruft. A small command surface rounds out the workflow: install (`/abcd:ahoy install`) and public release (`/abcd:launch ship`); `/abcd:intent` and `/abcd:capture` keep forward-looking work and discovered issues structured as the project evolves; and `/abcd:memory` curates a queryable knowledge substrate from those same sources. Bare invocation of any command shows status + suggested next actions; state-mutating actions require an explicit sub-verb (the universal abcd convention). +> **abcd helps a product thinker realise an intent as a high-fidelity prototype or demonstrator — carrying the why from idea to shipped reality.** State what should exist, why, for whom, and what good looks like, as a press-release intent (`/abcd:intent ""`); abcd holds that why through planning (`/abcd:intent plan`), the readiness gate (`/abcd:intent ready`) and delivery, and when the work lands it is audited against the intent's own acceptance criteria (`/abcd:intent audit`), with the verdict recorded on the intent, so what was promised and what was delivered are read side by side. The lifeboat is a key capability of the same product: point `/abcd:disembark to ` at any repository — one that has grown unwieldy, or one that died years ago and that abcd never managed — and abcd reads it without writing a single byte back, packing its hard-won knowledge — decisions, principles, pitfalls, the graveyard of what failed, the spine of what was built and why — into a portable lifeboat artefact at ``, alongside a coverage report that names what it could *not* ground and the questions a human must answer. `/abcd:disembark probe ` renders that coverage verdict on its own, and `/abcd:embark from ` unpacks a lifeboat into a clean foundation with the same wisdom but none of the cruft. A small command surface rounds out the workflow: install (`/abcd:ahoy install`) and public release (`/abcd:launch ship`); `/abcd:capture` keeps discovered issues structured as the project evolves; and `/abcd:memory` curates a queryable knowledge substrate from those same sources. Bare invocation of any command shows status + suggested next actions; state-mutating actions require an explicit sub-verb (the universal abcd convention). +> +> "I know what I want built and I can tell in a minute whether a prototype got it right. What I could never do was hold that line through the engineering. abcd takes the why as I wrote it, builds against it, and shows me what was promised next to what was delivered," said Iris, a product thinker. > > "I'd hit the wall on a side project three times this year — every rebuild from scratch lost the lessons I'd already learned the hard way. abcd is the first tool that treats those lessons as the *output* worth saving, not just the code," said Maya, an AI/agent researcher. ## Why This Matters -Long-running projects accumulate context that doesn't live in any one file: why a decision was made, what was tried and abandoned, which patterns earned their keep, which produced subtle bugs. When the project gets stuck and you decide to rebuild, that context evaporates — you re-learn the same lessons, retry the same dead ends, and re-make the same mistakes. abcd treats *the project's accumulated wisdom* as the artefact worth rescuing, separate from the code. The lifeboat is a portable directory you can share, archive, or unpack into a new repo; abcd orchestrates packing and unpacking with audit gates so the rescue is faithful, not fan-fiction. +A product thinker knows what should exist and what good looks like, and cannot hold that line through the engineering without a facilitator in the room. abcd keeps the why in the record — as an intent, then a plan, then a verdict — so a prototype or demonstrator is built against what was asked and judged against it, not against whatever the build drifted into. + +The same record is why the lifeboat works. Long-running projects accumulate context that doesn't live in any one file: why a decision was made, what was tried and abandoned, which patterns earned their keep, which produced subtle bugs. When the project gets stuck and you decide to rebuild, that context evaporates — you re-learn the same lessons, retry the same dead ends, and re-make the same mistakes. abcd treats *the project's accumulated wisdom* as the artefact worth rescuing, separate from the code. The lifeboat is a portable directory you can share, archive, or unpack into a new repo; abcd orchestrates packing and unpacking with audit gates so the rescue is faithful, not fan-fiction. + +> **Status: NOT YET REAL.** + +The lifeboat widens from whole repositories to narrower sources — a single feature, a lab session, an abandoned worktree — packed with the same coverage honesty, so what a throwaway experiment or a dropped branch learned is carried the way a project's knowledge is. ## What's In Scope -- **Pack the lifeboat:** `/abcd:disembark to ` runs three passes (settled artefacts → targeted chat retrieval → distil/compose/audit) over a project's specs, ADRs, transcripts, oracle reviews, and curated memory. It is **read-only in the source repo and writes out-of-tree** (adr-35): the source is never modified, so any repository can be mined — including a dead one abcd has never touched. Output at `` is a structured directory with synthesised principles, decisions timeline, pitfalls, a `graveyard/` of what was tried and abandoned, press-release framing, verbatim copies of specs, ADRs, and user docs, and a first-class `coverage.{json,md}` pair recording what could not be grounded (`grounded` / `partial` / `blank`), what was searched, and the question a human must answer. abcd refuses a destination it did not produce — it writes only into an absent path, an empty directory, or one carrying a parseable `_provenance.json`. Operations state (the append-only voyage log) lives at the operator level under `~/.abcd/voyage//`, keyed on the root-commit SHA and never committed. +- **Forward-looking discipline:** `/abcd:intent` captures product intents in three structural kinds per itd-34 — `standalone` (one user moment, one spec), `bundle-member` (coupled intents share a spec), and `discipline` (cross-cutting rules with no user moment, e.g., the itd-1 acceptance-gates rule that enforces Given-When-Then on every other spec). Standalone and bundle-member intents are press-release-shaped; disciplines use a `## Rule` template instead. `/abcd:capture` runs a structured issue ledger at `.abcd/work/issues/` rather than free-form notes. `/abcd:intent grill` (sibling of `refine`, per itd-27) is a Socratic-questioning sub-verb that stress-tests intents (or brief sections, via `--brief-section`) before planning. After shipping, `/abcd:intent audit` (Role 1 of `intent-auditor`) reviews delivered reality against the press release; `/abcd:intent consistency` (Role 2, shipped in spc-29 per itd-48, which superseded itd-31) catches cross-document drift; `/abcd:intent shape` (Role 3) keeps each intent's `kind` honest. +- **Pack the lifeboat:** `/abcd:disembark to ` runs three passes (settled artefacts → targeted chat retrieval → distil/compose/audit) over a project's specs, ADRs, transcripts, oracle reviews, and curated memory. `/abcd:disembark probe ` is the user-facing read-only half: the coverage report alone, rendered to stdout and written nowhere. Pack is **read-only in the source repo and writes out-of-tree** (adr-35): the source is never modified, so any repository can be mined — including a dead one abcd has never touched. Output at `` is a structured directory with synthesised principles, decisions timeline, pitfalls, a `graveyard/` of what was tried and abandoned, press-release framing, verbatim copies of specs, ADRs, and user docs, and a first-class `coverage.{json,md}` pair recording what could not be grounded (`grounded` / `partial` / `blank`), what was searched, and the question a human must answer. abcd refuses a destination it did not produce — it writes only into an absent path, an empty directory, or one carrying a parseable `_provenance.json`. Operations state (the append-only voyage log) lives at the operator level under `~/.abcd/voyage//`, keyed on the root-commit SHA and never committed. - **Unpack the lifeboat:** `/abcd:embark from ` reads the lifeboat, runs a press-release interview to confirm the framing with the user, scaffolds the new repo at canonical locations, and writes provenance so the rebuild knows where it came from. `` is wherever a prior disembark landed its lifeboat; there is no in-tree lifeboat home and no `home` shorthand. - **Install / promote:** `/abcd:ahoy install` bootstraps abcd in any repo (transparent prompts, visibility-driven gitignore, marker block in CLAUDE.md/AGENTS.md, prompt-router hook). `/abcd:launch ship` cuts a curated release from the single repo — `.abcd/**` excluded from the artifact by packaging — with secret/PII scans and a version stamp. - **Forward-looking discipline:** `/abcd:intent` captures product intents in three structural kinds per itd-34 — `standalone` (one user moment, one spec), `bundle-member` (coupled intents share a spec), and `discipline` (cross-cutting rules with no user moment, e.g., the itd-1 acceptance-gates rule that enforces Given-When-Then on every other spec). Standalone and bundle-member intents are press-release-shaped; disciplines use a `## Rule` template instead. `/abcd:capture` runs a structured issue ledger at `.abcd/work/issues/` rather than free-form notes. `/abcd:intent ready` answers the question that gates the build: is this intent ready to implement, and if not, what is missing. After shipping, `/abcd:intent audit` (Role 1 of `intent-auditor`) reviews delivered reality against the press release. Three companions to those are designed and not yet built: `/abcd:intent grill` (per itd-27), a Socratic interview that stress-tests an intent, or a brief section, before it is planned; `/abcd:intent consistency` (Role 2, per itd-48, which superseded itd-31), which catches drift between documents; and `/abcd:intent shape` (Role 3), which keeps each intent's `kind` honest as the corpus grows. @@ -40,10 +49,6 @@ Code-bundling lifeboats, cross-corpus synthesis, public-source vendoring with pr - **Pass B signal density.** chat-distiller's effectiveness depends on the native transcript store's signal-to-noise. Phase 0 sampling on idelphiDev measures actual density before Pass B's design locks. If signal is too thin, transcript-noise mitigation moves up from itd-11 (a later-phase item) into an earlier phase. - **Brief-skeleton enforcement.** The numbered-folder layout for `.abcd/development/brief/` is a current convention but not enforced by `intent-auditor` or `documentation-auditor`. See [`05-internals/README.md § enforcement policy`](../05-internals/README.md#policy-no-skeleton-enforcement-deferred) for the candidates list and the deferred-rigidity rationale (this "defer" means deferring the rigidity decision itself, not a release horizon). -- **Product framing after adr-35.** The narrative above is still "rescue the lessons from *your* stuck project so you can rebuild it" — a round-trip out of a repo abcd manages. [adr-35](../../decisions/adrs/0035-lifeboat-as-coverage-experiment.md) makes disembark a read-only reader of *any* repository whose first shipped output is a **coverage verdict on the brief's own structure**, produced by a `disembark probe ` pass that runs across a corpus of repos of mixed record quality *before a packer exists*. The factual claims here have been reconciled; the story has not been re-authored. - - > **Open question (adr-35):** is the headline product still "rescue a stuck project's lessons for a rebuild", or is it "read any repository — dead, archived, or never abcd-managed — for the theory it can still yield, and say plainly what it cannot"? And does the probe pass (`disembark probe`) belong in the user-facing command set of [§ What's In Scope](#whats-in-scope), or is it an operator-internal experiment surface like `/abcd:run`? adr-35 settles the mechanics (read-only, out-of-tree, coverage-first) but not the framing or the command surface. Must be answered before this press release is checked against delivered reality. - - **Round-trip fidelity floor.** What's the minimum percentage of source-repo principles, decisions, and pitfalls that must survive `disembark → embark` for the round-trip to be considered "successful"? abcd ships without an explicit floor; the lifeboat review verdict is the proxy. A future intent (likely paired with itd-15 self-dogfooded SOTA audit) may quantify it. ## Audit Notes diff --git a/.abcd/work/DECISIONS.md b/.abcd/work/DECISIONS.md index 2d010ef6..79ff477e 100644 --- a/.abcd/work/DECISIONS.md +++ b/.abcd/work/DECISIONS.md @@ -2498,3 +2498,4 @@ together (the script's header says why there is no escape hatch). - 2026-09-15 — itd-200 / spc-70 ship with five implementation rulings the spec left open, taken by the implementing session and reversible by the maintainer (recorded here so none is silent). (1) The status-line offer is its own consent category, `status-line`, advisory and never approved by `--yes`, exactly as the git-identity pin is: it rewrites a harness-wide user setting and takes element choices, so only an answered prompt writes it, and `yes |` answers it. A decline is never persisted; the offer returns on the next install until the user-level setting exists. (2) Harness detection is positive evidence only: the harness's user settings file exists and parses (its directory from `$CLAUDE_CONFIG_DIR`, else the harness home); no file means nothing offered and nothing written. Ownership of a status command is decided by shape (` statusline`), which is what makes a dangling entry decidable when the binary is gone. (3) The two record counts on the row are FOLDER counts (files named `iss-*.md` in the open ledger; `itd-*.md` in drafts plus planned), not the board's parsing readers, because the verb runs on every status refresh and a parse over a clone-controlled record measured 0.96 s at twenty thousand records; folder membership is the record's own status signal, so the number differs only where a parser would skip an unreadable record. The spec's Scope text is corrected to say so. (4) Two guards the reviews required and the spec did not name: the previous-command fallback refuses to run when its own marker is already in the environment and marks its child, so a recorded command that reaches `abcd statusline` in any spelling terminates instead of forking without bound, and the install refuses to record such a command at all; and every write to the harness settings re-reads the file immediately before the act and merges into the fresh document, refusing when the status-line key changed under the prompts (itd-193's rule applied to a user file a live harness also writes). (5) `abcd mode ` prints the owed-answer line only when the user-level setting is absent or disabled — the setting is the only evidence of a status surface abcd has — and `managed` prints nothing; the bare board renders the presence line even when the line is disabled, because the switch silences the line and the board is the fallback. Rejected: making the offer a config-change gap (one consent for the PATH entry and the status line would let the reason paragraph be skipped); counting through the board's readers with a cache (a second mechanism to keep correct for the cheapest surface in the tree). The fidelity audit rcp-636b39d5541a records five criteria met with concerns, all disclosed on the shipped record; the one the record could close is closed: the GRILL rule domain now tells an agent to set the mode before it stops for a verdict. - 2026-09-15 — The roles and loopback design workstream lands on main, executing the 2026-09-01 ruling that the branch waits for the mint verb and takes its ids at the merge. `abcd decide` now exists, so the two decisions the branch numbered 0055 and 0056 are re-minted as adr-2609151528057260 (three roles, who each artefact addresses, and when the loop stops) and adr-2609151528057131 (abcd owns the product thinker's surface), content, status and date unchanged; every citation that meant the roles decisions is re-pointed (rfc-3, the phase-8 page, the roles page, the out-of-scope list, three intent drafts, and iss-168, whose 29 August extension cited them by the colliding numbers), and main's own 0055 and 0056 keep their ids. The branch's twelve hand-numbered intent drafts (itd-165 to itd-176) collide with nothing and keep their ids, as adr-45's grandfathering allows. Occasion: itd-200 shipped today refining the two roles decisions, so their citations on main pointed at the wrong records until this landed. - 2026-09-15 — GHSA-4q78-ccfv-f374 (iss-2609012039102770) is closed by OPTION B, ruled by the maintainer at an interactive question: bind the cache to a record the environment does not choose alone. The owned PATH-copy promotion re-verified the cache only against the `binary-meta` beside it, and `CLAUDE_PLUGIN_DATA` is taken from the environment as given, so whoever chose the directory wrote both the bytes and the record that "verified" them — reproduced at v0.7.0 as a one-byte file installed 0755 as `~/.local/bin/abcd` with provenance recorded. Now the bootstrap, the one process holding the harness's real data dir that has just established manifest trust for the cache (an authenticated cache hit, or a fresh download verified against the same-origin manifest), writes `~/.abcd/cache-attestation` — `data_dir`, the manifest-authenticated `binary_sha256`, `cache_trust=manifest`, `attested_at`; 0600, temp-and-rename, beside `path-entry` — and `ahoy install` promotes a cache only when that record names the directory, the co-located record carries the attested hash, and the artefact hashes to it, whichever route (environment or the root's `.data-dir` stamp) named the directory; detection offers the heal on the same predicate. An offline run neither writes nor rewrites the attestation, so a cache provisioned offline waits for a networked session before it reaches PATH, said out loud. Why B: the trust floor moves from a value the environment supplies to a write into the caller's own home, which adr-46 decision 4 already treats as the ownership root, so the attestation grants nothing that authority did not hold and costs `ahoy install` no network (adr-38 stands). Rejected: A (a manifest GET on a disk-only verb, re-fetching what the session already proved); C (a documented residual — weaker than it reads, since a harness honouring a committed settings file's environment block lets a hostile checkout set the variable, and the owned-copy claim is what the hook shims trust); the mechanical partial of cross-checking against the plugin-root binary (breaks dogfood installs whose root binary is a local build); and a terminal rung through the attestation alone (it would heal a dogfood checkout's stable symlink into a release copy). adr-46 is superseded by adr-2609151706587280 (never amended, always superseded; retained because its numbered decisions are cited), spc-35 Design 2 step 1 and Design 3 are revised in place and dated, and brief invariant 12 gains the clause. +- 2026-09-09 — The headline product is settled (maintainer, closing the press release's "Product framing after adr-35" open question, both halves). abcd helps a product thinker realise an intent as a high-fidelity prototype or demonstrator, carrying the why from idea to shipped reality: the identity block's story, the one the README strapline and the roles page already tell and the one the roles and product-thinker-surface decisions on the design branch (numbered 0055 and 0056 there, re-minted at merge) are built on. The lifeboat is a key capability of that product rather than its headline, and its widening from whole repositories to a single feature, a lab session or an abandoned worktree enters the press release under the not-yet-real marker, as intention rather than commitment. `disembark probe` is a user-facing command and keeps its place in the press release's scope list. Rejected: the rescue story as headline (it would re-pin the identity block and every surface held to it); adr-35's "read any repository for its theory" as headline (it is the probe's own promise, now one capability among the surfaces); deferring (the audit of the press release against delivered reality had been blocked on this question since adr-35). From d469f0d3a7c80e8dae043102d411878f4a2ff5e0 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:58:22 +0100 Subject: [PATCH 6/9] docs: list the three September drafts as deferred and grade their hand-run decompositions The out-of-scope register names the api oracle adapter and the two lifeboat-widening drafts; the calibration note carries the two hand-run decomposition tables that routed them, one proposal in two framings and one widening in two sources. Assisted-by: Claude:claude-fable-5-1 --- .../brief/06-delivery/03-out-of-scope.md | 3 + .../2026-08-15-decomposition-calibration.md | 57 +++++++++++++++++++ 2 files changed, 60 insertions(+) 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/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 From 741f11bc647721ac0c54ed73df07eef8552ca54d Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:58:22 +0100 Subject: [PATCH 7/9] docs: a session cutting a release has the final say on what merges before its tag A change ready to land while a peer is mid-cut is handed over as a pull request and merged or held on the cutting session's ruling, with the shipped_in stamp for work an earlier release already carried. The rule holds even for a change orthogonal to the release gates, because the cutting session is the one that can see the release-branch overlap. Refs: iss-2609091037191879 Assisted-by: Claude:claude-fable-5-1 --- AGENTS.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index dec82bc7..c00c64f7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -230,6 +230,22 @@ irreversible; guessing downward costs nothing.** mutation from real work. Correspondingly, a merge, commit, push or gate run proves the tree clean **immediately before the act**, never inheriting an emptiness check from earlier in the sequence (itd-193). +- **A session cutting a release has the final say on what merges before its + tag.** A change ready to land while a peer is mid-cut is handed over as a + pull request, announced to the cutting session with the records it would + move into the cut, and merged or held on that session's ruling, never on the + landing session's. The cutting session reads the diff for anything its + release gate's semantic review will see and answers with one of two + orderings: merge now and sync into the release branch, so the records join + this cut, or hold until the tag, so they fall into the next. A record closed + for work an earlier release already carried is stamped `shipped_in:` with + that release, whichever ordering is chosen, or it lands in the changelog as + if it shipped today. The rule holds even when the change is orthogonal to + the release gates: orthogonal to the gates is not orthogonal to the release + branch, the cutting session is the one that can see the overlap, and a + full-tier release receipt names the commit its reviewers read, so nothing + merges between the CHANGELOG roll and the tag (iss-2609091037191879 seeds + the mechanical form). - **Record ids need no coordination between checkouts.** Captures, intents and specs mint timestamp-numeric ids through one allocator that reads no maximum (adr-45), so two current checkouts minting in the same window From 3b816e297b922cfad4c51bda495aac35107b86f7 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 07:58:22 +0100 Subject: [PATCH 8/9] chore: ahoy install re-stamps the repo at v0.9.0 and writes its ignore block The install step of 2026-09-17 renames project_name to abcd, stamps setup_version v0.9.0, and adds the managed block to .gitignore covering the local tier and the memory directory. Assisted-by: Claude:claude-fable-5-1 --- .abcd/config.json | 6 +++--- .gitignore | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.abcd/config.json b/.abcd/config.json index 6955ff9d..559e2d92 100644 --- a/.abcd/config.json +++ b/.abcd/config.json @@ -3,10 +3,10 @@ "target": "agents_md" }, "meta": { - "project_name": "abcd-cli", + "project_name": "abcd", "schema_version": 1, - "setup_date": "2026-07-14", - "setup_version": "dev" + "setup_date": "2026-09-17", + "setup_version": "v0.9.0" }, "oracle": { "backend": "host-delegated" diff --git a/.gitignore b/.gitignore index ec87bad3..5c7ef955 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,9 @@ references.bib # Generated docs site output (mkdocs build) — disposable, never committed. /site/ + +# BEGIN ABCD +# abcd-managed block — do not hand-edit. Run /abcd:ahoy to refresh. +.abcd/.work.local/ +/memory/ +# END ABCD From 3d0936f4f8df8f640983b4d1cc65f99da9fd81ca Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Thu, 17 Sep 2026 08:18:47 +0100 Subject: [PATCH 9/9] chore: capture the status line's two-tone element colouring Everything after the badge is painted in the plain foreground; the ask is a softer grey for the standing facts (repository, branch, intent and issue counts) and a darker colour for the two that change and get read (model, context), legible on the status surface's dim background. Refs: iss-2609170709035405 Assisted-by: Claude:claude-fable-5-1 (cherry picked from commit 454249f5ea5dbafc229494c62185b7bfc2bfe347) --- ...paints-everything-after-the-badge-in-the-ter.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .abcd/work/issues/open/iss-2609170709035405-the-status-line-paints-everything-after-the-badge-in-the-ter.md diff --git a/.abcd/work/issues/open/iss-2609170709035405-the-status-line-paints-everything-after-the-badge-in-the-ter.md b/.abcd/work/issues/open/iss-2609170709035405-the-status-line-paints-everything-after-the-badge-in-the-ter.md new file mode 100644 index 00000000..d8b8721c --- /dev/null +++ b/.abcd/work/issues/open/iss-2609170709035405-the-status-line-paints-everything-after-the-badge-in-the-ter.md @@ -0,0 +1,14 @@ +--- +schema_version: 1 +id: "iss-2609170709035405" +slug: "the-status-line-paints-everything-after-the-badge-in-the-ter" +severity: "minor" +category: "ux" +source: "user-observation" +found_during: "first day on the v0.9.0 status line, 2026-09-17" +origin: researcher-authored +production_mode: hand-written +found_at: "internal/core/statusline/render.go" +--- + +The status line paints everything after the badge in the terminal's plain foreground, so the repository name, the branch, the model, the context percentage and the intent and issue counts all carry the same weight and the row reads as one undifferentiated run. Give the elements two tones: a softer grey for the repository and branch names and for the itd and iss counts (the standing facts, glanced at rarely), and a darker colour for the model and the context figure (the two that change and get read). The badge keeps its own pair; the split is the one the previous hand-written status line already drew, and it must keep the rest of the row legible on the status surface's dim background.