Development record
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) 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:lineif 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:runloop captures the abcd defects it hits mid-run rather than only working around them. - Composes with reality-is-filable (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 (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.
.abcd/development/principles/workaround-records-the-defect.md
open on GitHub ↗ · commit history ↗
mentions4
- iss-56iss-36 lists .abcd/logbook as a retired location, but the shipped binary writes there: memory lint reports go to .abcd/logbook/memory/ (internal/core/memory/lint.go) and the scanner skip-list references .abcd/logbook/pii-scan/. Adjudicate before any logbook ban is armed; the logbook token was deliberately left OUT of record-lint banned_tokens.
- iss-73Relocate 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.
- iss-74Duplicate iss-56 id: two open issues share id iss-56 — iss-56-iss-36-lists-abcd-logbook-as-a-retired.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.
- iss-75abcd 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.