2.5 KiB
Spec: ADR Session Awareness
Purpose
Defines the os-adr SessionStart behavior: a deterministic, model-free existence check that injects a near-zero-token usage note when a project's ADR system exists, and a suppressible, once-per-day setup suggestion when it doesn't.
Requirements
Requirement: Deterministic SessionStart existence check
The plugin SHALL register a SessionStart hook (matcher startup|resume) that deterministically
checks for docs/adr/ and its index file in the current project. The hook SHALL make no LLM
call, SHALL complete within its configured timeout (5s), and SHALL add no perceptible
session-start latency.
Scenario: Hook is deterministic
- WHEN the SessionStart hook runs
- THEN its output is a pure function of the project's filesystem state (ADR dir, index, suppression state) with no model invocation
Requirement: Minimal context injection when the ADR system exists
WHEN docs/adr/ and the index file both exist, the hook SHALL inject a near-zero-token
additionalContext note stating that the ADR system exists and naming both usage surfaces:
writing (/os-adr:create) and retrieval (/os-adr:find).
Scenario: Present project gets the usage note
- WHEN a session starts in a project with
docs/adr/and an index - THEN the injected context is a short note (a few lines at most) naming
/os-adr:createand/os-adr:find
Requirement: Setup suggestion with suppression when absent
WHEN the ADR system is absent, the hook SHALL notify the user and suggest /os-adr:init or
/os-adr:migrate — unless a per-project suppression flag is set, in which case it SHALL stay
silent. The suggestion SHALL also be rate-limited to at most once per day per project via a
snooze timestamp. Suppression state SHALL live in a gitignored per-project state directory
(.os-adr/), following the os-doc-hygiene state-dir shape.
Scenario: Absent and unsuppressed
- WHEN a session starts in a project with no
docs/adr/and no suppression flag, and no reminder was shown today - THEN the hook emits a one-line suggestion to run
/os-adr:initor/os-adr:migrateand stamps the snooze timestamp
Scenario: Suppressed project stays silent
- WHEN a session starts in a project whose
.os-adr/suppressflag is set - THEN the hook emits nothing
Scenario: Same-day repeat session
- WHEN a second session starts the same day in an absent, unsuppressed project
- THEN no repeat suggestion is emitted