Development record
2026-08-20 — bughunt round 3 (branch bughunt-a/round-3): captured twelve findings (iss-360..iss-369, plus two renumbered to iss-373/iss-374 after round 2's own collision re-mint landed inside this round's block — the week's fourth collision,
2026-08-20 — bughunt round 3 (branch bughunt-a/round-3): captured twelve findings (iss-360..iss-369, plus two renumbered to iss-373/iss-374 after round 2's own collision re-mint landed inside this round's block — the week's fourth collision, each adversarially refuted before capture; ids minted above the sibling bughunt-b/round-2's iss-357 via the cross-ref floor). Fixed eleven, one recorded-not-fixed. Code/security: iss-361 the lifeboat coverage renderer (per-repo and aggregate) printed untrusted cross-repo status/tier/tiers_present/section fields to the terminal with no termsafe — only the repo name was sanitised — so a crafted probe report injected raw ANSI/OSC-8/bidi (reproduced); both renders now route every repo-derived string through sanitize with widths from the sanitised strings; iss-366 termsafe.Sanitize masked the deprecated FEFF joiner but not its Unicode successor U+2060 WORD JOINER, the U+2061-2064 invisible operators, or U+00AD SOFT HYPHEN — all now masked; iss-364 the capture related_specs validator pinned the retired fn-N namespace (reFnID) instead of the live spc-N, making the field unusable — switched to reSpcID, dropped the orphaned reFnID, corrected issues/README.md. Surface (additive): iss-362 abcd banlist --json omitted the reach caveat its command file tells an agent to relay verbatim — added a reach field to PrivateReport (unconditional, mirroring the ahoy status board). Docs (fix): iss-363 commands/lint.md and prepare-this-repo.md enumerated five lint conventions omitting the shipped identity-positioning rule; iss-367 commands/launch.md documented a nonexistent top-level files count for launch --dry-run --json (the list is bundle.files). Infra (fix): iss-365 the govulncheck CI job pinned @v1.1.4 whose bundled x/tools caps its type-checker at go1.24 while go.mod declares go 1.25.6, so the scan failed at package loading and exited before analysing anything — masked as an advisory red since it landed 2026-08-19; bumped to @v1.7.0 (verified locally to load go1.25). Record (internal): iss-373 three ADRs (adr-11/13/20) ended with leaked tool-call scaffolding (</content></invoke>) — deleted; iss-374 the ADR index listed adr-44 proposed vs the record's accepted — corrected; iss-360 adr-7 carried no frontmatter against the ADR contract (sole outlier of 36) — added; iss-368 the core/disembark glossary term linked its counterpart to the interview-context embark (a different bounded context) rather than the /abcd:embark unpack surface — repointed. Ledger hygiene: resolved the stale iss-338 (round 2's persona-pronoun record already fixed by round 1's iss-321; all ten cited sites are they/them). Recorded not fixed (stays open): iss-369 readTranscript opens the hook-supplied transcript path without O_NOFOLLOW — the last bespoke external-input read not routed through fsutil.ReadGuarded; refuted as no reachable exploit (harness-supplied path, no path policy, so a direct path already reads any file), defence-in-depth only, left for a scoped consolidation. Model routing: orchestration on Claude Fable 5; five parallel hunters, six per-finding refuters, and one of the two pre-merge reviewers on Claude Opus 5; the second pre-merge reviewer on Claude Fable 5 (dual-model merge gate).
Frontmatter
| id | dcn-2608200000000005 |
|---|---|
| type | decision |
| date | 2026-08-20 |
.abcd/work/decisions/dcn-2608200000000005-bughunt-round-3-branch-bughunt-a-round-3.md
open on GitHub ↗ · commit history ↗
mentions18
- adr-7`/abcd:intent grill` — One Sub-verb with Two Inseparable Phases
- adr-11One canonical word for a specced block of work — spec
- adr-44abcd never mutates a remote uninvited, and identity derives from caller-local facts
- iss-321persona pronoun discipline itd-79 is violated by gendered pronouns in seven intent records including a shipped intent
- iss-338Seven registry personas are given he/she/his/her pronouns across intents/drafts (itd-92,97,98,108,126,128) and intents/shipped (itd-100), violating the they/them persona discipline (itd-79); review-enforced convention with no mechanical gate, concentrated in one 2026-08 authoring batch — a cosmetics-batch cleanup
- iss-357memory ingest records a redirect-controlled FinalURL verbatim into stored material origins — the iss-359 class one door over; the cite fix neither touched nor recorded the sibling site
- iss-360adr-7 carries no YAML frontmatter (uses a prose Status line) while the ADR format contract requires machine-readable frontmatter on every ADR; it is the sole outlier of 36 and passes record-lint ungated
- iss-361The lifeboat coverage renderer prints untrusted cross-repo status and tiers_present fields to the terminal without termsafe, so a crafted probe report injects raw ESC/OSC-8/C1/bidi sequences; only the repo name is sanitised
- iss-362abcd banlist --json omits the reach sentence its command file instructs an agent to relay verbatim; reach lives only in the text renderer, forcing the paraphrase the doc forbids, while abcd ahoy --json carries banlist.reach correctly
- iss-363commands/lint.md and prepare-this-repo.md enumerate the conventions abcd lint checks as five, presented as exhaustive, but DefaultRules ships six including identity-positioning; prepare-this-repo.md itself arms that rule
- iss-364capture validates related_specs against the retired fn-N namespace (reFnID) instead of the live spc-N; adr-11 renamed fn to spec, fn- is a record-lint blocker, and 0 of 340 records populate the field, so it is unusable for its documented purpose
- iss-365The govulncheck CI job pins @v1.1.4 whose bundled x/tools caps its type-checker at go1.24 while go.mod declares go 1.25.6, so package loading fails and the job exits before any scan; non-gating masks it as advisory, so no vuln analysis has run since it landed
- iss-366termsafe.Sanitize masks four zero-width runes (U+200B/200C/200D/FEFF) but not U+2060 WORD JOINER (the modern successor to the deprecated FEFF-as-joiner it does mask), nor U+2061-2064/U+00AD/Hangul fillers, so those default-ignorable characters pass through and two byte strings render identically
- iss-367commands/launch.md documents a top-level files count in launch --dry-run --json, but DryRunReport has no such key; the file list is bundle.files, an array; the bullet violates the file's own dotted-path convention
- iss-368The core/disembark glossary term links its counterpart to interview/embark (the grill-session opening, a different bounded context) rather than the /abcd:embark unpack surface, misdirecting the reader
- iss-369readTranscript opens the hook-supplied transcript path with O_RDONLY|O_NONBLOCK but no O_NOFOLLOW, the last bespoke external-input read in the CLI not routed through fsutil.ReadGuarded; defence-in-depth consolidation (no reachable exploit: the path is harness-supplied and no path policy exists)
- iss-373Three ADRs end with leaked agent tool-call closing tags committed into the durable record: a literal </content> line then </invoke>
- iss-374The hand-maintained ADR index lists adr-44 as proposed but the record frontmatter is accepted; the index drifted after status was flipped without updating the index