Skip to content

Telltale

Source Validation Matrix

Telltale supports eight exact coding-agent source identities. Support means fixture-backed discovery, canonical acquisition, and detection coverage for that identity. Live host checks are extra context, not the support gate.

How to read support claims

A source is supported only when the required coverage gates have fixture-backed proof for that exact identity. Live host validation is useful operational context, but it is not the support gate and should not require scanning large or sensitive real stores.

  • Eight supported identities across six agent families. Acquisition accepts only those exact pairs; there are no hidden candidate registrations.
  • Fixture-backed plus bounded live validation: Codex, OpenCode, Claude Code, and GitHub Copilot.
  • Fixture-backed only: Qwen CLI and OpenClaw. Preview for live stores.
  • Retired and not registered: `gemini.tmp`, `opencode.legacy_json`, `opencode.project_json`, `roocode.tasks`, `kilocode.tasks`, and `codex.project_sessions`.
  • Public examples use synthetic fixtures and bounded dry-run commands, not raw local transcripts.

Client evidence matrix

Each row is one registered source identity. Canonical observations are not the raw store. Conditional or unknown fields are not complete execution evidence. Packaging smoke checks do not establish live source-store coverage.

Telltale source validation status and evidence caveats

Codex sessions

Source kind
`codex.sessions`
Session format
JSONL under `$CODEX_HOME/sessions` or `~/.codex/sessions`
Current confidence
Fixture-backed + bounded live validation, including a Windows re-check on 2026-10-14. One acquired source can exceed the per-source evaluation budget.

Workspace is conditional. Process ID is absent. A completed command preserves exit code as `tool.exit_code`. Call ID, error state, and content parts are conditional.

Codex archived sessions

Source kind
`codex.archived_sessions`
Session format
JSONL under `$CODEX_HOME/archived_sessions` or `~/.codex/archived_sessions`
Current confidence
Fixture-backed + bounded live validation. Windows discovery for this path is not separately live-validated.

Same canonical gaps as `codex.sessions`.

Codex headless sessions

Source kind
`codex.headless_sessions`
Session format
JSONL under `$CODEX_HOME/headless` or `~/.codex/headless`
Current confidence
Fixture-backed + bounded live validation. Windows discovery for this path is not separately live-validated.

Same canonical gaps as `codex.sessions`.

OpenCode

Source kind
`opencode.sqlite`
Session format
SQLite file `opencode/opencode.db` under the platform data home
Current confidence
Fixture-backed + bounded live validation. Not complete full-store coverage for every install.

Workspace is conditional. Process ID is absent. Exit code is reported only for v2 user shell commands and settled v2 agent `shell` tool calls. A v2 tool entry stays ToolExecution Unknown even when `executed: true` or a settled `shell` call emits an execution stage; v2 user shell commands report Supported. Oversized rows are quarantined. Call ID, error state, and content parts are conditional. Legacy JSON and project-local OpenCode registrations are retired.

GitHub Copilot

Source kind
`copilot.process_log`
Session format
Project-local `logs/copilot/*.log`; not home-relative
Current confidence
Fixture-backed + bounded live validation

UserContext is unsupported, so UC-001 is a tested visibility gap, not a benign result. Content parts are absent. Tool results are conditional. ToolExecution is unknown. Call ID is kept when the log reports it. Workspace may be an initialization UUID, not a filesystem path. Exit code and error state are absent. Static MCP config inventory is not supported.

Claude Code

Source kind
`claude.projects`
Session format
JSONL under `~/.claude/projects`; also `$CLAUDE_CONFIG_DIR/projects` when set, unless `--root` is explicit
Current confidence
Fixture-backed + bounded live validation. A Windows re-check after the 2.1.x parser fix is recorded for one host; it is not broad live coverage.

Workspace, process ID, and exit code are absent. Timestamps, call ID, error state, and content parts are conditional.

Qwen CLI

Source kind
`qwen.projects`
Session format
JSONL under `~/.qwen/projects`
Current confidence
Fixture-backed only; preview for live stores. Windows discovery is unvalidated.

Workspace, process ID, and exit code are absent. ToolCall and UserContext are supported. ToolExecution is unknown. Timestamps can be partial. Call ID, error state, and content parts are conditional.

OpenClaw

Source kind
`openclaw.agents`
Session format
Files under `~/.openclaw/agents` whose names contain `.jsonl`
Current confidence
Fixture-backed only; preview for live stores. Windows discovery is unvalidated.

Workspace, process ID, and exit code are absent. ToolCall and UserContext are supported. ToolExecution is unknown. Timestamps can be partial. Call ID, error state, and content parts are conditional.

Required coverage gates

Before a source is advertised as supported, the Telltale source-validation matrix requires deterministic coverage that can run from a clean checkout.

  • Discovery finds the expected fixture files.
  • A benign fixture is extracted and acquired, with native accounting and progress checked.
  • A tool-call fixture maps to the expected canonical observation.
  • A tool-result fixture maps to the expected canonical observation.
  • UC-001 has a positive detection, or a contract-backed capability gap that proves the attack content survived acquisition. Copilot is that gap: UserContext is unsupported, so the chain does not fire. A missing fixture is not a visibility gap.
  • A genuinely observed benign fixture has no UC-001 matches. Other signals, such as `execution.shell`, may still fire. A quiet result under an unsupported capability is not an efficacy true negative.
  • Absent, conditional, and unknown fields are documented before the source is user-visible.

Adding or changing a source

The contributor checklist separates session discovery from install inventory. It requires exact source ownership, native extraction, canonical mapping, adapter conformance, positive and negative detection fixtures, and capability notes before any support claim.

UC-001 identity conformance
SH
cargo test --locked --test evaluation_corpus uc001_

Run from a Telltale checkout. This checks all eight identities. It is a synthetic conformance gate, not live-store qualification.

Safe validation commands

Use fixture-backed checks first. When checking real stores, keep the scan bounded, read-only, and summarized without publishing raw paths or transcripts.

Fixture-safe scan and rule validation
SH
cargo run --bin telltale -- scan --once --dry-run --no-local-config --root tests/fixtures/session_stores
cargo run --bin telltale -- rules validate --no-local-config

Run from the Telltale repository. `--no-local-config` keeps workstation rule packs out of the check. `--rules` adds files; it does not validate one file by itself.

Bounded real-store acquisition check
SH
telltale scan --once --dry-run --root "$HOME" --client codex --max-sources 5

Client filters and source caps keep a real-store check small. Do not publish raw transcript content or machine-specific paths.

Project-local source discovery

Copilot process logs are the only project-local source. Project discovery is additive to home-relative sources from `--root`. With no project config and a scan root of `.`, Telltale uses `~/github` and `~/projects` when those directories exist. An explicit project file replaces that default. `--root "$HOME"` alone does not load it.

Project root declaration
YAML
projects:
  - name: my-project
    path: ~/github/my-project
Scan with project roots
SH
telltale scan --once --root "$HOME" --project-config projects.yaml

This finds Copilot `logs/copilot` under the declared project. Project-local OpenCode and Codex registrations are retired.

What not to overclaim

  • Do not describe Qwen or OpenClaw as live-validated, or retired identities as supported.
  • Do not treat canonical observations as the raw store. Preserve the original session store separately.
  • Do not treat a quiet Copilot UC-001 result as proof the attack content was absent. User context is unsupported.
  • Do not say Codex or OpenCode exit codes are always absent, or that Copilot never preserves a call ID.
  • Do not publish workstation-specific session paths, transcript identifiers, credentials, telemetry logs, or SIEM configuration from live validation.