Development record
Wiring 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.
Wiring 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.
Grounds
- pursued: relocating the store out of the install-owned registry namespace and making it create itself is expected to dissolve the silent no-capture rather than report it, because nothing is left between a wired hook and a stored transcript; a session that ends with nothing staged or stored on a machine that never installed, or a corpus stranded at the old path, would show it wrong.
Frontmatter
| id | iss-95 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-95-wiring-the-stop-hook-does-not-by-itself.md
open on GitHub ↗ · commit history ↗
mentions5
- adr-2609090717039680The transcript corpus is a sibling store that creates itself, and the per-repo location is an opt-in pull
- dcn-26071400000000082026-07-14 (M1) — iss-95: wiring the hook does NOT by itself start the clock. `history.
- dcn-26071400000000092026-07-14 (M1, iss-95 — maintainer decision) — The store-not-bootstrapped case
- iss-217add a cross-agent session-capture source as an optional plugin
- itd-89Capture the Session You Just Had, Because You Cannot Capture It Later