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.
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.
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.
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.
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.
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.
session_open declares a goal and a repo root. Subsequent TriSeek calls accrue to this session's action log automatically.
session_open {"goal": "Fix flaky integration test in auth_service"}
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.
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/.
triseek snapshot create --session session_123 --source-harness claude_code .
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.
triseek brief <snapshot_id> --mode no-inference
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.
triseek resume <snapshot_id> --write-to AGENTS.md
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.
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.
| Tool | Inputs | Returns | When 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. |
$ 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
All session state lives under the daemon directory. Nothing is written into your repo.
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
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.
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.
<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 | Required fields | Description |
|---|---|---|
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. |
Schema version bumps on breaking reader changes. Additive fields do not bump the version. Readers validate the version and refuse unknown schemas.
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.
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.
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.
$ 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
Every briefing — templated or model-backed — uses the same six headers. The validator rejects briefings that miss any of them.
## 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.
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.
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 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.
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.
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.
| Harness | Snapshot capture | Resume / 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. |
Honest scope sheet. Anything marked Coming lives only on the Vision page and is not promised here.
| Capability | Status |
|---|---|
| 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, Cline | Coming |
| Auto-snapshot via harness hooks (PreCompact) | Coming |
| Cross-machine resume | Coming |
| Team-shared packs | Coming |
| Replay / audit verbs | Coming |
| Eval harness | Coming |
The headline switch. Claude is unavailable or you want a second opinion. The session moves with you.
/triseek handoff codex → snapshot snap_1746300000_session_123 created → briefing.md written → in Codex, paste: $triseek resume snap_1746300000_session_123
$triseek resume snap_1746300000_session_123 → memo primed (12 files) → search reuse warmed (8 queries) → frecency restored → AGENTS.md updated with hydration payload
Same harness, different day. Snapshot at end of session, resume against the same daemon tomorrow with everything still warm.
$ triseek snapshot create --session session_123 \
--source-harness claude_code .
$ triseek resume snap_1746300000_session_123 \ --write-to CLAUDE.md → CLAUDE.md updated; ready to continue
Full forward-looking picture: Vision & Roadmap.
session_* toolContext 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.