diff --git a/TODOS.md b/TODOS.md index 762197d21..3c88840a5 100644 --- a/TODOS.md +++ b/TODOS.md @@ -552,7 +552,7 @@ row shape. **Effort:** L (human ~1.5 weeks / CC+gstack ~4 h). **Priority:** P3. **Depends on:** a second third-party hook actually wanting in. -### P2: Windows support for the Memorable bridge +### P2: Windows support for the Memorable bridge (D21) **What:** `enable` refuses on Windows and the hook exits 0 there. Bring it up: descendant termination (`taskkill /T` or a job object) so a vendor process @@ -596,7 +596,7 @@ the `--timeout 5` registration. **Effort:** S. **Priority:** P3. **Depends on:** the bridge in use. -### P3: consolidate the vendor resolvers and extract the canonical-root helper +### P3: consolidate the vendor resolvers and extract the canonical-root helper (D24) **What:** The vendor CLI is resolved twice (bash in `bin/gstack-memorable`, TS in the hook); the canonical-root and `IS_WINDOWS` logic is copied from @@ -640,9 +640,10 @@ only `GSTACK_HOME`; `bin/gstack-uninstall` deletes only the receipts under another; the tests pin all three variables to one temp dir, so the drift is invisible to them. Found by the /ship red team. -**Context:** Uninstall already flips `memorable_recall` off unconditionally -(through gstack-config's own resolution) so no config can say `on` after the -hook is gone; the remaining drift is observability, not consent. +**Context:** Uninstall already flips `memorable_recall` off whenever it reads +`on`, kept state or not (through gstack-config's own resolution), so no config +can say `on` after the hook is gone; the remaining drift is observability, not +consent. **Effort:** S (human ~3 h / CC+gstack ~20 min). **Priority:** P3. **Depends on:** none. diff --git a/docs/memorable-workflow-memory.md b/docs/memorable-workflow-memory.md index e35ab30e2..6d71c9633 100644 --- a/docs/memorable-workflow-memory.md +++ b/docs/memorable-workflow-memory.md @@ -74,27 +74,34 @@ proxy and TLS variables (`HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY`, `SSL_CERT_FILE`, `SSL_CERT_DIR`, `NODE_EXTRA_CA_CERTS`), the `XDG_*` directories, and every `MEMORABLE*` variable. No `ANTHROPIC_API_KEY`, no `GSTACK_*`, no `CLAUDE_*` reaches it. Its stderr is kept out of -`hook-errors.log` whenever the redaction engine finds a credential or PII -shape in it, so a vendor that echoes its input on an error cannot copy your -prompt into a log. +`hook-errors.log` whenever the redaction engine finds a HIGH- or MEDIUM-tier +shape in it (a credential, an email, a phone number), so a vendor that echoes +its input on an error cannot copy your prompt into a log. The receipt's +`payload_class` is the token `claude-user-prompt-json->local-vendor-cli`: the +prompt JSON, handed to the local vendor executable; the network destination is +unknown to gstack (Memorable states: its embed API, on a local recall miss). -The hook skips the hand-off entirely, with one rate-limited line in +The hook skips the hand-off silently (nothing was refused, so nothing is +logged) when the gate is off or `MEMORABLE=0` is set. + +It refuses the hand-off, with one rate-limited line in `~/.gstack/hook-errors.log`, when: -- the gate is off, `MEMORABLE=0` is set, or the vendor binary is missing; +- the vendor binary is missing; - the prompt carries a HIGH-tier credential shape (checked on the raw bytes and on the decoded string values, so a JSON-escaped key does not slip by), or is larger than 1 MiB; - the repo's per-remote trust policy is `deny` or `read-only` (judged by the session's working directory, so a session that touches other repositories - is not covered); -- the receipt cannot be written, or fewer than 500 ms remain of the hook's - 4.5 s budget. + is not covered), or that policy could not be looked up at all (git could + not read the repository, the store is unreadable): the lookup fails closed; +- the receipt cannot be written, or the hook's 4.5 s budget cannot afford the + next step (the secret scan of a very large prompt, or the vendor spawn). A receipt whose outcome is missing means the host killed the hook or the clock ran out. Read it as unknown, never as success. An outcome of `output-written` -means gstack wrote enveloped context to Claude Code's stdin; whether Claude used -it is not something a hook can know. +means gstack wrote enveloped context on its stdout for Claude Code to inject; +whether Claude used it is not something a hook can know. ## What gstack tests, and what is Memorable's claim