# MUSE-AUTH-CLI Decision Record Status: **Final** — accepted 2026-10-07 (user chose "accept Final with a recorded amendment," waiving done-means item 3; see Amendment A1). Handoff note: a prior grill session settled D1–D11 and U1 and reportedly marked its own record Final, but that file lives in another checkout (absent here). D1–D11 full text never arrived; per Amendment A1 the item is WAIVED, not verified — the decisions' substance stands proven by shipped, tested implementations (resume pool, session bind, P1/P2) plus live verification (2026-10-07: 27/27 unique session IDs, workspace scoping exact, refs resolve, profiles annotate). ## Goal Define the `muse-auth` CLI: per-profile credential switcher (`~/.config/muse/accounts//auth.json`), tailnet push/pull of profiles between nodes, and a session spend logger — without stranding live sessions (the 2026-10-07 fleet-wide 400 outage was a mid-stream credential swap). ## Non-goals (proposed) - Implementation of `muse-auth` (needs a separate explicit request). - `agy-auth-switch` validation (Track B, separate lane; PI-AGENT-AUTH.md is Final). - OPERATORS.md amendment for agent-invokable keys (U2 follow-on, own delta). ## Settled (from prior-session transcript, unverified here) ### U1. Allowance reset period — SETTLED (calendar month) Profile token allowances reset on the 1st of each month UTC, matching standard billing cycles (not a rolling 30-day window). ### D10/D11. Agent-invokable key handling — SETTLED in principle, amendment pending Decisions exist; codification as an OPERATORS.md amendment delta is the U2 follow-on and is UNRESOLVED. ### D1–D11 (remaining detail) — WAIVED per Amendment A1 Full decision text was settled in the prior session but never arrived in this checkout. Waived: re-verification by transcript would add words, not evidence. If the original text surfaces and contradicts built behavior, built behavior wins unless a new interview reopens the item. ## Scope contract (ACCEPTED 2026-10-07; user chose "accept the scope as written") - Artifact boundary: IN — this decision record only. OUT — runtime code, tests, OPERATORS.md amendment, Track B validation. - Done means: (1) push/pull file-set decision settled; (2) live-session guard decision settled; (3) D1–D11 text verified or re-settled; (4) user explicitly accepts this record as Final. - Later stages (implementation, U2 amendment) each return for their own interview; accepting this record never approves them. - "Go"/"do it all" authorize only the boundary above. ## Amendment A1 (ACCEPTED 2026-10-07 with Final) Done-means item (3) ("D1–D11 text verified or re-settled") is WAIVED. Rationale: the decisions' substance is verified by shipped, tested implementations and live checks, not by recovering the lost transcript. Recorded per the scope contract: this amendment is the explicit owner approval for the narrowed completion boundary. U1, P1, P2, P3 stand as settled; implementation and U2 remain separate stages. ## Settled Decisions (New) ### P1. Push/pull transfer file set — SETTLED (Credentials + Metadata) Transfer `auth.json` (cookies, tokens, session identity) and `metadata.json` (plan tier, spend watermarks, profile label). Ephemeral caches, runtime logs, and local locks are omitted from transfer. (`profile.json` in the earlier grill options was shorthand for this file and is superseded; confirmed 2026-10-07.) ### P2. Live-session switch guard — SETTLED (Block with Force Override) Refuse to switch credentials if active `muse-bin` or worker processes are detected holding the old profile identity. Operators must either terminate active processes first or explicitly pass `--force` to override, preventing mid-stream 400 outages caused by stale in-memory tokens. (Confirmed in this interview 2026-10-07.) ## Pending None. (All pending architectural decisions P1 and P2 are settled). ## Session credential isolation (P3 — BUILT 2026-10-07, user-ordered) Each muse session runs with an isolated config dir `/tmp/muse-session-/muse`: symlinks to `~/.config/muse/*` except `auth.json`, which is replaced with the bound profile's credentials; refreshed tokens sync back to the profile on session exit/save. Implications (unresolved): this largely obsoletes P2's block (switching stops disturbing live sessions; the guard becomes a backstop for legacy non-isolated sessions). Open risks: token sync-back races when two sessions share a profile (solved: newest-wins by mtime), sessions killed -9 never syncing (solved: reap-by-scan, no exit hook), symlink fragility (accepted: rebuilt per launch). Implementation: bin/muse_session_bind.py (`launch` builds the dir and execs with XDG_CONFIG_HOME; `save`/`reap` sync back; `status` lists). Key integration choice: exec, not supervise, so panes keep their muse-bin identity and watcher coverage is untouched. Tests: tests/test_muse_session_bind.py (13). Follow-ups for the owning lanes: wire `box runtime launch` / resume-pool `resume` through the binder, and arm a reap timer once the profile store (P1) exists. Cross-agent note (2026-10-07, factual, no decision change): the peer's wrapper is DEPLOYED as `muse-code` (symlink to `~/Account(s)/muse_wrapper.py`); 3 live sessions observed bound under it (profile `def`), alongside unbound direct-`muse-bin` sessions. Peer monitor daemons were absent on inspection; a fingerprint one-shot showed all sessions in sync (no drift, nothing written). Monitor reliability is the peer lane; reap-by-scan stays the immune complement. The original D1–D11 text was recovered (peer's MUSE-AUTH-CLI.md) and reviewed: no contradiction with built behavior; the A1 waiver stands. Convergence proposal (open): peer adopts a bind record, NetVM reap learns the peer dirname pattern.