v1.7.0 — operator vault unblock + TUI live-loop + S3 self-awareness
The 2026-04-26 sprint cycle. 22 PRs landed covering Phases A–G of the gap-fill plan plus emergency operator-blocker fixes.
Highlights
Operator P0 (vault unblock)
- #306 Vault bridge path anchored to install root, not cwd. `memphis` works from any directory; previously broke vault-touching commands when run outside the source checkout.
- #305 Vault secret-write surfaces underlying cause — `} catch {}` truth model rolled out in vault-boundary. Audit log gets the cause; user message follows oracle-defense rules.
- #293 MiniMax chat error names the actual missing-API-key failure mode.
Phase A (TUI live-loop)
- #296 `/reload` — refresh OperatorRuntime from .env without restarting TUI.
- #308 `/provider` `/model` persist to .env across restarts.
- #299 `/clear` drops chat history (full session reset).
Phase E (provider robustness)
- #302 `ContextOverflow` distinct `OperatorError` variant — TUI can render "use /clear to reset" hint.
Phase C (backup parity)
- #298 Backup captures redacted `.env` so restore preserves provider URLs + vault refs across hosts.
Phase D (security hygiene)
- #301 VAULT-ref leak filter applied to voice + HTTP API auth.
Phase F (voice deps)
- #300 `scripts/install-prerequisites.sh` adds `ffmpeg`, `libasound2-dev`, `zstd`. New `docs/operator/voice-setup.md` runbook.
Sprint deliverables
- #283 Wire 7 registered-but-unwired tools (S1)
- #284 TUI tier 0/1/2 dispatch parity with Telegram (S2)
- #285 4 operator hot-fixes (S2.5)
- #310 S3 self-awareness — `memphis_self_describe` MCP tool, `GET /v1/ops/capabilities`, `memphis tools list/describe`
- #289 `memphis vault migrate` — moves legacy data/vault-*.json
- #309 Chat error names failing tools (Task #21)
- #297 Test flakes fix (Phase B)
- #292 As-intended sprint audit doc (S8)
- #295 Fresh-install runbook (Phase 2d)
Quality / housekeeping
- #290 Dead-code sweep (S5)
- #291 Zero lint warnings (S7)
- #304 `memphis tier elevate` — symmetric counterpart to revoke
Deferred to v1.7.1
- #287 S4 app.rs refactor — too tangled with recent app.rs additions (Phase A1/A2/E2)
- Tier revoke CLI portion of #288 — needs rewrite on top of post-#304 architecture
- #307 Operator triage CLI UX bundle (`ask` positional, dispatcher hint, bridge pre-flight, sonic-boom race) — passes locally, CI hits env-bleed flake
- #294 Backup pepper-restore path fix — same env-bleed flake
See CHANGELOG.md for full details.
Two structural insights worth carrying forward
- Truth model: every `} catch {}` that swallows the cause is a hidden bug. Audit gets the cause; user message follows oracle-defense rules. Methodology proven on vault-boundary in #305.
- Install root, not cwd: any default file path in CLI code must anchor on `resolveInstallRoot()` (src/infra/runtime/install-root.ts), not implicit `process.cwd()`. PR #306 fixed the worst instance; sibling sites worth a sweep.
🤖 Generated with Claude Code
What's Changed
- feat(memory): tool-executor conversation binding + turnId passthrough (N8.2 follow-up) by @Memphis-Chains in #262
- fix(kartograf-cli): preserve source artifacts + dry-run side-effect-free (Codex #258 r2) by @Memphis-Chains in #263
- fix(train-kartograf): JS-aligned sci-notation + NaN/inf eval guard (Codex #259 r2) by @Memphis-Chains in #264
- docs(roadmap): N44 Kartograf v2 architecture scout — state-space / liquid as Y2 R&D by @Memphis-Chains in #265
- test(rc-drill): extend for v1.6.0 new-surface smoke (export / kartograf / consent) by @Memphis-Chains in #266
- feat(training): real Kartograf trainer — pair miner + ModernBERT+LoRA+two heads (N32 P1-P2) by @Memphis-Chains in #267
- fix(logging): pino destination rotation — 10 MiB threshold + 5 archives by @Memphis-Chains in #269
- feat(training): real Kartograf training run on v3 corpus (N32 P2.5-6) by @Memphis-Chains in #268
- fix(vault): bulletproof against silent re-init + recovery procedure by @Memphis-Chains in #279
- feat(federation): MP v0 — signed envelope + messages.chain (H1 spine) by @Memphis-Chains in #280
- fix(prompts): clarify tier 3 in LLM system prompt by @Memphis-Chains in #281
- feat(cli): memphis tier status — unified view across surfaces by @Memphis-Chains in #282
- test(flakes): fix 3 dev-machine-only failures on main (Phase B) by @Memphis-Chains in #297
- feat(tools): wire 7 registered-but-unwired tools (S1) by @Memphis-Chains in #283
- feat(tui): tier 0/1/2 dispatch parity with Telegram (S2) by @Memphis-Chains in #284
- fix(s2.5): four operator-blocking hot-fixes (Telegram + TUI) by @Memphis-Chains in #285
- feat(cli): memphis vault migrate — move legacy data/vault-*.json (S6) by @Memphis-Chains in #289
- chore(s5): dead-code sweep — openclaw-plugin / legacy/tui-ts / configure by @Memphis-Chains in #290
- chore(s7): zero lint warnings — strip dead eslint-disable directives by @Memphis-Chains in #291
- docs(s8): as-intended audit for the 2026-04-26 sprint cycle by @Memphis-Chains in #292
- fix(operator): name the actual missing-api-key failure mode (#293) by @Memphis-Chains in #293
- feat(fresh-install): scripts/fresh-install/06-* runbook + README (Phase 2d) by @Memphis-Chains in #295
- feat(tui): /reload slash command — refresh runtime from .env (Phase A1) by @Memphis-Chains in #296
- fix(vault): surface cause on secret-write failure (operator P0) by @Memphis-Chains in #305
- fix(vault): anchor Rust bridge path to install root, not process.cwd (operator P0) by @Memphis-Chains in #306
- feat(backup): capture redacted .env in archive (Phase C) by @Memphis-Chains in #298
- feat(install): voice deps + setup doc (Phase F) by @Memphis-Chains in #300
- fix(security): VAULT-ref leak filter applied to voice + HTTP API auth (Phase D1) by @Memphis-Chains in #301
- feat(operator): ContextOverflow distinct error variant (Phase E1) by @Memphis-Chains in #302
- feat(cli): memphis tier elevate — symmetric counterpart to revoke (v1.7.1) by @Memphis-Chains in #304
- feat(tui): /clear drops chat history (Phase E2) by @Memphis-Chains in #299
- feat(tui): /provider /model persist to .env across restarts (Phase A2, replaces closed #303) by @Memphis-Chains in #308
- fix(chat): name failing tools when chat aborts on error-limit (Task #21, slim from #288) by @Memphis-Chains in #309
- feat(self-awareness): runtime introspection — tool + prompt block + CLI (S3, replaces #286) by @Memphis-Chains in #310
- release(v1.7.0): 2026-04-26 sprint cycle close-out by @Memphis-Chains in #311
Full Changelog: v1.6.0...v1.7.0