Skip to main content
This page is the migration entry point for Tuple alpha testers and their agents. Give your agent this page with the files you want updated. It covers the Transcription CLI generation and the Capture CLI generation. Last verified: September 9, 2026, against installed macOS 3.2.0 and a separately built Capture-generation CLI. Select the contract exposed by your installed app and binary.

Identify the installed contract

Before editing an integration:
  1. Resolve the exact executable your script or MCP configuration launches. Keep the CLI paired with its app and environment.
  2. Record the app version and build. On macOS, read the app bundle’s Info.plist. The Transcription-generation CLI rejects --version.
  3. Read root and nested help from that executable. For MCP, initialize that server and read tools/list, resources/list, resources/templates/list, and prompts/list. Tool availability can depend on the session.
  4. Select the matching column below. Update only to commands and schemas the installed executable exposes. If the app and CLI disagree, resolve the installation mismatch before testing actions.
For a standard macOS installation:
Adjust the bundle path if you use a different installation. An MCP initialization response’s server version identifies the server implementation, not the Tuple app release. Detect the command contract instead of assuming a minimum version from this table. A root command’s presence alone does not prove a flag, MCP tool, or app capability is available.

Update commands and defaults

Every command below starts with tuple. Preserve the exact executable path in scripts and bundled integrations. The inspected 3.2.0 root help does not list machines. On a Capture-generation installation that exposes it, use machines list and pass its machine UUID to call start <person-or-machine-id>. Keep person-name resolution separate from machine IDs. Contacts and rooms retain their command groups. Verify filters through nested help. Notifications use notifications send, ask, list, and cancel; replace legacy notifications list --follow with notifications follow. Replace contacts list --follow with contacts follow. Rooms use rooms follow for updates and rooms show for one room. Verify each command separately instead of replacing flags globally. Terms such as sessions, --session, review/headless modes, and mcp serve can occur in older skills but are absent from the inspected baseline’s public command tree. Remove those assumptions. Use Call selectors, connect prompt for instructions, and tuple mcp as the server entry point. A Capture recording selector is --recording <uuid>; it is distinct from a connected client’s session identity. In cli.toml, remove the obsolete mcp_installed bookkeeping key. Keep client registration in the client’s MCP configuration. For requested ongoing participation, per-harness attention defaults use [harness.<key>.attention] with batch and wake_on; saving those defaults does not start a reader. See configuration fields.

Preserve Capture meaning and delivery

capture show --format json returns a finite sequence of JSON Lines. capture follow --format json and capture next --format json also emit JSON Lines. Parse each stream line separately and distinguish durable records from framing. The categories are transcript, events, and content. Replace any conversation category assumption with the appropriate supported category. The record type transcription_finished still identifies finalized speech; a product command rename does not rename record types. For an explicitly requested ongoing task:
  1. Keep one reader for the selected call. Its first read supplies catch-up, so a separate initial snapshot can duplicate context.
  2. Deliver durable records to the model or destination. Save the highest positive record id only after that delivery succeeds.
  3. Resume with that ID, the same call or recording selector, and the same exclusions. Retain the prior checkpoint after a delivery failure.
  4. Handle kind: "status" separately from durable records. Carry terminal framing to the task controller so it can stop at call end. Neither framing nor an ephemeral id: 0 advances the checkpoint.
  5. Stop a call-specific reader at call_ended. recording_ended means Capture stopped and may restart within the call. A follower without a call selector stays open across calls, so use it only when the user’s task covers those calls.
Replace the sample call and record IDs with observed values. Persist the returned checkpoint only after delivery succeeds. A verification read is still an undelivered read: it must not advance the saved checkpoint. If delivery succeeds but saving fails, the next read can replay those records; make your destination idempotent or deduplicate by call and record ID. A repeated batch command without an updated checkpoint can replay catch-up. A shell loop that discards stdout does not deliver context to an agent. An empty first CLI batch still needs --cursor 0 on the next invocation to wait for records instead of repeating immediate catch-up. Keep the prior cursor after later empty batches. --since selects time-based catch-up. It is not a delivery checkpoint. --until belongs to bounded show, not live readers. For Capture exclusions, keep at least one category. Exports take a file destination. They preserve the previous destination if no calls match and replace it only after a complete artifact is ready. Create a private temporary directory for verification instead of overwriting an existing export.
Each JSON Lines artifact record includes call_id so a multi-call export remains attributable.

Update MCP configuration and allowlists

Keep tuple mcp as the server command and point it at the matching bundled executable. Reconnect the client after changing configuration, then refresh discovery. Keep the client-specific server prefix when replacing allowlisted tool suffixes. Resource migrations are explicit reads: Remove resource subscriptions and their re-read callbacks. A bounded snapshot does not replace a subscription’s ongoing behavior; implement explicit reader ownership for a task that needs it. find_discussion and summarize_call prompts remain available. The connect prompt appears when the app permits live-call pull. Read their current argument schemas. Use ordinary search terms in examples instead of teaching agents raw database query syntax. Resources include tuple://agent/guide, tuple://agent/guide/{topic}, and tuple://capture/{callId}. Topics include live-call, call-content, past-calls, communication, safety, connection, troubleshooting, and automation. The app’s managed mount also supplies managed-agent. When advertised for an attached session, next_capture returns a batch with call_id, records, cursor, and terminal. Omit cursor for initial catch-up. After delivery, repeat with the returned call and cursor. If initial catch-up is empty, cursor: 0 starts waiting. Stop at terminal call_ended; retain the reader across recording_ended. Use batch, timeout, and wake_on according to the advertised schema. Agent messaging and managed attention depend on session capabilities. Refresh discovery when it changes. The app owns managed mode and its delivery loop. Reading managed-agent or changing an allowlist does not make an attached agent managed.

Check scripts, skills, and prompts

Search the files you own, including AGENTS.md, CLAUDE.md, skills, launch scripts, MCP configurations, and allowlists:
Review every match in context. Preserve valid record types and any intentional legacy compatibility branch. For each edited integration:
  • Pin its executable and app environment. Keep separate verified branches if it supports both generations.
  • Replace command names, flags, destinations, structured argument fields, and response parsers together.
  • Make a one-time request finish after its bounded reads. Start one ongoing reader only for an explicit follow-along request.
  • Remove named active/passive/watch modes and unsolicited polling from prompts. Use the installed shared guides for participation instructions.
  • Preserve confirmation and user intent for call actions, notifications, exports, and deletion.

Verify behavior before declaring migration complete

Run these checks with the matching app and CLI. Report actual exit codes, stderr, parsed results, and any check you could not exercise. The removed screen_share_recording product flag is separate from macOS Screen Recording permission. Capture owns stored screen media. Historical selectors remain discoverable even when a call has no stored video. Use the CLI reference, Connect guide, and MCP reference for ongoing use after migration.