{
  "schemaVersion": 1,
  "updatedAt": "2026-10-15",
  "dimensions": ["automatic", "manual", "modelTool", "persistentNames"],
  "contracts": [
    {
      "harness": "claude-code",
      "variant": "current",
      "default": true,
      "verifiedAt": "2026-10-15",
      "evidence": ["claude-sessions-docs-1fb1dc"],
      "references": ["https://code.claude.com/docs/en/sessions#name-your-sessions"],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "automatic": "native",
        "manual": "native",
        "modelTool": "partial",
        "persistentNames": "native"
      },
      "answers": {
        "autoName": {
          "status": "supported",
          "answer": "Yes. If you don't name a session, a background request to the small fast model (normally Haiku-class) writes a short title from your first prompt, and accepting a plan in plan mode replaces it with a title based on the plan. Interactive sessions also get a default display name such as `my-app-3f` for listings like `claude agents`, but that one can't be used to resume.",
          "reference": "https://code.claude.com/docs/en/sessions#name-your-sessions",
          "evidence": ["claude-sessions-docs"],
          "notes": [
            "A `claude -p` run started directly from a shell or script gets no generated title (since v2.1.277).",
            "Titles are written in your conversation's language unless the `language` setting pins one."
          ]
        },
        "rename": {
          "status": "supported",
          "answer": "Start with `claude -n <name>` (`--name`), run `/rename <name>` during the session (with no argument it generates a name from the conversation), or highlight a session in the `/resume` picker and press `Ctrl+R`. A SessionStart or UserPromptSubmit hook can return `hookSpecificOutput.sessionTitle`, and the Agent SDK has `renameSession()` / `rename_session()`.",
          "reference": "https://code.claude.com/docs/en/sessions#name-your-sessions",
          "evidence": [
            "claude-sessions-docs",
            "claude-commands-docs",
            "claude-hooks-docs",
            "steering-claude-code-docs-en-agent-sdk-typescript"
          ],
          "notes": [
            "Names are capped at 200 characters and control or invisible characters become spaces.",
            "In the desktop app you can rename a session by clicking its title, or ask Claude to rename another Code tab session."
          ]
        },
        "useName": {
          "status": "supported",
          "answer": "Yes. `claude --resume <name>` or `/resume <name>` resumes an exact match directly, across the repository and its worktrees; an ambiguous name opens the picker pre-filtered from the shell, or an error from `/resume`. Generated titles work the same way, and `claude -p --resume <name>` accepts them too.",
          "reference": "https://code.claude.com/docs/en/sessions#resume-by-session-id-or-name",
          "evidence": ["claude-sessions-docs"],
          "notes": ["The default display name (for example `my-app-3f`) is not a resume handle."]
        },
        "stored": {
          "status": "supported",
          "answer": "Names are written into the session's transcript at `~/.claude/projects/<project>/<session-id>.jsonl`: a name you set as a `custom-title` entry (the latest one wins) and a generated title as an `ai-title` entry. Names survive resume and compaction, and `/clear` carries a name you set into the new session but drops a generated title.",
          "reference": "https://code.claude.com/docs/en/agent-sdk/python#rename_session",
          "evidence": [
            "steering-claude-code-docs-en-agent-sdk-python",
            "claude-sessions-docs",
            "steering-claude-code-docs-en-agent-sdk-typescript"
          ],
          "notes": [
            "A `/branch` copy gets the name you pass, or one taken from the conversation's first prompt.",
            "`/export` writes the conversation as plain text; it is not a resumable session."
          ]
        }
      },
      "observedVersion": "2.1.300",
      "method": "documentation",
      "surface": "cli"
    },
    {
      "harness": "codex",
      "variant": "1983c48f-tui-app-server",
      "default": true,
      "verifiedAt": "2026-09-30",
      "evidence": [
        "thread-naming-1",
        "thread-naming-2",
        "thread-naming-3",
        "thread-naming-4",
        "thread-naming-5",
        "thread-naming-6",
        "thread-naming-7",
        "thread-naming-8",
        "thread-naming-9",
        "thread-naming-10",
        "thread-naming-11",
        "thread-naming-12",
        "thread-naming-13",
        "thread-naming-14",
        "thread-naming-15",
        "thread-naming-16",
        "thread-naming-17",
        "thread-naming-18",
        "thread-naming-19"
      ],
      "references": [
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/chatwidget/slash_dispatch.rs#L334",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/chatwidget/interaction.rs#L405",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/app-server-protocol/src/protocol/v2/thread.rs#L782",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/app-server/src/request_processors/thread_processor.rs#L1848",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/dynamic_tools.rs#L221",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/dynamic_tools.rs#L682",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_routing.rs#L2199",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_title.rs#L29",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_title.rs#L280",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_title.rs#L74",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_title.rs#L412",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_title.rs#L307",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/thread_title.rs#L389",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/core/src/util.rs#L89",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/tui/src/app/event_dispatch.rs#L2720",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/thread-store/src/local/update_thread_metadata.rs#L38",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/thread-store/src/local/update_thread_metadata.rs#L565",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/rollout/src/session_index.rs#L20",
        "https://github.com/openai/codex/blob/1983c48fd186614529e4fad418ac38a1ae00c6b6/codex-rs/rollout/src/session_index.rs#L178"
      ],
      "support": {
        "automatic": "native",
        "manual": "native",
        "modelTool": "native",
        "persistentNames": "native"
      },
      "method": "source-inspection",
      "surface": "tui-and-app-server",
      "conditions": [
        "Applies only to the recorded surface and evidence revision; source inspection does not establish released availability.",
        "Historical September 30 source inspection; current release applicability has not been established."
      ],
      "unknowns": [
        "No authenticated model request, runtime execution, or preservation probe was performed."
      ],
      "details": {},
      "sourceRevision": "1983c48fd186614529e4fad418ac38a1ae00c6b6",
      "automatic": {
        "trigger": "completed user-message item in active unnamed TUI thread; not thread/start side effect",
        "maxCharacters": 36,
        "characterUnit": "unicode-scalar-values",
        "promptMaxUtf8Bytes": 960,
        "guidelines": [
          "single line",
          "under five words where possible",
          "imperative verb",
          "sentence case with proper-name/code exceptions",
          "preserve ticket references and user language",
          "no quotes, Markdown or trailing punctuation"
        ],
        "modelSelection": "gpt-5.6-luna low when OpenAI+ChatGPT auth+catalog permit; otherwise current model",
        "overwriteGuard": "cancel pending generation on manual rename; reread originating thread before save; not atomic across clients"
      },
      "manual": {
        "command": "/rename [name]",
        "api": "thread/name/set",
        "notification": "thread/name/updated",
        "trimming": true,
        "emptyAllowed": false,
        "maxCharacters": null
      },
      "modelTool": {
        "name": "set_thread_title",
        "namespaces": ["codex_tui", "codex_app"],
        "availability": "client-provided dynamic tools must be exposed; optional threadId defaults to calling thread"
      },
      "persistence": {
        "stores": [
          "SQLite title/name by history mode",
          "$CODEX_HOME/session_index.jsonl append-only; newest entry per ID wins"
        ],
        "nameUniqueness": "not-unique",
        "lookup": "matching loadable candidates filtered by allowed source/provider; use thread IDs for exact identity",
        "synchronization": "session index best effort in paginated mode; cross-client atomic compare-and-set not established"
      },
      "answers": {
        "autoName": {
          "status": "supported",
          "answer": "Yes, in the interactive TUI. After your first message in an unnamed chat, Codex runs a hidden background request that writes a short title of at most 36 characters. It uses `gpt-5.6-luna` at low effort when you're signed in with ChatGPT, and your current model otherwise. Renaming the chat cancels any title still being generated. `codex exec` sessions aren't auto-titled.",
          "reference": "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/tui/src/app/thread_routing.rs#L2205-L2238",
          "evidence": [
            "steering-codex-codex-rs-tui-src-app-thread-routing-rs",
            "sessions-codex-codex-rs-tui-src-app-thread-title-rs"
          ],
          "notes": ["An unnamed session appears in pickers under its first-message preview."]
        },
        "rename": {
          "status": "supported",
          "answer": "Type `/rename <name>`, or `/rename` alone to open a naming prompt. It works even while a task is running. You can name a chat as you create it with `/new <name>` or `/fork <name>`. When the TUI is connected to the background server (the default), the model can also rename the chat with its `set_thread_title` tool.",
          "reference": "https://learn.chatgpt.com/docs/developer-commands#rename-the-current-chat-with-rename",
          "evidence": [
            "codex-developer-commands-docs",
            "codex-slash-source-0-162-1",
            "sessions-codex-codex-rs-tui-src-dynamic-tools-rs",
            "sessions-codex-codex-rs-tui-src-app-server-session-rs"
          ],
          "notes": [
            "The `set_thread_title` tool isn't offered with `--no-daemon` or in side chats, which can't be renamed.",
            "SDK and app-server clients use `thread.set_name(name)` / `thread/name/set`."
          ]
        },
        "useName": {
          "status": "supported",
          "answer": "Yes. `codex resume <name>`, `codex fork <name>`, `codex exec resume <name>`, `codex exec fork <name>`, `codex archive|unarchive|delete <name>` and `/resume <name>` all take a session name. A UUID wins if the argument parses as one. The name must match exactly, and if several sessions share it, Codex refuses and asks for the UUID.",
          "reference": "https://learn.chatgpt.com/docs/developer-commands#codex-resume",
          "evidence": [
            "codex-developer-commands-docs",
            "sessions-codex-codex-rs-tui-src-lib-rs",
            "sessions-codex-codex-rs-tui-src-named-session-lookup-rs",
            "steering-codex-codex-rs-cli-src-main-rs"
          ],
          "notes": ["An unnamed session can be matched by its first-message preview text."]
        },
        "stored": {
          "status": "supported",
          "answer": "Names are stored in Codex's SQLite state database (`~/.codex/state_5.sqlite`). Each rename is also appended to `~/.codex/session_index.jsonl`, where the newest entry wins. Names survive restart and resume. Forks start without the parent's name, and `/export` Markdown is just the transcript.",
          "reference": "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/thread-store/src/local/update_thread_metadata.rs#L157-L170",
          "evidence": [
            "sessions-codex-codex-rs-thread-store-src-local-update-thread-metadata-rs",
            "transcripts-codex-codex-rs-rollout-src-session-index-rs",
            "transcripts-codex-codex-rs-state-src-sqlite-rs"
          ]
        }
      }
    },
    {
      "harness": "cursor-agent",
      "variant": "current",
      "default": true,
      "verifiedAt": "2026-10-15",
      "evidence": ["cursor-cli-changelog-af1a1f"],
      "references": ["https://cursor.com/docs/cli/changelog#april-2026"],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "automatic": "native",
        "manual": "native",
        "modelTool": "unsupported",
        "persistentNames": "native"
      },
      "answers": {
        "autoName": {
          "status": "supported",
          "answer": "Yes. A new chat starts as `New Agent`. In CLI 2026.10.12, after your first message Cursor's backend generates a short title from that prompt, and the title appears in the resume picker and the terminal tab title. A name you set with `/rename` is never overwritten.",
          "reference": "https://cursor.com/docs/cli/changelog#april-2026",
          "evidence": ["cursor-cli-changelog", "cursor-cli-overview-docs"],
          "notes": [
            "In CLI 2026.10.12, auto-naming runs in interactive and ACP sessions (ACP clients receive a `session_info_update` with the title); `-p` runs are not auto-named.",
            "The model can't set or change the title itself."
          ]
        },
        "rename": {
          "status": "supported",
          "answer": "Run `/rename <name>` inside a session. There is no CLI flag or subcommand for renaming, and you can't rename from the `agent ls` picker.",
          "reference": "https://cursor.com/docs/cli/changelog#april-2026",
          "evidence": ["cursor-cli-changelog"]
        },
        "useName": {
          "status": "partial",
          "answer": "Names show in the `agent ls` / `agent --resume` / `/resume` picker (All chats or This workspace), but you can't type to search them. `--resume` only accepts a chat ID, or `-N` for the Nth most recent chat. Use `/copy-conversation-id` to get the current chat's ID.",
          "reference": "https://cursor.com/docs/cli/using#history",
          "evidence": ["cursor-cli-using-docs", "cursor-cli-changelog"]
        },
        "stored": {
          "status": "supported",
          "answer": "The name is saved with the chat in `~/.cursor/chats/<workspace-hash>/<chatId>/`. In CLI 2026.10.12 it lives in `store.db` metadata as `name` and is mirrored as `title` in `meta.json`. It survives restarts and `--resume`, and a fork copies it with ` (forked)` appended. The JSONL transcript copy doesn't include it, and there is no export command.",
          "reference": "https://cursor.com/docs/cli/reference/configuration#file-location",
          "evidence": ["transcripts-cursor-agent-cursor-com-docs-cli-reference-configuration"],
          "notes": ["The chats folder follows `CURSOR_CONFIG_DIR` when set."]
        }
      },
      "observedVersion": "2026.10.12-d47ca18",
      "method": "documentation",
      "surface": "cli"
    },
    {
      "harness": "opencode",
      "variant": "1.x",
      "default": false,
      "verifiedAt": "2026-10-15",
      "evidence": ["opencode-agents-docs-a3a873"],
      "references": ["https://opencode.ai/docs/agents/#use-title"],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "automatic": "native",
        "manual": "native",
        "modelTool": "unsupported",
        "persistentNames": "native"
      },
      "answers": {
        "autoName": {
          "status": "supported",
          "answer": "Yes. A new session starts as `New session - <timestamp>`, and after your first prompt the hidden `title` agent writes a short title (up to 100 characters). It uses `small_model` if set, otherwise a cheaper model from your provider, falling back to the main model; subagent sessions are not auto-titled.",
          "reference": "https://opencode.ai/docs/agents/#use-title",
          "evidence": [
            "opencode-agents-docs",
            "instructions-opencode-opencode-ai-docs-config",
            "steering-opencode-packages-opencode-src-session-prompt-ts"
          ]
        },
        "rename": {
          "status": "supported",
          "answer": "In the TUI run `/rename` or press `ctrl+r` and type the new title. Headless, pass `opencode run --title \"...\"` when creating a session, or call `PATCH /session/:id` with `{ \"title\": \"...\" }` (`session.update` in the SDK).",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/tui/src/routes/session/index.tsx#L506-L516",
          "evidence": [
            "compaction-opencode-packages-tui-src-routes-session-index-tsx",
            "opencode-cli-stable-docs",
            "opencode-server-docs",
            "delegation-opencode-packages-tui-src-config-keybind-ts"
          ],
          "notes": [
            "`/rename` is not in the TUI docs command list but is a built-in slash command."
          ]
        },
        "useName": {
          "status": "partial",
          "answer": "You can search by title in the `/sessions` picker, but `--session` only accepts a session ID. `opencode session list` shows titles with their IDs (`--format json` for scripts).",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/tui/src/component/dialog-session-list.tsx#L86-L93",
          "evidence": [
            "sessions-opencode-packages-tui-src-component-dialog-session-list-tsx",
            "opencode-cli-stable-docs"
          ]
        },
        "stored": {
          "status": "supported",
          "answer": "The title is the `title` column of the session row in the SQLite database (`~/.local/share/opencode/opencode.db`, printed by `opencode db path`). It survives restarts and resume, is included in `opencode export` JSON, and comes back with `opencode import`.",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/core/src/session/sql.ts#L35",
          "evidence": [
            "sessions-opencode-packages-core-src-session-sql-ts",
            "opencode-cli-stable-docs"
          ]
        }
      },
      "observedVersion": "1.19.0",
      "method": "documentation",
      "surface": "cli"
    },
    {
      "harness": "opencode",
      "variant": "2.x",
      "default": true,
      "verifiedAt": "2026-10-15",
      "evidence": ["instructions-opencode-opencode-ai-v2-docs-migrate-v1-dc5b5e"],
      "references": [
        "https://opencode.ai/v2/docs/migrate-v1/#supported-fields-without-direct-native-equivalents"
      ],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "automatic": "native",
        "manual": "native",
        "modelTool": "native",
        "persistentNames": "native"
      },
      "answers": {
        "autoName": {
          "status": "supported",
          "answer": "Yes. When the first prompt in an untitled top-level session is accepted, the hidden title agent writes a title of up to 100 characters. Choose its model with `agents.title.model` (a V1 `small_model` is mapped to it).",
          "reference": "https://opencode.ai/v2/docs/migrate-v1/#supported-fields-without-direct-native-equivalents",
          "evidence": [
            "instructions-opencode-opencode-ai-v2-docs-migrate-v1",
            "memory-opencode-opencode-ai-v2-docs-agents",
            "steering-opencode-packages-core-src-session-runner-llm-ts",
            "sessions-opencode-packages-core-src-session-title-ts"
          ]
        },
        "rename": {
          "status": "supported",
          "answer": "In the TUI, `/rename <title>` sets the title, `/rename` with nothing after it regenerates it from the conversation, and `ctrl+r` opens a rename dialog. `opencode run --title \"...\"` names a new session, and `PATCH /api/session/{id}` with `title` renames one (an empty string regenerates it).",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/tui/src/routes/session/index.tsx#L917-L931",
          "evidence": [
            "steering-opencode-packages-tui-src-routes-session-index-tsx",
            "sessions-opencode-packages-server-src-handlers-session-ts",
            "instructions-opencode-opencode-ai-v2-docs-api",
            "opencode-2-0-29-source"
          ]
        },
        "useName": {
          "status": "partial",
          "answer": "The `/sessions` picker searches titles (a substring match), but `--session` only takes an ID, and with an unknown ID it creates a new session. `opencode session list` prints titles next to IDs.",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/core/src/session/store.ts#L109",
          "evidence": [
            "sessions-opencode-packages-core-src-session-store-ts",
            "opencode-2-0-29-source"
          ]
        },
        "stored": {
          "status": "supported",
          "answer": "The title is the `title` column of the `session_v2` table in `~/.local/share/opencode/opencode.db` (`opencode debug paths db`). It survives restarts, is included in `opencode session export` JSON, and comes back with `opencode session import`; titles of migrated V1 sessions are kept.",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/core/src/session/sql.ts#L22-L37",
          "evidence": [
            "transcripts-opencode-packages-core-src-session-sql-ts",
            "mcp-opencode-opencode-ai-v2-docs-cli",
            "sessions-opencode-packages-core-src-database-v1-migration-bun-ts"
          ]
        }
      },
      "observedVersion": "2.0.29",
      "method": "documentation",
      "surface": "cli"
    },
    {
      "harness": "pi",
      "variant": "current",
      "default": true,
      "verifiedAt": "2026-10-15",
      "evidence": ["transcripts-pi-packages-coding-agent-docs-session-format-md-5fcf07"],
      "references": [
        "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/session-format.md#L199-L207"
      ],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "automatic": "unsupported",
        "manual": "native",
        "modelTool": "unsupported",
        "persistentNames": "native"
      },
      "answers": {
        "autoName": {
          "status": "unsupported",
          "answer": "No. A session has no name until you set one, and the `/resume` picker shows its first message instead.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/session-format.md#L199-L207",
          "evidence": [
            "transcripts-pi-packages-coding-agent-docs-session-format-md",
            "transcripts-pi-packages-coding-agent-src-core-session-manager-ts"
          ],
          "notes": [
            "An extension can name sessions itself through `pi.setSessionName()`; see `examples/extensions/session-name.ts`."
          ]
        },
        "rename": {
          "status": "supported",
          "answer": "Run `/name <name>` in a session (plain `/name` shows the current name), or start Pi with `--name <name>` / `-n <name>`. In the `/resume` picker, select a session and press `Ctrl+R` to rename it. RPC clients send `set_session_name`, and extensions call `pi.setSessionName()`.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/sessions.md#L16-L18",
          "evidence": [
            "memory-pi-packages-coding-agent-docs-sessions-md",
            "pi-docs-1-2-0",
            "steering-pi-packages-coding-agent-docs-keybindings-md",
            "steering-pi-packages-coding-agent-docs-rpc-commands-md",
            "steering-pi-kages-coding-agent-src-modes-interactive-interactive-mode-ts"
          ],
          "notes": [
            "Line breaks in a name are turned into spaces. Pi shows the name in the footer and the terminal title."
          ]
        },
        "useName": {
          "status": "partial",
          "answer": "You can search for it in the `/resume` (or `pi --resume`) picker, which matches the name along with the ID, message text and folder; `Ctrl+N` limits the list to named sessions. `--session`, `--fork` and `--continue` take only a file path or session ID, not a name.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/sessions.md#L18",
          "evidence": [
            "memory-pi-packages-coding-agent-docs-sessions-md",
            "sessions-pi--src-modes-interactive-components-session-selector-search-ts",
            "steering-pi-packages-coding-agent-docs-keybindings-md",
            "transcripts-pi-packages-coding-agent-src-main-ts"
          ]
        },
        "stored": {
          "status": "supported",
          "answer": "Each rename adds a `session_info` entry with a `name` field to the session's JSONL file, and the latest one wins (an empty name clears it), so the name survives restarts and resume. `pi --fork` copies the name along with everything else. `/fork`, `/clone` and `/export <file>.jsonl` copy only the active branch, so they keep the name only if it was set on that branch before the copy point.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/session-format.md#L199-L207",
          "evidence": [
            "transcripts-pi-packages-coding-agent-docs-session-format-md",
            "transcripts-pi-packages-coding-agent-src-core-session-manager-ts",
            "sessions-pi-packages-coding-agent-src-core-session-export-ts"
          ]
        }
      },
      "observedVersion": "1.2.0",
      "method": "documentation",
      "surface": "cli"
    }
  ]
}
