`nap gateway vault setup` unwraps the project memory secret once (prompt
on a terminal, or the existing argument/env paths) and stores the
secret, never the passphrase, in memory-secrets.vault.json under the
existing 0600 local vault key. The CLI and MCP workers load it
automatically and MCP never prompts, per
/decisions/local-gateway-no-interactive-unlock and
/decisions/2026-09-29-memory-secret-local-vault. Older versions stay
readable; a rotated active version reports memory_secret_rotated with
the setup next action. `vault forget` revokes local access, including
for running workers. Env passphrases still work, are persisted into the
vault, and are reported as deprecated. Search warns
e2e_index_not_provisioned instead of e2e_index_locked. Local key
creation is 0600 from the start and never replaces a published key.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- nap_create_node accepts `type`; when omitted (also in nap_bulk and
agent-node creates) the type is inferred from the folder and sent
explicitly, so older APIs also store typed plans and decisions.
Explicit spelling variants are canonicalized; custom types pass as is.
- Local browse, full-text and encrypted-shard searches filter on the
effective type (canonical spelling, or the folder's type for generic
notes; `type=note` excludes notes whose folder implies a type); server
rows are post-filtered the same way. Rows expose `effective_type` when
it differs from the stored type; discover offers an effective_type
facet.
- Active-only filters also exclude deployed, released,
released_verified_production and folded.
Mirrors napseer src/vocab.rs; decision
/decisions/2026-09-29-node-type-status-vocabulary.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Crypto backend: use native AES-GCM from `cryptography` when importable
(~1.5 GiB/s), falling back to the pure-Python implementation with a
byte-identical format and identical authentication failures.
- E2E shard: decrypted E2E text is indexed in an in-memory SQLite
database, persisted only as serialize() -> AES-256-GCM with an HKDF key
bound to the project and memory-secret identity, authenticated header,
fresh nonce, 0600 atomic writes. It loads only while the project is
unlocked; tampered, foreign, wrong-key or rotated shards fail closed and
rebuild. Search merges shard hits (search_source local_e2e) and reports
locked/unavailable/slow states explicitly.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>