Observation
ORA-2026-0014
Resolution (2026-04-16T01:02Z)
Chad chose Option C — abolish the shared form. Executed by CLAUDE-CLI-MacBook-Air-ORA-01:
~/.orbit/claude/managed-mcp.json: removed unsuffixedhcb-gmail/hcb-gcalkeys; addedhcb-gmail-admin,hcb-gmail-zack,hcb-gcal-admin,hcb-gcal-zack(kepthcb-gdriveas canonical single-identity per ORA-2026-0002).~/.orbit/claude/managed-settings.json: removedmcp__hcb-gmail/mcp__hcb-gcalfrom allow list; added the four per-identity prefixes.provider-parity-checklines 137–146 rewritten: 2 unsuffixed Claude CLI assertions replaced with 4 per-identity assertions + 1 negative-invariant check (Claude managed-mcp.json has no unsuffixed hcb-gmail/hcb-gcal keys — Option C invariant).- Audit pass confirmed Codex / Gemini / Claude Desktop had no residual unsuffixed leftovers; "more thorough" scope of C collapsed to a clean audit.
- Parity check result: 152/152 PASS (up from 149/149 — net +3 invariants: 5 added, 2 removed).
Shared wrappers retained at ~/.local/bin/hcb-gmail-mcp and ~/.local/bin/hcb-gcal-mcp — they are the impersonation delegation layer that the per-identity wrappers exec into.
Pending for Chad: restart Claude CLI to flush old mcp__hcb-gmail__ / mcp__hcb-gcal__ tool names from the live tool list. After restart, tools resolve as mcp__hcb-gmail-admin__, mcp__hcb-gmail-zack__, mcp__hcb-gcal-admin__, mcp__hcb-gcal-zack__.
---
Observation
As of 2026-04-15, the fleet has three provider surfaces using per-identity HCB Google launchers per ORA-2026-0002 (hcb-gmail-admin, hcb-gmail-zack, hcb-gcal-admin, hcb-gcal-zack) — Codex Desktop, Gemini CLI, and Claude Desktop. A fourth surface, Claude CLI, still declares unsuffixed shared-impersonation MCP keys (hcb-gmail, hcb-gcal) in ~/.orbit/claude/managed-mcp.json. This is not dead legacy — the unsuffixed form routes through the shared wrapper (~/.local/bin/hcb-gmail-mcp) which uses whichever default impersonation the wrapper was built with.
Why this matters (not just cosmetic)
The per-identity launcher pattern is load-bearing for addressable impersonation: each named launcher (hcb-gmail-admin-mcp, hcb-gmail-zack-mcp) is a thin shell that sets HCB_GMAIL_IMPERSONATED_USER before exec-ing into the shared wrapper. Under this pattern, a seat can choose which identity to read/write as on a per-call basis by picking the launcher. Under the shared form, the identity is fixed at wrapper-build time — the caller cannot distinguish admin@heartwoodcustombuilders.com from zack@heartwoodcustombuilders.com at MCP-invocation time.
Current functional asymmetry: a Claude CLI seat cannot natively send a Gmail draft as Zack vs as Admin. A Codex/Gemini/Claude Desktop seat can. For HCB operations involving cross-identity triage (e.g., reading Zack's inbox while drafting from Admin), this is a real capability gap, not a naming preference.
What was already audited
~/.orbit/claude/managed-mcp.json: 3 unsuffixed entries (hcb-gmail,hcb-gcal,hcb-gdrive).hcb-gdriveis canonical single-identity per ORA-2026-0002 (only one Drive);hcb-gmail/hcb-gcalare the gap.~/.orbit/claude/managed-settings.json: permissions allowmcp__hcb-gmail/mcp__hcb-gcal(unsuffixed prefix — broad match).provider-parity-checklines 137–146: assertsgrep -q '"hcb-gmail"'against Claude CLI managed-mcp.json — this hardcodes the unsuffixed form as canonical for Claude CLI specifically. Migrating Claude CLI to per-identity would require updating this assertion OR the parity check would flip to FAIL.- The shared wrappers
~/.local/bin/hcb-gmail-mcpand~/.local/bin/hcb-gcal-mcpare NOT deletable — they are the impersonation delegation layer that the per-identity wrappers exec into. Audit confirmed this on 2026-04-15.
Options on the table (no verdict yet)
Option A — Migrate Claude CLI to per-identity parity with the other three surfaces.
- Add 4 entries to
managed-mcp.json:hcb-gmail-admin,hcb-gmail-zack,hcb-gcal-admin,hcb-gcal-zack - Remove 2 unsuffixed entries:
hcb-gmail,hcb-gcal - Keep
hcb-gdrive(canonical single-identity) - Update
managed-settings.jsonallow list:mcp__hcb-gmail→mcp__hcb-gmail-admin+mcp__hcb-gmail-zack - Update parity script lines 137–146 to assert per-identity forms on Claude CLI
- Cost: ~6 edits + parity update. Restart Claude CLI session to reload MCP list.
- Benefit: full capability parity; no functional gap.
- Risk: any Claude CLI session that referenced
mcp__hcb-gmail__tool names in memory/docs will need to re-learn themcp__hcb-gmail-admin__/mcp__hcb-gmail-zack__*forms.
Option B — Codify the asymmetry as intentional and document why.
- Leave Claude CLI on shared-impersonation because (hypothesis) Claude CLI sessions tend to be scoped to single-identity work and the shared form is lower-cognitive-load.
- Update ORA-2026-0002 to explicitly state that Claude CLI is exempt from per-identity requirement.
- Cost: 1 doctrine amendment.
- Risk: locks in the functional gap permanently; future Claude CLI work needing cross-identity Gmail triage will re-discover this and re-open the question.
Option C — Abolish the shared form on all surfaces, including the other three.
- Delete the
managed-mcp.jsonentries for unsuffixedhcb-gmail/hcb-gcalon Claude CLI AND remove any remaining unsuffixed references elsewhere. - The shared wrapper files on disk stay (still needed as the impersonation delegation target), but no MCP key points at them directly.
- Cost: similar to A but more thorough.
- Benefit: single canonical form across all 4 provider surfaces. Simpler mental model.
- Risk: small — verify no scripts directly invoke the unsuffixed MCP keys.
Recommendation (pending Chad's call)
Option A or C. Both close the functional gap. C is slightly cleaner because it removes the ambiguity entirely rather than leaving the shared form as a "Claude CLI quirk." A is safer if we're unsure whether any Claude CLI workflow implicitly depended on the shared form.
What to check before choosing
1. Do any active Claude CLI workflows (prompts, scripts, docs) invoke mcp__hcb-gmail__* tools? If yes, they would need updating to pick an identity. 2. Does ORA-2026-0002 have language that could be read as permitting Claude CLI exempt? (Spot check: current doctrine text says "current roster: hcb-gmail-admin / hcb-gmail-zack / hcb-gcal-admin / hcb-gcal-zack" — suggests per-identity is canonical for all surfaces.) 3. What breaks if a Claude CLI session tries to send Gmail and the tool name doesn't resolve (user experience of the migration moment)?
Enforcement hook (if Option A or C adopted)
Update provider-parity-check to assert per-identity forms on Claude CLI managed-mcp.json (replacing current line 137–146 unsuffixed assertions). This is the enforcement seam that prevents the gap from re-opening.
Review cadence
Revisit on next HCB cross-identity operation where the gap bites — that's the forcing function. Alternatively, trigger review when ORA-2026-0002 is next amended.