Development record
2026-07-14 (M1, iss-95 — maintainer decision) — The store-not-bootstrapped case
2026-07-14 (M1, iss-95 — maintainer decision) — The store-not-bootstrapped case
is made LOUD, not self-bootstrapped by the hook (rejects having hook session-end
create ~/.abcd/history/, which would put a dir-creating trust-boundary act inside
a fail-closed hook and contradict the ownedDirsReal symlink discipline). Reality
check: ahoy install ALREADY bootstraps the store (bootstrapHistory, plus the
per-repo transcripts dir), and detection ALREADY emits history.bootstrap_missing
as a required gap that bare abcd, ahoy, and ahoy doctor surface — so an
installed user is never in the silent state. The only genuinely silent path is the
SessionEnd hook itself, which by harness contract has NO output channel (its exit
code and stdout are ignored), so it cannot speak at session end. "Loud" therefore
lives where a channel exists: a SessionStart notice (SessionStart hook output is
surfaced) that warns once when the store is absent, pointing at /abcd:ahoy install.
Scoped as an M1 follow-up; keeps the hook fail-closed-silent and moves the loudness
to the one event that can be heard.
Frontmatter
| id | dcn-2607140000000009 |
|---|---|
| type | decision |
| date | 2026-07-14 |
.abcd/work/decisions/dcn-2607140000000009-the-store-not-bootstrapped-case-is-made.md
open on GitHub ↗ · commit history ↗
mentions1
- iss-95Wiring the Stop hook does NOT by itself start the transcript clock: history.Capture requires ~/.abcd/history/<root-sha>/transcripts/ to already exist and deliberately never creates it (ownedDirsReal validates the store's dirs are real, not symlinks). That dir is bootstrapped by 'abcd ahoy install'. On a machine where install has not run — including this one, where ~/.abcd/ does not exist at all — 'hook session-end' fails closed, logs to stderr, exits 0, and captures NOTHING. Silently. That is precisely the failure mode itd-89 exists to prevent: a hook that appears wired while the corpus never accrues. Decide: (a) the hook bootstraps the store itself (changes Capture's stated precondition, and a hook creating dirs is a trust-boundary act the ownedDirsReal discipline deliberately avoids), or (b) 'ahoy install' stays the sanctioned bootstrap and the not-installed case is made LOUD rather than a stderr line nobody reads (e.g. ahoy doctor already flags history.bootstrap_missing as a required gap). Until this is settled, itd-89's acceptance is met in code but not on any machine that has not installed.