FROZEN — immutable history. Superseding/current decisions live in
docs/decisions/. Do not edit.
ADR 0006 — Slice 2: keychain/1Password auth, openai-compatible kind, claude-code sync, publish scaffolding#
Status: Accepted (2026-07-02). Original decision record, extracted verbatim from docs/design.md ("Slice 2 (shipped)") as part of the ADR freeze.
- Keychain / 1Password auth refs — DONE.
authaccepts{ keychain: { service, account? } }(macOSsecurity find-generic-password -w, darwin-only, typedSECRET_BACKEND_UNAVAILABLEelsewhere) and{ op: "op://vault/item/field" }(1Passwordop read, typed error ifopis absent), alongside{ env }. Materialization is LAZY: onlyresolve()(and the opt-indoctor --probe) reads a value;resolveRef/list/synconly probe availability (platform / binary presence —op --versionat most) and never read the secret. The backend is an injectableSecretRunner, so tests never touch a real Keychain or 1Password.ResolvedRefcarries a non-secretAuthStatus(kind, reference string, availability); the legacyapiKeyEnv/apiKeySetfields remain for the env case. The validator accepts exactly one of env/keychain/op and still rejects literal secrets in any field (op:// URIs are recognized as references, not secrets). openai-compatiblekind — DONE. The resolver already accepted it (open enum); slice 2 adds thedoctor --probepath (POST {baseUrl}/chat/completions,max_tokens: 1, Bearer auth, injectable fetch) and documents the opencode mapping (@ai-sdk/openai-compatible). The README support matrix records which kinds each consumer speaks; traverse speaks anthropic-compatible only.datum sync claude-code— DONE. Generator for Claude Code's native~/.claude/settings.jsonenvblock. Surface confirmed against docs.claude.com/en/docs/claude-code/settings and .../env-vars (checked 2026-07):settings.jsonhas anenvobject exported into every session;ANTHROPIC_BASE_URL("Override the API endpoint…") andANTHROPIC_MODELare recognized. Datum sets those two for a chosen--role; the API key is emitted only as an instruction naming its backend — never written into settings. Live write merges exactly the datum-owned env keys (clearing stale ones on re-sync) and is experimental;--dry-runis the confirmed path. Claude Code speaks the Anthropic API only, so this target rejects non-anthropic-compatible roles.- npm publish + release automation — STAGED.
privateremoved;publishConfig,fileswhitelist, repository/homepage set;check:packgate; release-please config + manifest (0.2.0) and thepublish-npm.yml/release-please.ymlworkflows mirror traverse (tag-triggered, verify matrix, tag-matches-version and tag-on-main guards, already-published skip, OIDC--provenance, plus the workflow-dispatch fallback since datum may not yet be in the release app's repo list). Held before external release pending owner ratification: the repo is NOT flipped public, no tag is pushed, nothing is published yet.