v0.23.0 — Codex summarizer (no Claude plan needed) + auto-discovered multi-AI memory
Two things, both aimed at the same gap: Captain assumed you were a Claude user.
1. codex summarizer — the zero-key option when you have no Anthropic subscription
Until now every provider needed either a Claude plan (claude-oauth, claude-code) or a paid API key (anthropic, openai-compatible). If all you had was ChatGPT Plus/Pro, you got no observations at all.
npm i -g @openai/codex && codex login
captain-memo install --summarizer codexShells out to codex exec --json. No API key, ever.
What the benchmark actually showed. ~6–7 s/call — and the model doesn't change that. Across the whole ladder (gpt-5.4-mini → gpt-5.6-sol) the latency is flat, because you're paying for codex exec booting an agent runtime, not for inference. Picking a small model saves quota, not wall-clock. Codex exposes no non-agent completion entrypoint, so there's no way under that floor.
It still doesn't cost you anything interactively. Summarization runs on the worker's 5 s background tick and groups by (session_id, prompt_number) — a whole prompt window, however many tool calls it contained, collapses into one request. You're never waiting on it.
You don't need to know which models your plan allows. A ChatGPT account gates the model list server-side (gpt-5.4-nano and every gpt-5.1-* slug are rejected outright). So the fallback chain ends at the sentinel default — "send no model at all" — which the account always accepts. Default is gpt-5.4-mini, the Haiku-tier pick.
Runs --ignore-user-config --ephemeral --sandbox read-only. The first one matters more than it looks: your ~/.codex/config.toml may set a heavyweight reasoning effort and register MCP servers — including captain-memo itself — which would otherwise be booted as child processes on every single summarize call.
Bonus: Codex reports real token usage, so observations now carry accurate work-token costs — something the claude-code transport can't provide.
2. CAPTAIN_MEMO_WATCH_MEMORY=auto — index every assistant's memory, not just Claude's
Captain only ever read the one glob you hand-wrote, which in practice meant Claude's memory and nothing else — even with Codex, Gemini and Cursor installed right next to it.
auto probes the machine and expands to whatever actually exists: ~/.claude/CLAUDE.md, per-project Claude memories, ~/.codex/, ~/.gemini/, ~/.cursor/rules/, and repo-level AGENTS.md / CLAUDE.md / .github/copilot-instructions.md. It composes — auto,/my/notes/*.md is a union — and it's now the recommended install default. On the dev box that's 390 files vs the 381 the old single glob saw.
Every indexed doc carries a tool provenance tag, because filename_id stops being unique the moment three assistants can each own an AGENTS.md.
Credentials can't get indexed — structurally, not by blocklist. Every discovery glob must end in .md/.mdc, and a test enforces it. That single rule is what keeps ~/.codex/auth.json, ~/.gemini/oauth_creds.json, ~/.codex/sessions/**.jsonl (53 MB of transcripts) and *.sqlite out of the corpus. A blocklist is the thing you forget to update when a vendor adds a file.
Fixed
- The watcher was blind to hidden directories, so repo-level memory never indexed. Both glob scans defaulted to
dot: false, which meant~/projects/*/.claude/CLAUDE.mdmatched zero files despite existing — as would any.github/or.cursor/rule. Verified: 0 hits before, 2 after. - Auto-discovery silently dropped globs whose wildcard is in the filename. Probing "everything before the first
*" turns~/.claude/CLAUDE*.mdinto~/.claude/CLAUDE— not a path — so your globalCLAUDE.mdwent un-indexed. Found only by running discovery live against a real machine; regression-tested now.
Upgrade
captain-memo install # re-run: preserves your config, offers the new optionsSuite: 1087/1087.