SINCE v0.4.2 · CLAUDE CODE ↔ CODEX

Switch agents without
losing the work.

Claude Code goes down at 2pm. Your four hours of debugging shouldn't. TriSeek snapshots a session in one harness and resumes it in the other with primed memo, warmed search reuse, restored frecency, captured git state, and pinned snippets — on top of the same local-first code search engine that wins 38 of 39 medium-repo benchmarks.

// 01 — vendor contingency

Vendor contingency, by design

Most serious AI-coding teams already pay for both Claude Code and Codex and run them in parallel. Context loss when switching is meaningfully expensive — and no single harness vendor has incentive to solve it.

Multi-harness reality

Provider outages, model regressions, and pricing changes all show up unannounced. A serious workflow keeps both Claude Code and Codex authenticated and ready — not as a luxury, but as a cheap insurance policy.

Context loss is expensive

Four hours of debugging produces deep context: established facts, ruled-out hypotheses, opened files, and the next planned move. Restarting from a cold session in the other harness throws most of that away.

Neutral layer

Neither vendor has incentive to commoditize its own context — only a neutral third party will. TriSeek sits between Claude Code and Codex on your machine and owns the artifacts that travel between them.

// 02 — flow

The five-step flow

Open a session, work as you would normally, snapshot, optionally brief, and resume in the other harness. Each step maps to one MCP tool or one CLI command.

1

Open a session

session_open declares a goal and a repo root. Subsequent TriSeek calls accrue to this session's action log automatically.

MCP
session_open {"goal": "Fix flaky integration test in auth_service"}
2

Work

Search, read files, request a context pack, run memo checks. Every tool call accrues an entry to the session's action_log.jsonl. Frecency, memo, and search reuse all warm up as you go.

3

Snapshot

session_snapshot (or the CLI triseek snapshot create) condenses the working set, action log, frecency state, git state, and any pinned snippets into a schema-versioned snapshot directory under ~/.triseek/daemon/snapshots/.

shell
triseek snapshot create --session session_123 --source-harness claude_code .
4

Brief (optional)

triseek brief writes a markdown briefing.md into the snapshot directory using the no-inference template (see briefing). Useful when the receiving harness needs a human-readable summary, but not required for resume to work.

shell
triseek brief <snapshot_id> --mode no-inference
5

Resume

session_resume primes the daemon's memo, frecency, and search-reuse state from the snapshot, then returns a markdown hydration payload. triseek resume --write-to AGENTS.md drops that payload into the receiving harness's project file in one step.

shell
triseek resume <snapshot_id> --write-to AGENTS.md
// 03 — sessions

Session lifecycle

A session is a goal, a series of TriSeek calls, and zero or more snapshots. The daemon owns session state, so two harnesses can refer to the same session_id at the same time.

Open work + snapshots Closed (resolved) or Closed (abandoned)

MCP tools

All ten session-related tools landed in v0.4.2. Full input/output schemas live in the MCP reference; this table is the high-level map.

ToolInputsReturnsWhen to call
session_open goal, optional session_id Full session record Once at the start of a task.
session_status optional session_id Session record + action_log_size Before snapshotting or closing.
session_list optional status filter Sessions for the current repo Reconnect to an existing session from another harness.
session_close session_id, status Updated session record When the work is done or abandoned.
session_snapshot session_id, optional source harness/model, optional pinned snippets snapshot_id, manifest Whenever you want a checkpoint — before switching, before risky edits, end of day.
session_handoff session_id, optional pack output path Snapshot envelope; optionally also exports a .tcp pack Convenience: snapshot + close + (optional) export in one call.
session_snapshot_list optional session_id List of snapshot manifests Browsing checkpoints in the daemon store.
session_snapshot_get snapshot_id Full snapshot envelope Inspect what was captured before resuming.
session_snapshot_diff snapshot_a, snapshot_b Added/removed/changed files and searches Compare two checkpoints of the same session.
session_resume snapshot_id, optional budget_tokens Hydration payload (markdown), token estimate, hydration report At the start of the receiving harness session.

CLI walkthrough

shell
$ triseek snapshot create --session session_123 --source-harness claude_code .
$ triseek snapshot list
$ triseek snapshot show snap_1746300000_session_123
$ triseek snapshot diff snap_a snap_b
$ triseek brief snap_1746300000_session_123 --mode no-inference
$ triseek pack export snap_1746300000_session_123 --output handoff.tcp
$ triseek pack import handoff.tcp
$ triseek resume snap_1746300000_session_123 --write-to AGENTS.md
$ triseek handoff codex --from claude_code   # target-aware: snapshot + brief + resume target

What lives where

All session state lives under the daemon directory. Nothing is written into your repo.

~/.triseek/daemon/
sessions/
  sessions.json                              # index of all sessions for this machine
  <session_id>/
    action_log.jsonl                         # append-only TriSeek call log
snapshots/
  <snapshot_id>/
    manifest.json                            # identity, repo, git, harness, generation
    working_set.json                         # files_read, searches_run, frecency_top_n
    action_log.jsonl                         # copied from the session at snapshot time
    pinned_snippets.json                     # index of pinned snippets
    pinned_snippets/
      <sha>.txt                              # content-addressed quoted text
    git_state.json                           # commit, dirty files, hunk summary
    briefing.md                              # optional; written by triseek brief

Multiple harnesses, one session

Both Claude Code and Codex can hold the same session_id open at the same time, because the state lives in the long-running TriSeek daemon and not in either harness. That shared daemon is what lets a resumed session inherit memo, frecency, and warmed search reuse from the prior harness without an explicit transfer step.

// 04 — pack format

Pack format

A pack is a gzipped tarball that materializes a snapshot directory for transport. Extension .tcp. Schema version 1. v1 is unsigned — signing is a future capability.

Layout inside the tarball

handoff.tcp
<root>/
  manifest.json
  working_set.json
  action_log.jsonl
  pinned_snippets.json
  pinned_snippets/
    <sha>.txt
  git_state.json
  briefing.md            # optional; only present when triseek brief was run
  checksums.txt          # sha256 of every file above

Artifact schemas

ArtifactRequired fieldsDescription
manifest.json schema_version, snapshot_id, session_id, created_at, repo_root, repo_commit, repo_dirty_files, source_harness, source_model, generation, context_epoch Snapshot identity and provenance — which session, which repo, which commit, which harness.
working_set.json schema_version, files_read[], searches_run[], frecency_top_n[] The state TriSeek primes back into the daemon on resume.
action_log.jsonl Per line: schema_version, entry_id, session_id, ts, kind, payload Append-only ordered log of every TriSeek call captured during the session.
pinned_snippets.json schema_version, entries[{path, line_start, line_end, sha}] Index of user-pinned quoted spans. Each entry references a file in pinned_snippets/<sha>.txt.
git_state.json schema_version, commit, branch, dirty_files[], hunk_summary Disambiguates branch / dirty state at snapshot time so the receiver knows what working tree the prior session saw.

What's deliberately not in the pack

Forward compatibility

Schema version bumps on breaking reader changes. Additive fields do not bump the version. Readers validate the version and refuse unknown schemas.

Why this format

A directory of files stays debuggable. JSONL survives partial writes for the action log. Content-addressed snippets dedupe across snapshots. Excluding raw file bodies keeps packs small and ties them to a local repo — that constraint is also a privacy boundary.

// 05 — briefing

Briefing

A briefing is an optional markdown summary that lives at briefing.md inside a snapshot directory. The snapshot is fully functional without one — session_resume works either way.

v0.4.2 ships the no-inference template

The no-inference mode builds a deterministic markdown briefing from the action log alone — no model call, no external network, fastest path, default mode. The CLI also accepts --mode local-model and --mode cloud-model for forward compatibility, but both currently fall back to the same no-inference template in v0.4.2. Model-backed summarization is on the roadmap, not in this release.

shell
$ triseek brief snap_1746300000_session_123 --mode no-inference
$ triseek brief snap_1746300000_session_123 --mode local-model   # accepted; falls back to no-inference
$ triseek brief snap_1746300000_session_123 --mode cloud-model   # accepted; falls back to no-inference

The briefing schema

Every briefing — templated or model-backed — uses the same six headers. The validator rejects briefings that miss any of them.

briefing.md
## Goal
## Current hypothesis
## Established facts
## Ruled out
## Open questions
## Next planned action

Ruled out is the highest-leverage section — without it, a resumed agent re-explores dead ends the prior session already eliminated.

Validation

The daemon validates briefings before writing: required headers must be present, every [action_log:<id>] citation under Established facts must reference a real entry in the snapshot's action log, and the file must stay under a 6,000-byte budget. A failed validation aborts the briefing write rather than leaving a malformed file on disk.

// 06 — privacy & trust

Privacy & trust model

The daemon does no inference

The TriSeek daemon never calls a model. The only place inference enters the picture is the (still-stubbed) local-model / cloud-model briefing modes, which run client-side from the CLI and use a user-configured endpoint. Default behavior is fully local.

Snapshots stay local

Snapshots and packs live under ~/.triseek/daemon/snapshots/. Nothing leaves the machine unless you explicitly export a .tcp file and move it yourself. There is no network sync in v0.4.2.

No raw file contents

The snapshot records paths, line ranges, and content hashes — not file bodies. Pinned snippets are the only verbatim content, and only for spans the prior agent intentionally pinned. The pack is meaningless without the local repo it points at.

// 07 — harnesses

Supported harnesses

v0.4.2 ships first-class adapter flows for Claude Code and Codex on the same machine. Other MCP-capable harnesses can use the underlying CLI manually until first-class adapters land.

HarnessSnapshot captureResume / hydration writer
Claude Code ✓ Full adapter Writes hydration payload to CLAUDE.md (or chosen project file).
Codex ✓ Full adapter Writes hydration payload to AGENTS.md (or chosen project file).
OpenCode, Pi, Cursor, Cline, others ⚠ CLI-only Run triseek snapshot create and triseek resume --print; paste the markdown into wherever the harness expects context. First-class adapters are on the roadmap.
// 08 — scope

Ships in v0.4.2 vs. coming

Honest scope sheet. Anything marked Coming lives only on the Vision page and is not promised here.

CapabilityStatus
Snapshot a session and persist it locally✓ v0.4.2
Resume a session in the same harness✓ v0.4.2
Resume between Claude Code and Codex on the same machine✓ v0.4.2
Pack export / import (.tcp)✓ v0.4.2
No-inference templated briefing✓ v0.4.2
Model-backed briefing (local / cloud)Coming
First-class adapters for OpenCode, Pi, Cursor, ClineComing
Auto-snapshot via harness hooks (PreCompact)Coming
Cross-machine resumeComing
Team-shared packsComing
Replay / audit verbsComing
Eval harnessComing
// 09 — walkthroughs

End-to-end walkthroughs

Claude Code → Codex

The headline switch. Claude is unavailable or you want a second opinion. The session moves with you.

in Claude Code
/triseek handoff codex
→ snapshot snap_1746300000_session_123 created
→ briefing.md written
→ in Codex, paste:
  $triseek resume snap_1746300000_session_123
in Codex
$triseek resume snap_1746300000_session_123
→ memo primed (12 files)
→ search reuse warmed (8 queries)
→ frecency restored
→ AGENTS.md updated with hydration payload

Claude Code → Claude Code (next morning)

Same harness, different day. Snapshot at end of session, resume against the same daemon tomorrow with everything still warm.

end of day
$ triseek snapshot create --session session_123 \
    --source-harness claude_code .
next morning
$ triseek resume snap_1746300000_session_123 \
    --write-to CLAUDE.md
→ CLAUDE.md updated; ready to continue
// 10 — limits

What this doesn't do yet

Full forward-looking picture: Vision & Roadmap.

// related

Related docs

Inside TriSeek

Release

Context portability shipped in TriSeek v0.4.2. Full release notes including new MCP tools, CLI commands, storage paths, and the acceptance demo: v0.4.2 release notes.

All TriSeek releases on GitHub →