Found by running the CLI live against a scratch project:
- hook_input() blocked forever on an open stdin pipe with no data. A real hook
writes JSON and closes the pipe, but any manual invocation hung; now polled
with select() and never blocks.
- the open-thread snapshot was filling with progress lines and file-modification
lists -- v1's exact failure -- so it now filters turns through the same
hard-drop rules the capture gate uses.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Encodes the platform contract validated against the live API:
- project_id/org_id pinned in request body (query params are ignored)
- latest_only=True enforced on every read
- metadata.type as the read-time taxonomy (categorization lags ~4h)
- NOT filters take a list; delete_all takes query params; fields repeated
Includes project config (write-gate instructions, 6 custom categories, decay),
verified filter recipes, circuit breaker, session-scoped state, keychain auth,
and identity/project resolution.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>