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
47 changes: 47 additions & 0 deletions .abcd/development/principles/workaround-records-the-defect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Workaround records the defect

**The rule.** When abcd itself breaks — an error, wrong or empty output, a missing
or retired path, a surprising behaviour — and a manual workaround is taken to keep
moving, the workaround is not complete until the underlying defect is recorded as a
ledger issue (`abcd capture`). Working around it to unblock is fine; a *silent*
workaround is not, because the workaround is the only trace the defect ever showed
itself, and taking it without recording erases that trace. Recording the issue is the
non-negotiable minimum — at least enough to investigate later.

**Why.** abcd improves only on recorded evidence; an unrecorded defect is invisible
and is never fixed. A manual workaround is exactly the moment the system revealed a
gap *and* the moment that signal is most likely to be lost — the immediate problem is
unblocked, attention moves on, and the defect survives to bite the next user. Capturing
it converts a private patch into a public, drainable work item, and (composing with
[fix-the-detector](fix-the-detector.md)) into a candidate detector plus its
acceptance corpus.

**Bounds.**

- Binds on defects in **abcd** — the binary, the plugin surface, the record's own
tooling. Friction from the host harness, or an operator's own mistake (a mistyped
command, a shell pipe that swallowed the output), is not an abcd defect: discern the
source and capture only the abcd case, so the ledger stays signal, not noise.
- "Record" is the floor, not the ceiling. A one-line capture naming the failing
behaviour and its site (`file:line` if known) is enough to move on; a genuine one-off
gets a plain issue, a shared root cause gets the fix-the-detector treatment.
- Applies to any abcd use, not only formal reviews — and the `/abcd:run` loop captures
the abcd defects it hits mid-run rather than only working around them.
- Composes with [reality-is-filable](reality-is-filable.md) (the ledger's taxonomy must
be able to express the true broken state — an unfilable defect is itself a defect),
and [enforcement-claims-are-facts](enforcement-claims-are-facts.md) (a broken gate is
recorded, never quietly bypassed).

**Live instance.** The 2026-07-12 dogfooding session moved forward on three workarounds
and left a ledger trace for each: the always-latest binary wrapper worked around abcd
having no dev/track-latest install mode → iss-75; memory-lint writing to the retired
`.abcd/logbook/` → iss-73; a duplicate `iss-56` id → iss-74. The host-harness quirks
hit the same session (a guard-hook blocking a `gh` call, an empty `/plugin details`)
were deliberately *not* captured — not abcd defects.

**Promotion.** Principle now (entry rung). The enabling convention beneath it is the
existing `abcd capture` ledger (**exists**). The discipline/tool rung above it is
**absent**: a check that a session or run which took a workaround emitted a matching
capture is hard to make fully mechanical, so the realistic MVP toward it is a run-loop
self-report (the `/abcd:run` protocol asserts "defects hit → captured" in its handoff)
or a review-checklist rule, before any gate.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
schema_version: 1
id: "iss-73"
slug: "relocate-memory-lint-logbook-output-and-scanner-skip-paths-f"
severity: "minor"
category: "tech-debt"
source: "user-observation"
found_during: "abcd-run-design"
found_at: "internal/core/memory/lint.go"
---

Relocate memory-lint logbook output and scanner skip-paths from .abcd/logbook/ (a retired location per iss-36) to .abcd/.work.local/logs/, the gitignored runtime-artefact tier. Maintainer adjudication of iss-56 (2026-07-12): runtime artefacts belong in .work.local/logs/, not a tracked dir. Sites: internal/core/memory/lint.go writes .abcd/logbook/memory/lint dirs; internal/adapter/scanner/scanner.go defaultSkipFragments references .abcd/logbook/pii-scan/ and audit-history/. Fix both plus tests; once the binary no longer writes there the .abcd/logbook retired-location ban (iss-36/iss-56) can be armed. Actionable fix behind iss-56 adjudication.
12 changes: 12 additions & 0 deletions .abcd/work/issues/open/iss-74-duplicate-iss-56-id.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
schema_version: 1
id: "iss-74"
slug: "duplicate-iss-56-id"
severity: "major"
category: "bug"
source: "user-observation"
found_during: "abcd-run-design"
found_at: ".abcd/work/issues/open"
---

Duplicate iss-56 id: two open issues share id iss-56 — iss-56-iss-36-lists-abcd-logbook-as-a-retired-location-but-the-ship.md and iss-56-managed-pre-commit-gates.md. The allocator scans max N across open/resolved/wontfix under flock+O_EXCL, so a collision implies a manual add that bypassed it or an allocator gap. Ledger-integrity bug: derived priority, blocked_by edges, and resolve/wontfix by id are all ambiguous while two files answer to iss-56. Detector (per unrecognized-input-never-writes / ledger integrity): a capture/record-lint check that ids are unique across the three status dirs; acceptance corpus = the two iss-56 files. Fix: renumber the later-created one to the next free id and repoint any inbound blocked_by.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
schema_version: 1
id: "iss-75"
slug: "dogfood-always-latest-install-mode"
severity: "minor"
category: "observation"
source: "user-observation"
found_during: "abcd-plugin-dogfooding"
---

abcd lacks an always-latest / dev install mode for dogfooding: 'abcd ahoy install' symlinks a pinned built binary and there is no plain bin/abcd, so tracking live development required a hand-rolled ~/.local/bin/abcd wrapper that runs 'go build -C <repo> && exec' on each call (rebuild-from-source, fail loudly on a broken build). This manual workaround means abcd's own install path does not cover the dogfooding case. Consider 'abcd ahoy install --dev' / a track-latest mode, or bless+document the wrapper as the sanctioned dogfood path. Recorded per the golden rule: a manual workaround must be captured, never silently bypassed, so abcd can be fixed.
Loading