cowork-harness 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,60 @@ All notable changes to this project are documented here. The format is based on
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.18.0] — 2026-06-27
10
+
11
+ ### Fixed
12
+
13
+ - `sync` no longer flags an unknown delta when `coworkEgressAllowedHosts` is absent from
14
+ `config.json` (the normal state for a fresh install with no user-configured custom egress
15
+ hosts). Previously the absent key was treated the same as a wrong-typed value and blocked
16
+ the baseline write entirely.
17
+ - `sync` now regenerates the baseline `$comment` with the current capture date instead of
18
+ carrying the stale string forward from the prior baseline via the `...base` spread.
19
+ - A misplaced GLOBAL flag (the space form `--dotenv <path>` / `--run-dir <path>` placed *after* the
20
+ subcommand, where the pre-0.17.0 docs put `--dotenv`) now fails with a position hint —
21
+ `--dotenv is a GLOBAL flag and must come BEFORE the subcommand (e.g. \`cowork-harness --dotenv <path> doctor …\`)`
22
+ — instead of a bare `unknown flag: --dotenv` (or, for some commands, an unrelated positional /
23
+ "unexpected argument" error) that sent users hunting for a per-command flag that doesn't exist. The
24
+ hint honors `--output-format json`, never pre-empts `--version`/`--help`, and only fires for a known
25
+ subcommand (a junk command still gets the accurate "unknown command"). The `--dotenv=<path>` equals
26
+ form is not matched — to avoid hijacking a legitimate value like `--answer "--dotenv=x=y"` — so a
27
+ misplaced equals form still gets the plain unknown-flag rejection. (A bare `--dotenv`/`--run-dir`
28
+ token used as another flag's omitted value, e.g. `decide --question --dotenv`, is pre-empted by the
29
+ hint rather than the more specific "requires a value" error; both exit 2.)
30
+ - `doctor`'s no-token remedies now show `--dotenv` in its correct **leading** position
31
+ (`cowork-harness --dotenv <path> <cmd>`). The git-worktree remedy previously printed the pre-0.17.0
32
+ `<cmd> --dotenv` form — which the new position hint above now rejects — so `doctor` was suggesting a
33
+ command the harness refuses. The generic no-token remedy also now advertises the
34
+ `--dotenv <path> <cmd>` form, so pointing at a non-cwd `.env` is discoverable.
35
+ - `skill --help` / `run --help` now label `--run-dir` as a **GLOBAL** flag that must precede the
36
+ subcommand. It was listed in each command's local "Output:" flag block, implying
37
+ `skill … --run-dir <path>`, which the command rejects (`--run-dir` is honored only before the
38
+ subcommand, like `--dotenv`).
39
+
40
+ ### Changed
41
+
42
+ - Baseline bumped to `desktop-1.15962.0` (agent `2.1.187`). Content is unchanged from
43
+ `1.15200.0` — host-loop generator, system prompt, identity, gates, and egress domains are
44
+ all byte-identical per asar analysis. Version and fingerprint fields only. The live-contract
45
+ suite was re-run green against the staged `2.1.187` agent on this baseline, so the
46
+ "verified end-to-end" claims are earned. Cassettes recorded against the `1.15200.0` baseline will
47
+ report a non-failing baseline-drift warning on `replay` (a hard fail under `--strict` /
48
+ `verify-cassettes`); re-record to clear, or ignore it since the asar content is byte-identical.
49
+
50
+ ### Documentation
51
+
52
+ - Audit-validated doc/DX fixes: corrected the `docs/cassette.md` cassette-version example
53
+ (`6`→`7`); rewrote the `protocol-smoke` row to stop referencing a rejected
54
+ `transcript_no_host_path: false` line; scoped the SKILL.md "agent binary" prerequisite to the
55
+ sandboxed live tiers (protocol/replay need none); added `python3` to the README requirements
56
+ (the `lint` linter shells out to it); moved the `/plugin` slash-command block off the `bash`
57
+ fence; pinned `cowork-harness@>=0.17.0` in the CI recipe; noted that `chat` excludes
58
+ `microvm`/`cowork`; and other small corrections (see `docs/internal/2026-06-26-doc-audit-*`).
59
+ - Refreshed all verification/version stamps that still pinned `1.15200.0` / `2.1.181`
60
+ (README, DESIGN, SPEC, the spawn-contract reference, `docs/cassette.md` fingerprint example,
61
+ and the `hostloop-prompt.ts` re-verified comment) to `1.15962.0` / `2.1.187`.
62
+
9
63
  ## [0.17.0] — 2026-06-26
10
64
 
11
65
  ### Upgrade notes
package/README.md CHANGED
@@ -17,6 +17,7 @@ Scriptable, CI-friendly test harness that reproduces **Claude Cowork's observabl
17
17
 
18
18
  > **Requirements at a glance**
19
19
  > - **Free demo (`replay`):** Node ≥ 20 — nothing else (no Docker, token, or Claude Desktop).
20
+ > - **`lint` (optional, token-free):** also needs **`python3`** on PATH — the scenario linter shells out to it (PyYAML is bundled); a missing `python3` is a hard `exit 127`.
20
21
  > - **Live tiers**: **Claude Desktop opened once** (stages the agent — nothing is bundled) · a **Claude token** (real per-run cost; runs take minutes — mint one with `claude setup-token`, which needs the **`claude` CLI**: `npm i -g @anthropic-ai/claude-code`) · plus a runtime — **Docker (arm64)** for `container` (default) / `hostloop`, or **Lima (Apple-VZ)** for `microvm`. The `protocol` tier skips the runtime + the staged agent but still calls a real model, so it needs the token. (`doctor --tier <t>` reports exactly what a given tier needs.)
21
22
  > - **Platform:** best on **macOS Apple Silicon**; **Windows is not supported** for the live tiers (use the token-free `replay`); `sync` and `microvm` are **macOS-arm64 only**. Full detail in [Quick start → prerequisites](#quick-start).
22
23
 
@@ -92,7 +93,7 @@ Skill testing is the headline use, but the tool is a general harness over the Co
92
93
  |---|---|---|
93
94
  | `skill <folder> "<prompt>"` | Run a local skill/plugin folder once against the staged agent | ad-hoc "is the skill alive / does it do X?" — the fast inner loop |
94
95
  | `run <scenario.yaml \| dir/>` | Run authored scenarios with `assert:` + a CI-ready exit code | you want a repeatable, **asserted regression test** |
95
- | `chat <folder> [prompt]` | Interactive multi-turn REPL against a skill (TTY); optional seed prompt is sent as the first turn. `--upload <file>` / `--folder <dir>` (repeatable) attach files/project folders; `--verbose` / `-V` shows thinking blocks + tool inputs; `--fidelity protocol\|container\|hostloop` | debugging a multi-turn flow by hand |
96
+ | `chat <folder> [prompt]` | Interactive multi-turn REPL against a skill (TTY); optional seed prompt is sent as the first turn. `--upload <file>` / `--folder <dir>` (repeatable) attach files/project folders; `--verbose` / `-V` shows thinking blocks + tool inputs; `--fidelity protocol\|container\|hostloop` (no `microvm`/`cowork` in the REPL) | debugging a multi-turn flow by hand |
96
97
  | `record` / `replay` | **Record a live run once → replay it token-free, Docker-free thereafter.** `record` saves a control-protocol cassette (one scenario, or batch a `dir/`; `--rerecord-stale` refreshes only drifted ones; `--concurrency <N>` records a batch N at a time — runs are fully isolated, so it just bounds Docker/API pressure; `--max-artifact-bytes` raises the 64 KiB inline-body cap; `--dry-run` previews the scenarios + token/binary checks without recording; answer gates **live during the recording** with `--decider-dir`/`--decider-llm`/`--on-unanswered first` instead of pre-scripting them — a live decider flags the cassette non-deterministic but it still replays deterministically); `replay <file.cassette.json \| dir/>` runs a cassette **file or a `dir/` of `*.cassette.json`** deterministically (`--strict` fails on any stale one, `--fail-on-skill-drift` only on skill-source drift; staleness is also reported per-result in `staleness[]` for a JSON gate; exits on the worst verdict) | **token-free, Docker-free CI** from a once-recorded run |
97
98
  | `verify-cassettes <file\|dir>` | Token-free CI gate over committed cassettes: a privacy scan (email/currency/domain → exit 1; whole-token allows via `--allow` / class-scoped `--allow-domain` / `--allow-email` / `--allow-file`) + a staleness check (`--skip-privacy` or `--skip-staleness` to run only one half). A dir argument scans `*.cassette.json` in that dir only (**non-recursive**) | gating **committed cassettes** against PII leaks + "edited the skill, forgot to re-record" |
98
99
  | `verify-run <run-dir> <scenario.yaml>` | Re-evaluate a scenario's `assert:` (and, when the scenario declares `answers:`, whether they still match the run's actual gates) against an already-kept run dir — **no live agent, no tokens, no Docker** (~1s) | iterating on a wrong assertion or a drifted `answer` without a full live re-record |
@@ -143,12 +144,12 @@ Only the committed-cassette `replay` above is fully self-contained. Live `run`/`
143
144
 
144
145
  This repo ships a **companion skill** (`.claude/skills/cowork-harness/`) that teaches an agent how to drive the harness — author scenarios, pick a fidelity tier, script answers, place assertions in the right CI lane, and avoid the "✓ passed ≠ correct" traps. Install it via the bundled marketplace — run these **in Claude Code** (slash commands, not your shell):
145
146
 
146
- ```bash
147
+ ```text
147
148
  /plugin marketplace add yaniv-golan/cowork-harness
148
149
  /plugin install cowork-harness@cowork-harness
149
150
  ```
150
151
 
151
- The skill **self-bootstraps the CLI**: if `cowork-harness` isn't on your PATH it falls back to `npx cowork-harness@>=0.17.0` (a version floor that fails loud rather than silently fetching a too-old CLI; Node ≥ 20). Tiers above `protocol` still need Docker/Lima and a Claude Desktop agent binary — see the prerequisites below.
152
+ The skill **self-bootstraps the CLI**: if `cowork-harness` isn't on your PATH it falls back to `npx cowork-harness@>=0.18.0` (a version floor that fails loud rather than silently fetching a too-old CLI; Node ≥ 20). Tiers above `protocol` still need Docker/Lima and a Claude Desktop agent binary — see the prerequisites below.
152
153
 
153
154
  It also follows the open [Agent Skills](https://github.com/vercel-labs/skills) spec, so it installs cross-editor (Cursor, Codex, OpenCode, …) by pointing the `npx skills` CLI at `.claude/skills/cowork-harness` in this repo. (Working *inside* this repo, the skill auto-loads as a project skill — no install needed.)
154
155
 
@@ -336,7 +337,7 @@ assert:
336
337
  # Relative paths below resolve from THIS file's dir (absolute and ~ are used as-is).
337
338
  model: claude-opus-4-8
338
339
  effort: high
339
- max_thinking_tokens: 8000
340
+ max_thinking_tokens: 8000 # kept low for example cost; real default 31999 (see docs/session.md)
340
341
  permission_mode: default
341
342
  permission_parity: cowork # cowork (allow unscripted tool calls, the default) | strict (deny unscripted)
342
343
  folders:
@@ -380,7 +381,7 @@ The harness builds a **clean managed `CLAUDE_CONFIG_DIR` per run** (with a gener
380
381
 
381
382
  ## What you get out (inspectable output)
382
383
 
383
- Every run writes to `~/.cowork-harness/runs/<scenario>/<sessionId>/` (out of any working tree; relocate with `--run-dir <path>` or `COWORK_HARNESS_RUNS_DIR`):
384
+ Every run writes to `~/.cowork-harness/runs/<scenario>/<sessionId>/` (out of any working tree; relocate with the global `--run-dir <path>` flag — it goes *before* the subcommand — or `COWORK_HARNESS_RUNS_DIR`):
384
385
 
385
386
  ```
386
387
  events.jsonl full stream-json event log (child→driver; the cassette source)
@@ -482,7 +483,7 @@ Most runs need **none** of these — the defaults are correct. They're grouped b
482
483
  - `COWORK_AGENT_IMAGE=<tag>` — override the agent image name (default `cowork-agent-base:2`); `COWORK_AGENT_BINARY=<path>` — override the auto-detected staged agent ELF.
483
484
  - `COWORK_SKIP_CAPABILITY_PROBE=1` — skip the per-run capability probe (the harness otherwise probes the agent image/VM for the document/OCR/Office capabilities the real Cowork rootfs ships and **fails a run that uses one the image omits** — a likely false negative; suppress per-scenario with `allow_missing_capability: true`, or rebuild full parity).
484
485
  - `COWORK_HARNESS_DECIDER_MODEL` — the default `--decider-llm` answering model (overridden by the `--decider-model` flag; falls back to the Haiku default). `COWORK_HARNESS_DECIDER_DIR_POLL_MS` / `_TIMEOUT_MS` — tune the `--decider-dir` rendezvous poll/backstop; `COWORK_HARNESS_DECIDER_CMD_TIMEOUT_MS` / `COWORK_HARNESS_LLM_TIMEOUT_MS` — backstop a hung `--decider-cmd` helper / `--decider-llm` model call (default 600 s, fail loud); `COWORK_HARNESS_LLM_RETRIES` — bounded retries for a transient non-zero `claude -p` exit in the `--decider-llm` transport (default 2, clamped to 0–10; set `0` to disable, e.g. deterministic CI); `COWORK_HARNESS_DIALOG_TIMEOUT_MS` — override the 6 s dialog auto-cancel.
485
- - `COWORK_HARNESS_RUNS_DIR` (or the `--run-dir <path>` flag) — override the default run-output root `~/.cowork-harness/runs` (kept out of any working tree so sensitive skill inputs/outputs don't land in a repo). Precedence: `--run-dir` > env > default. The root is flat and machine-global (shared across projects); pinned `--session-id` runs are guarded against cross-project overwrite, and `prune` never prunes them. In CI, set it to a workspace path (e.g. `runs`) so artifact upload can collect the runs. `COWORK_HARNESS_ALLOW_FOREIGN_RESUME=1` overrides the guard that blocks `--resume` onto another project's pinned session.
486
+ - `COWORK_HARNESS_RUNS_DIR` (or the `--run-dir <path>` flag — a **global** flag that must precede the subcommand, like `--dotenv`) — override the default run-output root `~/.cowork-harness/runs` (kept out of any working tree so sensitive skill inputs/outputs don't land in a repo). Precedence: `--run-dir` > env > default. The root is flat and machine-global (shared across projects); pinned `--session-id` runs are guarded against cross-project overwrite, and `prune` never prunes them. In CI, set it to a workspace path (e.g. `runs`) so artifact upload can collect the runs. `COWORK_HARNESS_ALLOW_FOREIGN_RESUME=1` overrides the guard that blocks `--resume` onto another project's pinned session.
486
487
  - **Networking / loop:** `COWORK_EGRESS_PROXY` overrides the egress-proxy URL injected into the sandbox; `COWORK_PROXY_IMAGE` overrides the egress proxy Docker image name (default `cowork-egress-proxy:1`); `COWORK_DOCKER_NETWORK` pins the Docker network the agent container joins; `CLAUDE_FORCE_HOST_LOOP=1` forces the host-loop path regardless of the baseline's loop decision (the `cowork` tier's auto-pick). `COWORK_LIMACTL` overrides the `limactl` binary path (default `/opt/homebrew/bin/limactl`).
487
488
  - **Strictness escape hatches** (the harness fails loud by default): `COWORK_HARNESS_SOFT_MISSING=1` downgrades a missing mount source from a hard error to warn-and-exclude; `COWORK_HARNESS_ALLOW_CONFIG_DIR_WRITE=1` permits writing into an existing pinned `plugins.config_dir` (otherwise refused, to avoid clobbering a real Claude config).
488
489
  - **Staleness boundary:** the cassette-staleness skill hash uses the **git-tracked** file set of each skill/plugin source dir by default (a non-repo dir falls back to a raw walk; OS-junk like `.DS_Store` is always excluded). `COWORK_HARNESS_GITSET=0` opts out to the legacy raw walk for every dir. `COWORK_HARNESS_DEBUG_SKILLHASH=1` dumps the exact file set feeding the hash on a staleness mismatch (and flags OS-junk) so a drift source is one line. Declare per-plugin non-runtime paths in a `.cowork-hashignore` file (or the session `staleness.hash_ignore`). `COWORK_HARNESS_AGENT_SCOPE=skill` (opt-in) refines a scenario's `skills:` scope so a **skill-named** `agents/<name>.md` re-stales only that skill's cassettes instead of the whole fleet (generic agents stay shared; stamped into the fingerprint, so flipping it is a one-time re-record like `GITSET`).
@@ -565,7 +566,7 @@ This repo is built to be driven by agents, not just read by humans:
565
566
 
566
567
  ## Status
567
568
 
568
- **Verified end-to-end against the live staged agent (2.1.181 / asar 1.15200.0).** Host-side parity (egress/gates/mount/web_fetch facts + the reconstructed prompt appends) re-derived for 1.15200.0 via `sync` + asar inspection; the live scenario suite passes against this baseline (the staged agent ELF is unchanged at 2.1.181).
569
+ **Verified end-to-end against the live staged agent (2.1.187 / asar 1.15962.0).** Host-side parity (egress/gates/mount/web_fetch facts + the reconstructed prompt appends) re-derived for 1.15962.0 via `sync` + asar inspection; the live scenario suite passes against this baseline (the 1.15962.0 asar content is byte-identical to 1.15200.0 — all runtime-shape fields unchanged).
569
570
 
570
571
  - ✅ **Three isolation tiers (L0/L1/L2) + two loop-mode overlays** — `protocol` (L0 control loop), `container` (L1 sandboxed arm64 + per-run default-deny egress sidecar), `microvm` (L2 real Apple-VZ Linux microVM + guest firewall); plus the loop-mode overlays `hostloop` (production split-execution: agent loop on host, shell/web via the workspace SDK-MCP server) and `cowork` (auto-picks host-loop vs container the way Cowork does — gate `1143815894`). Egress enforced at container/microvm/hostloop; `boundary-check` reports **ALL CONSTRAINTS ENFORCED**.
571
572
  - ✅ **Three-seam driver** — `AgentSession` (control protocol) → `Decider` (scripted + `on_unanswered` policy, no silent false-greens) → `Run` (turn loop, sub-agent dispatch tree, `RunRecord`). Multi-turn `chat`, deterministic cassette `record`/`replay` (no token), `run.jsonl`/`trace.json` logging with secret-scrub.
@@ -0,0 +1,220 @@
1
+ {
2
+ "baselineVersion": 1,
3
+ "appVersion": "1.15962.0",
4
+ "agentVersion": "2.1.187",
5
+ "agentBinary": {
6
+ "stagedPath": "~/Library/Application Support/Claude/claude-code-vm/2.1.187/claude",
7
+ "format": "elf-aarch64"
8
+ },
9
+ "guest": {
10
+ "os": "linux",
11
+ "arch": "arm64",
12
+ "baseImage": "ubuntu:22.04"
13
+ },
14
+ "spawn": {
15
+ "configDirInGuest": "mnt/.claude",
16
+ "settingSources": [
17
+ "user"
18
+ ],
19
+ "permissionMode": "default",
20
+ "maxThinkingTokens": 31999,
21
+ "effortDefault": "medium",
22
+ "tools": [
23
+ "Task",
24
+ "Bash",
25
+ "Glob",
26
+ "Grep",
27
+ "Read",
28
+ "Edit",
29
+ "Write",
30
+ "NotebookEdit",
31
+ "WebFetch",
32
+ "TaskCreate",
33
+ "TaskUpdate",
34
+ "TaskGet",
35
+ "TaskList",
36
+ "TaskStop",
37
+ "WebSearch",
38
+ "Skill",
39
+ "REPL",
40
+ "JavaScript",
41
+ "AskUserQuestion",
42
+ "ToolSearch"
43
+ ],
44
+ "allowedTools": [
45
+ "Task",
46
+ "Bash",
47
+ "Glob",
48
+ "Grep",
49
+ "Read",
50
+ "Edit",
51
+ "Write",
52
+ "NotebookEdit",
53
+ "WebFetch",
54
+ "TaskCreate",
55
+ "TaskUpdate",
56
+ "TaskGet",
57
+ "TaskList",
58
+ "TaskStop",
59
+ "WebSearch",
60
+ "Skill",
61
+ "REPL",
62
+ "JavaScript",
63
+ "ToolSearch"
64
+ ],
65
+ "env": {
66
+ "CLAUDE_CODE_IS_COWORK": "1",
67
+ "CLAUDE_CODE_ENTRYPOINT": "local-agent",
68
+ "CLAUDE_CODE_TAGS": "lam_session_type:chat",
69
+ "CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST": "1",
70
+ "CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL": "true",
71
+ "CLAUDE_CODE_DISABLE_CRON": "1",
72
+ "CLAUDE_CODE_DISABLE_BACKGROUND_TASKS": "1",
73
+ "CLAUDE_CODE_DISABLE_AGENTS_FLEET": "1",
74
+ "CLAUDE_CODE_ENABLE_APPEND_SUBAGENT_PROMPT": "1",
75
+ "CLAUDE_CODE_ENABLE_TASKS": "true",
76
+ "CLAUDE_CODE_DISABLE_TERMINAL_TITLE": "1",
77
+ "ENABLE_PROMPT_CACHING_1H": "1",
78
+ "DISABLE_MICROCOMPACT": "1",
79
+ "MCP_CONNECTION_NONBLOCKING": "true"
80
+ },
81
+ "promptTemplate": "prompts/desktop-1.15200.0/system-prompt-append.md",
82
+ "subagentAppend": "prompts/desktop-1.15200.0/subagent-append-vm.md",
83
+ "$comment": "Binary-verified Desktop->agent spawn contract (asar 1.12603.1). See docs/cowork-spawn-contract-1.12603.1.md.",
84
+ "$comment_notSet": "Deliberately NOT set: CLAUDE_CODE_USE_COWORK_PLUGINS (Desktop never sets it; would flip the agent to cowork_settings.json/cowork_plugins). Host-derived (TZ, account UUIDs, WORKSPACE_HOST_PATHS, OTEL) injected at runtime, not pinned.",
85
+ "$comment_prompts": "Reconstructed cowork-specific sections, re-paraphrased from asar 1.15200.0 const MZi (system prompt) + generator CVr (subagent) — not the full base prompt (not cleanly extractable), and excluding the generic refusal/safety tail. The main append is delivered via the --append-system-prompt CLI flag (layered on the agent's built-in base prompt), NOT the initialize handshake; only the subagent append goes over initialize (appendSubagentSystemPrompt), gated on CLAUDE_CODE_ENABLE_APPEND_SUBAGENT_PROMPT."
86
+ },
87
+ "mountLayout": {
88
+ "sessionRoot": "/sessions/{sessionId}",
89
+ "cwd": "/sessions/{sessionId}",
90
+ "mntRoot": "/sessions/{sessionId}/mnt",
91
+ "mounts": [
92
+ {
93
+ "name": "uploads",
94
+ "mountPath": "uploads",
95
+ "mode": "r",
96
+ "purpose": "user-uploaded files (read-only — asar 'ro')"
97
+ },
98
+ {
99
+ "name": "projects",
100
+ "mountPath": ".projects/{projectId}",
101
+ "mode": "rw",
102
+ "purpose": "RESERVED namespace (and the separate UUID project-sync feature) — NOT the work-folder path. From Desktop 1.14271.0 selected work folders mount at mnt/<collision-resolved-basename> (dynamic, derived per session by buildLaunchPlan; see MOUNT_BARE_NAME_MIN_VERSION). This decorative row is not consumed for binding (staged paths come from plan.mounts)."
103
+ },
104
+ {
105
+ "name": "local-plugins",
106
+ "mountPath": ".local-plugins/marketplaces",
107
+ "mode": "r",
108
+ "purpose": "marketplace skills/plugins, runtime-discovered"
109
+ },
110
+ {
111
+ "name": "remote-plugins",
112
+ "mountPath": ".remote-plugins",
113
+ "mode": "r",
114
+ "purpose": "org-remote plugins, runtime-discovered"
115
+ },
116
+ {
117
+ "name": "outputs",
118
+ "mountPath": "outputs",
119
+ "mode": "rw",
120
+ "purpose": "session outputs/artifacts — delete denied by default (asar IX); rwd only when approved"
121
+ }
122
+ ]
123
+ },
124
+ "network": {
125
+ "mode": "gvisor",
126
+ "allowKind": "allowlist",
127
+ "allowDomains": [
128
+ "sentry.io",
129
+ "preview.claude.ai",
130
+ "downloads.claude.ai",
131
+ "api.anthropic.com",
132
+ "a-cdn.anthropic.com",
133
+ "a-api.anthropic.com",
134
+ "assets.claude.ai",
135
+ "console.anthropic.com",
136
+ "api-staging.anthropic.com",
137
+ "www.anthropic.com",
138
+ "docs.anthropic.com",
139
+ "mcp-proxy.anthropic.com",
140
+ "pivot.claude.ai",
141
+ "support.anthropic.com"
142
+ ]
143
+ },
144
+ "bgEnvStrip": {
145
+ "knownVars": [
146
+ "CLAUDE_CODE_OAUTH_TOKEN",
147
+ "CLAUDE_CODE_SESSION_KIND",
148
+ "CLAUDE_CODE_SESSION_ID",
149
+ "CLAUDE_CODE_SESSION_NAME",
150
+ "CLAUDE_CODE_SESSION_LOG"
151
+ ]
152
+ },
153
+ "$comment": "Platform baseline auto-derived by `cowork-harness sync` from a live Claude Desktop install + app.asar. VOLATILE per-release facts only. Regenerate per release; review the diff. Captured 2026-06-26 on macOS arm64.",
154
+ "capturedAt": "2026-06-26",
155
+ "platform": "darwin-arm64",
156
+ "settings": {
157
+ "autoMountFolders": {
158
+ "key": "autoMountFolders",
159
+ "default": false
160
+ },
161
+ "localAgentModeTrustedFolders": {
162
+ "key": "localAgentModeTrustedFolders",
163
+ "default": []
164
+ }
165
+ },
166
+ "provenance": {
167
+ "asarPath": "/Applications/Claude.app/Contents/Resources/app.asar",
168
+ "asarFingerprint": "0fe570e50d97404f",
169
+ "gates": {
170
+ "$comment": "Production GrowthBook gate states decoded from ~/Library/Application Support/Claude/fcache (standard interactive Anthropic account, 2026-06-13; binary-verified app.asar 1.12603.1). Pin per release. Behavior-affecting gates the harness models: 1143815894 (loop), 1648655587 (dispatch cap), 1978029737 (web_fetch routing). Telemetry/auth-internal gates omitted.",
171
+ "bridgeSdkTransport:583857784": {
172
+ "on": true,
173
+ "source": "force",
174
+ "value": true,
175
+ "note": "— Cowork uses the SDK-based transport (control protocol), confirming the harness's sdkMcpServers/mcp_message path is the production transport."
176
+ },
177
+ "hostLoop:1143815894": {
178
+ "on": true,
179
+ "source": "force",
180
+ "value": true
181
+ },
182
+ "taskDispatchLimiter:1648655587": {
183
+ "on": true,
184
+ "source": "force",
185
+ "value": {
186
+ "perTask": 1,
187
+ "global": 3
188
+ },
189
+ "note": "perTask=1 global=3 (host-side SKIP: recordSkipAndEmit/GCA.PerTaskLimit — NOT queue/deny). A dispatch session launches <=1 sub-task; <=3 concurrent globally."
190
+ },
191
+ "coworkRuntimeConfig:1978029737": {
192
+ "on": true,
193
+ "source": "force",
194
+ "value": {
195
+ "sessionsBridgePollBlockMs": 30,
196
+ "coworkNativeFilePreview": true,
197
+ "coworkWebFetchViaApi": true,
198
+ "coworkWebFetchPrompt": true,
199
+ "workspaceBashWaitLonger": true
200
+ },
201
+ "note": "coworkWebFetchViaApi=true coworkWebFetchPrompt=true workspaceBashWaitLonger=true sessionsBridgePollBlockMs=30 — web_fetch is host/API-routed (POST /api/organizations/<org>/cowork/web_fetch), NOT container egress; gated by a separate web-fetch hostname allowlist + URL provenance."
202
+ },
203
+ "cliPlugin:2307090146": {
204
+ "on": false,
205
+ "source": "defaultValue",
206
+ "value": false,
207
+ "note": "— the CLI-plugin credential broker is dark-launched off for standard interactive accounts (Ch23/L106)."
208
+ },
209
+ "pluginSyncSparkplug:2340532315": {
210
+ "on": true,
211
+ "source": "force",
212
+ "value": true,
213
+ "note": "— startup syncPlugins(); plugins load via --plugin-dir (registry inert in-VM)."
214
+ }
215
+ },
216
+ "eipcChannelUuid": "4f426349-8d6f-45f3-ae22-280fef323564",
217
+ "$comment": "eipcChannelUuid is per-build; recorded for provenance only — the harness does not use Desktop IPC."
218
+ },
219
+ "requireFullVmSandbox": null
220
+ }
package/dist/cli.js CHANGED
@@ -198,8 +198,9 @@ Output:
198
198
  --output-format text|json text = live stream + footer (default); json = one stdout envelope
199
199
  --quiet, -q verdict footer only --verbose, -V + thinking/tool inputs/sub-agent tree
200
200
  --keep print the run dir + deliverable path (runs are always kept on disk)
201
- --run-dir <path> write runs/ under <path> (default ~/.cowork-harness/runs) — keeps sensitive
202
- artifacts out of the working tree. flag > COWORK_HARNESS_RUNS_DIR > default.
201
+ --run-dir <path> GLOBAL flag — must PRECEDE the subcommand (cowork-harness --run-dir <path> skill …);
202
+ relocates runs/ output (default ~/.cowork-harness/runs) out of the working tree.
203
+ flag > COWORK_HARNESS_RUNS_DIR > default. (placed after the subcommand it is rejected.)
203
204
  --model <id> override the session model
204
205
  --dry-run preview scenarios, token and binary checks, without recording NO_COLOR=1 disable ANSI
205
206
 
@@ -237,8 +238,9 @@ Input policy:
237
238
  Output:
238
239
  --output-format text|json text = verdict + failing transcript (default); json = stdout envelope
239
240
  --quiet, -q verdict only --verbose, -V live stream + per-tool markers
240
- --run-dir <path> write runs/ under <path> (default ~/.cowork-harness/runs); keeps sensitive
241
- artifacts out of the working tree. flag > COWORK_HARNESS_RUNS_DIR > default.
241
+ --run-dir <path> GLOBAL flag — must PRECEDE the subcommand (cowork-harness --run-dir <path> run …);
242
+ relocates runs/ output (default ~/.cowork-harness/runs) out of the working tree.
243
+ flag > COWORK_HARNESS_RUNS_DIR > default. (placed after the subcommand it is rejected.)
242
244
  NO_COLOR=1 disable ANSI on stderr
243
245
 
244
246
  Long runs: an idle "still running" heartbeat prints on stderr after ~30s of silence
@@ -433,6 +435,26 @@ async function main() {
433
435
  const envOutFmt = process.env.COWORK_HARNESS_OUTPUT_FORMAT;
434
436
  if (envOutFmt !== undefined && envOutFmt !== "text" && envOutFmt !== "json")
435
437
  fail(cmd, "usage", `COWORK_HARNESS_OUTPUT_FORMAT must be "text" or "json" (got "${envOutFmt}")`, undefined, isJsonOutput(rest));
438
+ // `--dotenv` / `--run-dir` are GLOBAL flags, honored ONLY in leading position (both stripped above before
439
+ // dispatch). An exact `--dotenv` / `--run-dir` token surviving in `rest` sits AFTER the subcommand — a
440
+ // misplaced global, the #1 footgun: the bare per-command "unknown flag: --dotenv" (or, for run/assertions,
441
+ // an unrelated positional / "unexpected argument" error) sent users hunting for a per-command flag that
442
+ // doesn't exist (campaign-2 H-2/H-4 — `--dotenv` where the pre-0.17.0 docs put it). Reject with a position
443
+ // hint. Placed here — AFTER the --version/--help short-circuits (so a `--help`/`-h` request still wins,
444
+ // matching the #27 precedent above) and routed through fail() so the json envelope + exit-2 path match
445
+ // every other usage error. Gated on a KNOWN `cmd`, so a junk subcommand (`frobnicate --dotenv x`) falls
446
+ // through to the more accurate "unknown command" path below rather than getting a hint that implies it was
447
+ // valid. EXACT-token match only: the `--flag=value` form is intentionally NOT matched, so a per-command
448
+ // value like `--answer "--dotenv=x=foo"` is never hijacked (a misplaced `--dotenv=x` then falls through to
449
+ // the command's own unknown-flag rejection). KNOWN trade-off: a bare token used as another flag's value
450
+ // (e.g. `decide --question --dotenv`, omitting the value) is pre-empted here — it would otherwise get a
451
+ // more specific "<flag> requires a value" error; both exit 2, and the input is rare (value omitted AND
452
+ // literally equal to the token).
453
+ if (!hasHelp(rest) && COMMANDS.includes(cmd)) {
454
+ const misplacedGlobal = rest.find((t) => t === "--dotenv" || t === "--run-dir");
455
+ if (misplacedGlobal)
456
+ fail(cmd, "usage", `${misplacedGlobal} is a GLOBAL flag and must come BEFORE the subcommand (e.g. \`cowork-harness ${misplacedGlobal} <path> ${cmd} …\`)`, undefined, isJsonOutput(rest));
457
+ }
436
458
  switch (cmd) {
437
459
  case "run":
438
460
  return cmdRun(rest);
@@ -1435,11 +1457,13 @@ function cmdSync(args) {
1435
1457
  if (prevFingerprint && prevFingerprint !== res.asarFingerprint) {
1436
1458
  log(`note: asarFingerprint changed (${prevFingerprint} → ${res.asarFingerprint}); gates re-synced above.`);
1437
1459
  }
1460
+ const capturedAt = new Date().toISOString().slice(0, 10);
1438
1461
  const next = {
1439
1462
  ...base,
1463
+ $comment: `Platform baseline auto-derived by \`cowork-harness sync\` from a live Claude Desktop install + app.asar. VOLATILE per-release facts only. Regenerate per release; review the diff. Captured ${capturedAt} on macOS arm64.`,
1440
1464
  baselineVersion: 1,
1441
1465
  appVersion: res.appVersion,
1442
- capturedAt: new Date().toISOString().slice(0, 10),
1466
+ capturedAt,
1443
1467
  agentVersion: res.agentVersion,
1444
1468
  agentBinary: nextAgentBinary,
1445
1469
  network: { ...base.network, mode: res.networkMode ?? "gvisor", allowKind: "allowlist", allowDomains: res.allowDomains },
@@ -224,8 +224,8 @@ export function runDoctorChecks(tier, probe = realProbe) {
224
224
  : keychainOnly
225
225
  ? "copy your Keychain token into ./.env so the in-Docker agent can read it: echo CLAUDE_CODE_OAUTH_TOKEN=$(claude setup-token) >> .env"
226
226
  : worktreeEnv
227
- ? `the main checkout has a .env — point at it: cowork-harness <cmd> --dotenv ${worktreeEnv} (or set CLAUDE_CODE_OAUTH_TOKEN)`
228
- : "export CLAUDE_CODE_OAUTH_TOKEN=$(claude setup-token) or put it in .env",
227
+ ? `the main checkout has a .env — point at it: cowork-harness --dotenv ${worktreeEnv} <cmd> (or set CLAUDE_CODE_OAUTH_TOKEN)`
228
+ : "export CLAUDE_CODE_OAUTH_TOKEN=$(claude setup-token), put it in ./.env, or point at another file: cowork-harness --dotenv <path> <cmd>",
229
229
  required: true, // every doctor tier calls a real model (only a committed-cassette replay needs none)
230
230
  });
231
231
  const bl = probe.baseline();
@@ -34,7 +34,7 @@ export function generateHostLoopShellSection(inp) {
34
34
  : `\n\nNo user folders are connected yet. To work with the user's files, request a folder with mcp__cowork__${reqFolder}.`;
35
35
  // asar `ie` branch (host-only/unmounted folders) is ALWAYS empty here: the harness runs a single
36
36
  // container where every mount is visible to both file tools and workspace-bash, so there is no
37
- // "file-tool-reachable but not bash-mounted" set. Omit the branch. In 1.15200.0 this branch is the
37
+ // "file-tool-reachable but not bash-mounted" set. Omit the branch. In 1.15962.0 this branch is the
38
38
  // literal `QA.length>0` sentence ("Folders annotated 'bash ... cannot see this path' in the
39
39
  // workspace section above are not mounted here; use Read/Write/Edit/Grep/Glob for those.") — `QA` is
40
40
  // the set of non-empty folder copyHint annotations, which is empty in our single-container topology,
@@ -5,9 +5,10 @@ import { join, dirname } from "node:path";
5
5
  import { gitModeEnabled, gitCpFilter } from "../run/skill-files.js";
6
6
  import { containedRealPath } from "../boundary-paths.js";
7
7
  /**
8
- * L0 — protocol-only runtime. Spawns the host `claude` with --cowork and the
9
- * stream-json control protocol. No VM, no container, no egress control. Fast
10
- * inner loop for skill logic + scripted-answer validation.
8
+ * L0 — protocol-only runtime. Spawns the host `claude` with the stream-json
9
+ * control protocol — WITHOUT `--cowork` (a guest-only flag the host CLI rejects;
10
+ * see the note in spawnProtocol below). No VM, no container, no egress control.
11
+ * Fast inner loop for skill logic + scripted-answer validation.
11
12
  *
12
13
  * Mounts are reproduced as plain directories under work/ so the agent sees the
13
14
  * same relative layout (uploads/, .projects/, .local-plugins/) — minus isolation.
@@ -86,10 +86,7 @@ export function sync() {
86
86
  const config = readConfigJson(join(SUPPORT, "config.json"), unknown);
87
87
  const networkMode = config["coworkNetworkMode"] ?? null;
88
88
  const requireFullVmSandbox = config["lastSeenRequireCoworkFullVmSandbox"] ?? null;
89
- const userAllow = Array.isArray(config["coworkEgressAllowedHosts"])
90
- ? config["coworkEgressAllowedHosts"]
91
- : (flag(unknown, "coworkEgressAllowedHosts: expected an array but got " + typeof config["coworkEgressAllowedHosts"] + " — user allow-list ignored"),
92
- []);
89
+ const userAllow = parseEgressAllowedHosts(config["coworkEgressAllowedHosts"], unknown);
93
90
  // 4. Egress allowlist from the asar (vmAllowedDomains + firewallAlso), merged with user hosts.
94
91
  const { domains, fingerprint } = extractFromAsar(unknown);
95
92
  const allowDomains = dedupe([...domains, ...userAllow]);
@@ -240,6 +237,18 @@ export function readConfigJson(p, unknown) {
240
237
  return {};
241
238
  }
242
239
  }
240
+ /** Parse the `coworkEgressAllowedHosts` value from the user config.
241
+ * - array → pass through as-is (normal user overrides)
242
+ * - absent (undefined) → empty; normal for a fresh install, NOT an unknown delta
243
+ * - any other type → empty + unknown delta (misconfiguration the user should see) */
244
+ export function parseEgressAllowedHosts(raw, unknownDeltas) {
245
+ if (Array.isArray(raw))
246
+ return raw;
247
+ if (raw === undefined)
248
+ return [];
249
+ flag(unknownDeltas, `coworkEgressAllowedHosts: expected an array but got ${typeof raw} — user allow-list ignored`);
250
+ return [];
251
+ }
243
252
  const dedupe = (a) => [...new Set(a)];
244
253
  const flag = (acc, what) => {
245
254
  acc.push(what);
package/docs/cassette.md CHANGED
@@ -29,7 +29,7 @@ Use a live `run` for filesystem/egress assertions; use `replay` for the token-fr
29
29
 
30
30
  ```jsonc
31
31
  {
32
- "cassetteVersion": 6, // format version; ABSENT = legacy (0); a FUTURE version warns
32
+ "cassetteVersion": 7, // format version; ABSENT = legacy (0); a FUTURE version warns
33
33
  "scenario": { /* Scenario object — same schema as the .yaml */ },
34
34
  "events": [ /* JSON lines from events.jsonl (child→driver stdout) */ ],
35
35
  "controlOut": [ /* JSON lines from control-out.jsonl (driver→child control_responses) */ ],
@@ -38,7 +38,7 @@ Use a live `run` for filesystem/egress assertions; use `replay` for the token-fr
38
38
  { "path": "outputs/x.json", "bytes": 24, "sha256": "…", "body": "{…}" }, // body inlined ≤ 64 KiB
39
39
  { "path": "outputs/big.bin", "bytes": 9e6, "sha256": "…", "truncated": true } // oversized → hash-only
40
40
  ],
41
- "fingerprint": { "baseline": "1.15200.0", "skillHash": "…", "mode": "git", "contentSig": "…", "fileSigs": [["skills/x/SKILL.md", "…"]], "skillSources": ["…"] }, // staleness tripwire (v5: fileSigs only; v6: mode + git default; v7: NUL-delimited hash entries)
41
+ "fingerprint": { "baseline": "1.15962.0", "skillHash": "…", "mode": "git", "contentSig": "…", "fileSigs": [["skills/x/SKILL.md", "…"]], "skillSources": ["…"] }, // staleness tripwire (v5: fileSigs only; v6: mode + git default; v7: NUL-delimited hash entries)
42
42
  "authoring": { "nonDeterministic": true, "channel": "decider-dir" } // present ONLY when a live decider answered ≥1 gate (see §Answering gates during recording); re-record may drift, replay is still deterministic
43
43
  }
44
44
  ```
@@ -1,11 +1,11 @@
1
1
  # Cowork spawn contract — app.asar 1.12603.1 / agent ELF 2.1.170
2
2
 
3
- > **Applicability note:** verified on `desktop-1.12603.1`. The current baseline is `desktop-1.15200.0`
4
- > (agent ELF 2.1.181). Control-protocol fields documented here (spawn flags, handshake envelope,
3
+ > **Applicability note:** verified on `desktop-1.12603.1`. The current baseline is `desktop-1.15962.0`
4
+ > (agent ELF 2.1.187). Control-protocol fields documented here (spawn flags, handshake envelope,
5
5
  > permission/question shapes) are **unchanged**; the **mount layout changed at ≥1.14271.0** (work folders
6
6
  > now mount at `mnt/<name>`, not `mnt/.projects/<id>` — see CHANGELOG). Volatile fields — `agentVersion`,
7
- > egress `allowDomains`, GrowthBook gate values — have moved and are tracked in the latest baseline,
8
- > `baselines/desktop-1.15200.0.json`.
7
+ > egress `allowDomains`, GrowthBook gate values — have moved and are tracked in the latest baseline
8
+ > (`baselines/desktop-<latest>.json` — run `cowork-harness sync` to update).
9
9
 
10
10
  Binary-verified this session. Anchors: asar `/tmp/asar-review/.vite/build/index.js` find `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS:"1"` (spawn env), `function TSO(` (settings filename), `{{workspaceContext}}` (prompt template); ELF `strings | grep`.
11
11
 
package/docs/discovery.md CHANGED
@@ -59,7 +59,7 @@ line and one budget. The listing is packed under a shared character budget (~800
59
59
  default, ~1536/skill cap); when it overflows, **every** skill collapses to name-only at once
60
60
  (no description for any of them). A single bloated `when_to_use` can trigger that global
61
61
  collapse. The byte-level budget algorithm and constants are documented in the
62
- `claude-code-internals` skill (ref `02-agents-intelligence-interface.md`) — not restated here.
62
+ `claude-code-internals` skill (ref `02-agents-intelligence-interface.md`, an external skill not bundled here) — not restated here.
63
63
 
64
64
  **To verify what a run's model actually received, read the VM session log, not `events.jsonl`:**
65
65
 
@@ -28,7 +28,7 @@ self-contained and relocatable.
28
28
 
29
29
  | Scenario | Fidelity | What it demonstrates |
30
30
  |---|---|---|
31
- | `scenarios/protocol-smoke.yaml` | `protocol` | the **zero-infra smoke test** — no Docker, no staged agent, just the host control loop. Asserts only control-loop + skill-logic facts (a scripted answer reaches the model, a file is written); see the `transcript_no_host_path: false` line for what L0 does and does not seal |
31
+ | `scenarios/protocol-smoke.yaml` | `protocol` | the **zero-infra smoke test** — no Docker, no staged agent, just the host control loop. Asserts only control-loop + skill-logic facts (a scripted answer reaches the model, a file is written). L0 does **not** seal the filesystem, so a host-path leak is expected — the YAML's comment explains why `transcript_no_host_path` is **omitted** here (only `true` is a valid value; sandboxed tiers add `- transcript_no_host_path: true`) |
32
32
  | `scenarios/example-pdf-skill.yaml` | `container` | the minimal sandboxed shape — prompt + scripted answers + assertions (placeholder skill; harness plumbing only) |
33
33
  | `scenarios/csv-metrics.yaml` | `container` | a non-trivial skill running a **bundled producer** end-to-end → structured `outputs/metrics.json` + a `summary.md` (paired with `../python/test_csv_metrics_lane.py` for a JSON-content predicate) |
34
34
  | `scenarios/csv-fx-normalize.yaml` | `container` | **graceful degradation** under default-deny egress — the skill's real network step is blocked, so `egress_denied` is backed by genuine behavior and the skill falls back instead of crashing. Its `egress_denied` assertion needs a sandboxed tier (`container`+) and is pre-rejected at `protocol` fidelity (no sandbox to enforce it would be a false pass) |
@@ -13,6 +13,8 @@ replay path end-to-end, including:
13
13
 
14
14
  Run it with:
15
15
 
16
+ > Assumes the `cowork-harness` CLI is available — from a source checkout run `npm ci && npm run build && npm link` first, or `npm i -g cowork-harness@>=0.18.0`. (`replay` itself needs nothing else — no token, no Docker.)
17
+
16
18
  ```sh
17
19
  cowork-harness replay examples/replays/example-pdf-skill.cassette.json
18
20
  ```
@@ -46,32 +46,29 @@
46
46
  },
47
47
  "events": [
48
48
  "{\"type\":\"control_response\",\"response\":{\"subtype\":\"success\",\"request_id\":\"init-1\",\"response\":{\"commands\":[{\"name\":\"deep-research\",\"description\":\"Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. (dynamic workflow)\",\"argumentHint\":\"\"},{\"name\":\"my-pdf-skill\",\"description\":\"(my-pdf-skill) Example skill under test. Summarize a PDF and write action items.\",\"argumentHint\":\"\"},{\"name\":\"clear\",\"description\":\"Start a new session with empty context; previous session stays on disk (resumable with /resume)\",\"argumentHint\":\"[name]\",\"aliases\":[\"reset\",\"new\"]},{\"name\":\"compact\",\"description\":\"Free up context by summarizing the conversation so far\",\"argumentHint\":\"<optional custom summarization instructions>\"},{\"name\":\"config\",\"description\":\"Set a setting by key\",\"argumentHint\":\"key=value\",\"aliases\":[\"settings\"]},{\"name\":\"context\",\"description\":\"Show current context usage\",\"argumentHint\":\"\"},{\"name\":\"heapdump\",\"description\":\"Dump the JS heap to ~/Desktop\",\"argumentHint\":\"\"},{\"name\":\"init\",\"description\":\"Initialize a new CLAUDE.md file with codebase documentation\",\"argumentHint\":\"\"},{\"name\":\"reload-skills\",\"description\":\"Pick up skills added or changed on disk during this session\",\"argumentHint\":\"\"},{\"name\":\"review\",\"description\":\"Review a GitHub pull request; for your working diff use /code-review\",\"argumentHint\":\"[pr number]\"},{\"name\":\"security-review\",\"description\":\"Complete a security review of the pending changes on the current branch\",\"argumentHint\":\"\"},{\"name\":\"usage\",\"description\":\"Show session cost, plan usage, and what's contributing to your limits\",\"argumentHint\":\"\",\"aliases\":[\"cost\",\"stats\"]},{\"name\":\"insights\",\"description\":\"Generate a report analyzing your Claude Code sessions\",\"argumentHint\":\"\"},{\"name\":\"goal\",\"description\":\"Set a goal — keep working until the condition is met\",\"argumentHint\":\"\"},{\"name\":\"team-onboarding\",\"description\":\"Help teammates ramp on Claude Code with a guide from your usage\",\"argumentHint\":\"\"}],\"agents\":[{\"name\":\"claude\",\"description\":\"Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed.\"},{\"name\":\"claude-code-guide\",\"description\":\"Use this agent when the user asks questions (\\\"Can Claude...\\\", \\\"Does Claude...\\\", \\\"How do I...\\\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - API usage, tool use, Anthropic SDK usage. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage.\",\"model\":\"haiku\"},{\"name\":\"Explore\",\"description\":\"Fast read-only search agent for locating code. Use it to find files by pattern (eg. \\\"src/components/**/*.tsx\\\"), grep for symbols or keywords (eg. \\\"API endpoints\\\"), or answer \\\"where is X defined / which files reference Y.\\\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \\\"quick\\\" for a single targeted lookup, \\\"medium\\\" for moderate exploration, or \\\"very thorough\\\" to search across multiple locations and naming conventions.\",\"model\":\"haiku\"},{\"name\":\"general-purpose\",\"description\":\"General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you.\"},{\"name\":\"Plan\",\"description\":\"Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.\"},{\"name\":\"statusline-setup\",\"description\":\"Use this agent to configure the user's Claude Code status line setting.\",\"model\":\"sonnet\"}],\"output_style\":\"default\",\"available_output_styles\":[\"default\",\"Proactive\",\"Explanatory\",\"Learning\"],\"models\":[{\"value\":\"default\",\"displayName\":\"Default (recommended)\",\"description\":\"Sonnet 4.6 · Efficient for routine tasks\",\"supportsEffort\":true,\"supportedEffortLevels\":[\"low\",\"medium\",\"high\",\"max\"],\"supportsAdaptiveThinking\":true,\"supportsAutoMode\":true},{\"value\":\"sonnet\",\"displayName\":\"Sonnet\",\"description\":\"Sonnet 4.6 · Efficient for routine tasks\",\"supportsEffort\":true,\"supportedEffortLevels\":[\"low\",\"medium\",\"high\",\"max\"],\"supportsAdaptiveThinking\":true,\"supportsAutoMode\":true},{\"value\":\"opus\",\"displayName\":\"Opus\",\"description\":\"Opus 4.8 · Best for everyday, complex tasks\",\"supportsEffort\":true,\"supportedEffortLevels\":[\"low\",\"medium\",\"high\",\"xhigh\",\"max\"],\"supportsAdaptiveThinking\":true,\"supportsFastMode\":true,\"supportsAutoMode\":true},{\"value\":\"haiku\",\"displayName\":\"Haiku\",\"description\":\"Haiku 4.5 · Fastest for quick answers\"},{\"value\":\"claude-opus-4-8\",\"displayName\":\"Opus 4.8\",\"description\":\"Best for everyday, complex tasks (claude-opus-4-8)\",\"supportsEffort\":true,\"supportedEffortLevels\":[\"low\",\"medium\",\"high\",\"xhigh\",\"max\"],\"supportsAdaptiveThinking\":true,\"supportsFastMode\":true,\"supportsAutoMode\":true}],\"account\":{\"tokenSource\":\"CLAUDE_CODE_OAUTH_TOKEN\",\"apiProvider\":\"firstParty\"},\"pid\":1}}}",
49
- "{\"type\":\"system\",\"subtype\":\"init\",\"cwd\":\"/sessions/local_eiaovtw6x1\",\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"tools\":[\"Task\",\"AskUserQuestion\",\"Bash\",\"Edit\",\"Glob\",\"Grep\",\"NotebookEdit\",\"Read\",\"Skill\",\"TaskCreate\",\"TaskGet\",\"TaskList\",\"TaskStop\",\"TaskUpdate\",\"ToolSearch\",\"WebFetch\",\"WebSearch\",\"Write\"],\"mcp_servers\":[],\"model\":\"claude-opus-4-8\",\"permissionMode\":\"default\",\"slash_commands\":[\"deep-research\",\"my-pdf-skill:my-pdf-skill\",\"clear\",\"compact\",\"config\",\"context\",\"heapdump\",\"init\",\"reload-skills\",\"review\",\"security-review\",\"usage\",\"insights\",\"goal\",\"team-onboarding\"],\"apiKeySource\":\"none\",\"claude_code_version\":\"2.1.187\",\"output_style\":\"default\",\"agents\":[\"claude\",\"claude-code-guide\",\"Explore\",\"general-purpose\",\"Plan\",\"statusline-setup\"],\"skills\":[\"deep-research\",\"my-pdf-skill:my-pdf-skill\"],\"plugins\":[{\"name\":\"my-pdf-skill\",\"path\":\"/sessions/local_eiaovtw6x1/mnt/.local-plugins/marketplaces/local-desktop-app-uploads/my-pdf-skill\",\"source\":\"my-pdf-skill@inline\"}],\"analytics_disabled\":false,\"product_feedback_disabled\":false,\"uuid\":\"7d0dc004-f166-4f89-a0a3-78238225dd63\",\"memory_paths\":{\"auto\":\"/sessions/local_eiaovtw6x1/mnt/.claude/projects/-sessions-local-eiaovtw6x1/memory/\"},\"fast_mode_state\":\"off\"}",
50
- "{\"type\":\"system\",\"subtype\":\"thinking_tokens\",\"estimated_tokens\":50,\"estimated_tokens_delta\":50,\"uuid\":\"57c5af97-3dbc-423c-a25a-19de23d62fde\",\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\"}",
51
- "{\"type\":\"system\",\"subtype\":\"thinking_tokens\",\"estimated_tokens\":123,\"estimated_tokens_delta\":73,\"uuid\":\"3ebdec83-f322-4ed5-ac72-e905d95bbcbf\",\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\"}",
52
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01C9FGxnffEzmjjnBrAcq6te\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"thinking\",\"thinking\":\"\",\"signature\":\"EuIDCmMIDxgCKkDmE1xgd5xD9Zko9CbAIDYLO+wtMcuW+DJPVpH328IusXB9EYU5jEjDDvNQ7fKPTFsICk788fH1OoG0mk07YIOZMg9jbGF1ZGUtb3B1cy00LTg4AEIIdGhpbmtpbmcSDAp1S/Qw0/NfLs5JXhoMazvPDTqxKIJhmoypIjD/jlJB8LQ9XENTJG2lmhO395qf2mSX/xJ8gSvu1OEt3rx1dqhjY4FA4PRMc0nVPwAqrAIKo2lX6Np4u4KRj9rh/ioKWRU3JnSvvwtaQTRfWhX27c4ZpMQgXJLgh2KWl8dfWR5JBMB2imMY8/eAp0MJEso0pv1FO1fOv7ucGPFK2CICaa7IwoVp84EQm88+apZ50wQlD+rOmZXcX2LJJp3elojUXg7wNKjHmd04jZ9rrcFzObTehsQ1+jm22mJPSHcbHVM3t6kmtCTiljEu5p0XYhAA/NLLy+opnFXxp07BMeHuJ9QKujFY/BDyuHp0A2Hoboxi3WMcINKZ+f3USauMonkKn9zisELmtrQFelqYwiVLnH911XMLC/Njha6F0Xe1PMGrrcAgPZzgxJmxsenx/viPFAZFhim7bhcYSomPbHkHz5dGIP56MZs1C5SbHHNDZybElH1sozHZUXMOEkgYAQ==\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1185,\"cache_creation_input_tokens\":11015,\"cache_read_input_tokens\":0,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":11015},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"e1fb456a-a00a-4c9f-b0be-91ad3267aa0c\",\"request_id\":\"req_011CcS45yyHAEvSujVw8B8PV\"}",
53
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01C9FGxnffEzmjjnBrAcq6te\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"I'll use the relevant skill for this task since it's designed exactly for summarizing a PDF and writing action items.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1185,\"cache_creation_input_tokens\":11015,\"cache_read_input_tokens\":0,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":11015},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"cc5b677b-2c1b-4b49-9121-f0685c1b21a5\",\"request_id\":\"req_011CcS45yyHAEvSujVw8B8PV\"}",
54
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01C9FGxnffEzmjjnBrAcq6te\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01WL7gYSkdJJawU3RE7GUiPr\",\"name\":\"Skill\",\"input\":{\"skill\":\"my-pdf-skill:my-pdf-skill\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1185,\"cache_creation_input_tokens\":11015,\"cache_read_input_tokens\":0,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":11015},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"34dbc685-8205-4477-a0e5-f35cd9588c7c\",\"request_id\":\"req_011CcS45yyHAEvSujVw8B8PV\"}",
55
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"toolu_01WL7gYSkdJJawU3RE7GUiPr\",\"content\":\"Launching skill: my-pdf-skill:my-pdf-skill\"}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"fffaba9e-80b5-4339-8e7c-11efad3e6b9d\",\"timestamp\":\"2026-06-26T14:47:24.786Z\",\"tool_use_result\":{\"success\":true,\"commandName\":\"my-pdf-skill:my-pdf-skill\"}}",
56
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Base directory for this skill: /sessions/local_eiaovtw6x1/mnt/.local-plugins/marketplaces/local-desktop-app-uploads/my-pdf-skill/skills/my-pdf-skill\\n\\n# my-pdf-skill\\nPlaceholder skill so the example scenario resolves. Replace with the skill you're testing.\\n\"}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"d35c492a-4d68-4128-bbb4-5410d900c7d9\",\"timestamp\":\"2026-06-26T14:47:24.784Z\",\"isSynthetic\":true}",
57
- "{\"type\":\"rate_limit_event\",\"rate_limit_info\":{\"status\":\"rejected\",\"resetsAt\":1782495000,\"rateLimitType\":\"five_hour\",\"overageStatus\":\"allowed\",\"overageResetsAt\":1782864000,\"isUsingOverage\":true,\"overageInUse\":true},\"uuid\":\"18397920-212c-42c4-8c12-dc9b1f5ea157\",\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\"}",
58
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01SfRsZgNeks9S9ZPV4Et1gz\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"thinking\",\"thinking\":\"\",\"signature\":\"Eq4CCmMIDxgCKkCjDLg5dwyp8OmyB11TPaSVsb7eLmni7kGZO8WqTg18PKkzIDS4XEtg9kE0fdRXywwGgvAIQSqbENgMeyrqnw13Mg9jbGF1ZGUtb3B1cy00LTg4AEIIdGhpbmtpbmcSDEVFcIIrCl0ZBH6j7hoM9r2IXL9izGUlikB6IjAiFI4gNr5opQ0RtThip/T8k2xo8UXPmXNb4mGjFbtTJH2UVtvfu9fxd2ksQ/YANJ0qeeFNN2qXfrPPQqxncNHH1AuirEMuFGmnp9jaP/eEoZrewv4hD3u/spNjHnqbpmi8ymHpRsvq2tJZgU/6Sf5P0Pw/3mLHTHDxMktf56XI3h5HeHu4v/br+t+gKrVodgZUuOrjWImz283CG9WabMkEIHhW61WxNvh9XoMYAQ==\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1,\"cache_creation_input_tokens\":1526,\"cache_read_input_tokens\":11015,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1526},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"9dcd70fc-8354-4af7-96c0-fd01d6772dbd\",\"request_id\":\"req_011CcS46DiX8ZL8gTtjutifz\"}",
59
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01SfRsZgNeks9S9ZPV4Et1gz\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"The skill is just a placeholder, so I'll handle the task directly. Let me find and read the PDF.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1,\"cache_creation_input_tokens\":1526,\"cache_read_input_tokens\":11015,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1526},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"70e5aca2-e3ba-4f78-9c54-612aaf987514\",\"request_id\":\"req_011CcS46DiX8ZL8gTtjutifz\"}",
60
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01SfRsZgNeks9S9ZPV4Et1gz\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01XHksHuQ8z4EuyMvPKSvUAM\",\"name\":\"Bash\",\"input\":{\"command\":\"ls -la /sessions/local_eiaovtw6x1/mnt/uploads/\",\"description\":\"List uploaded files\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1,\"cache_creation_input_tokens\":1526,\"cache_read_input_tokens\":11015,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1526},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"decd4d55-626a-41ca-9cfc-9ef90a3d7950\",\"request_id\":\"req_011CcS46DiX8ZL8gTtjutifz\"}",
61
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_01XHksHuQ8z4EuyMvPKSvUAM\",\"type\":\"tool_result\",\"content\":\"total 4\\ndrwxr-xr-x 3 ubuntu ubuntu 96 Jun 26 14:47 .\\ndrwxr-xr-x 9 ubuntu ubuntu 288 Jun 26 14:47 ..\\n-rw-r--r-- 1 ubuntu ubuntu 1056 Jun 26 14:47 report.pdf\",\"is_error\":false}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"37fad230-4396-4570-afcd-5f610f3c07f7\",\"timestamp\":\"2026-06-26T14:47:27.760Z\",\"tool_use_result\":{\"stdout\":\"total 4\\ndrwxr-xr-x 3 ubuntu ubuntu 96 Jun 26 14:47 .\\ndrwxr-xr-x 9 ubuntu ubuntu 288 Jun 26 14:47 ..\\n-rw-r--r-- 1 ubuntu ubuntu 1056 Jun 26 14:47 report.pdf\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":false}}",
62
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01UHyUYbd92ixAX7MGvbaBWc\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_019LLvuE7jxDiReSCQPACCLF\",\"name\":\"Read\",\"input\":{\"file_path\":\"/sessions/local_eiaovtw6x1/mnt/uploads/report.pdf\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":299,\"cache_read_input_tokens\":12541,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":299},\"output_tokens\":73,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"f462f924-3541-4e0a-adc2-261d78e8b744\",\"request_id\":\"req_011CcS46T6S9VpcJi4choskc\"}",
63
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_019LLvuE7jxDiReSCQPACCLF\",\"type\":\"tool_result\",\"content\":\"PDF file read: /sessions/local_eiaovtw6x1/mnt/uploads/report.pdf (1KB)\"}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"eb6ed32e-7e95-4248-9daf-e0c223704a0c\",\"timestamp\":\"2026-06-26T14:47:29.615Z\",\"tool_use_result\":{\"type\":\"pdf\",\"file\":{\"filePath\":\"/sessions/local_eiaovtw6x1/mnt/uploads/report.pdf\",\"base64\":\"JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA0IDAgUiA+PiA+PiAvQ29udGVudHMgNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5cGUxIC9CYXNlRm9udCAvSGVsdmV0aWNhID4+CmVuZG9iago1IDAgb2JqCjw8IC9MZW5ndGggNTA1ID4+CnN0cmVhbQpCVAovRjEgMTQgVGYKNzIgNzIwIFRkCjE2IFRMCihRMiBQcm9qZWN0IFN0YXR1cyBSZXBvcnQpIFRqClQqClQqCihUaGUgbWlncmF0aW9uIHRvIHRoZSBuZXcgaW5nZXN0IHBpcGVsaW5lIGlzIG9uIHRyYWNrLiBFbmQtdG8tZW5kKSBUagpUKgoobGF0ZW5jeSBkcm9wcGVkIDMwJSBhZnRlciB0aGUgY2FjaGluZyBsYXllciBsYW5kZWQsIGFuZCBlcnJvciByYXRlcykgVGoKVCoKKGFyZSB3aXRoaW4gdGFyZ2V0LiBSZW1haW5pbmcgcmlzayBpcyB0aGUgZGF0YS1iYWNrZmlsbCB3aW5kb3cuKSBUagpUKgpUKgooQWN0aW9uIGl0ZW1zOikgVGoKVCoKKDEuIEFsaWNlOiBmaW5hbGl6ZSB0aGUgcHJvZHVjdGlvbiByb2xsb3V0IHBsYW4gYnkgSnVuZSAyMC4pIFRqClQqCigyLiBCb2I6IGFkZCBtb25pdG9yaW5nIGRhc2hib2FyZHMgZm9yIHRoZSBuZXcgcGlwZWxpbmUuKSBUagpUKgooMy4gQ2Fyb2w6IHVwZGF0ZSB0aGUgb24tY2FsbCBydW5ib29rIGFuZCBub3RpZnkgc3VwcG9ydC4pIFRqCkVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAwNjQgMDAwMDAgbiAKMDAwMDAwMDEyMSAwMDAwMCBuIAowMDAwMDAwMjQ3IDAwMDAwIG4gCjAwMDAwMDAzMTcgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA2IC9Sb290IDEgMCBSID4+CnN0YXJ0eHJlZgo4NzMKJSVFT0YK\",\"originalSize\":1056}}}",
64
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"document\",\"source\":{\"type\":\"base64\",\"media_type\":\"application/pdf\",\"data\":\"JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA0IDAgUiA+PiA+PiAvQ29udGVudHMgNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5cGUxIC9CYXNlRm9udCAvSGVsdmV0aWNhID4+CmVuZG9iago1IDAgb2JqCjw8IC9MZW5ndGggNTA1ID4+CnN0cmVhbQpCVAovRjEgMTQgVGYKNzIgNzIwIFRkCjE2IFRMCihRMiBQcm9qZWN0IFN0YXR1cyBSZXBvcnQpIFRqClQqClQqCihUaGUgbWlncmF0aW9uIHRvIHRoZSBuZXcgaW5nZXN0IHBpcGVsaW5lIGlzIG9uIHRyYWNrLiBFbmQtdG8tZW5kKSBUagpUKgoobGF0ZW5jeSBkcm9wcGVkIDMwJSBhZnRlciB0aGUgY2FjaGluZyBsYXllciBsYW5kZWQsIGFuZCBlcnJvciByYXRlcykgVGoKVCoKKGFyZSB3aXRoaW4gdGFyZ2V0LiBSZW1haW5pbmcgcmlzayBpcyB0aGUgZGF0YS1iYWNrZmlsbCB3aW5kb3cuKSBUagpUKgpUKgooQWN0aW9uIGl0ZW1zOikgVGoKVCoKKDEuIEFsaWNlOiBmaW5hbGl6ZSB0aGUgcHJvZHVjdGlvbiByb2xsb3V0IHBsYW4gYnkgSnVuZSAyMC4pIFRqClQqCigyLiBCb2I6IGFkZCBtb25pdG9yaW5nIGRhc2hib2FyZHMgZm9yIHRoZSBuZXcgcGlwZWxpbmUuKSBUagpUKgooMy4gQ2Fyb2w6IHVwZGF0ZSB0aGUgb24tY2FsbCBydW5ib29rIGFuZCBub3RpZnkgc3VwcG9ydC4pIFRqCkVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAwNjQgMDAwMDAgbiAKMDAwMDAwMDEyMSAwMDAwMCBuIAowMDAwMDAwMjQ3IDAwMDAwIG4gCjAwMDAwMDAzMTcgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA2IC9Sb290IDEgMCBSID4+CnN0YXJ0eHJlZgo4NzMKJSVFT0YK\"}}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"92183d82-a171-41fc-bde6-f1229ddc1fc8\",\"timestamp\":\"2026-06-26T14:47:29.615Z\",\"isSynthetic\":true}",
65
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_018c6NapXWJkgyj6JSEMvbXY\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"I've read the report. Now let me write the action items checklist to the outputs folder.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":1848,\"cache_read_input_tokens\":12840,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1848},\"output_tokens\":1,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"97a65e19-a4ca-4008-ab59-3d69529e6c71\",\"request_id\":\"req_011CcS46aTh8S6AqMM4VswQa\"}",
66
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_018c6NapXWJkgyj6JSEMvbXY\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01XedacYsfQCYbMjiR6FvcK1\",\"name\":\"Bash\",\"input\":{\"command\":\"mkdir -p /sessions/local_eiaovtw6x1/mnt/project/outputs && echo created\",\"description\":\"Create outputs directory\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":1848,\"cache_read_input_tokens\":12840,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1848},\"output_tokens\":1,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"60306cf4-a4b3-498c-86d0-02e7202e1c57\",\"request_id\":\"req_011CcS46aTh8S6AqMM4VswQa\"}",
67
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_01XedacYsfQCYbMjiR6FvcK1\",\"type\":\"tool_result\",\"content\":\"created\",\"is_error\":false}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"0eca798a-d94c-4d95-b863-024974c90b07\",\"timestamp\":\"2026-06-26T14:47:34.574Z\",\"tool_use_result\":{\"stdout\":\"created\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":false}}",
68
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01JjHttxQa9nNXzuqHTqQP9c\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_0178h9tSYZhtyuJkNgJqGEeX\",\"name\":\"Write\",\"input\":{\"file_path\":\"/sessions/local_eiaovtw6x1/mnt/project/outputs/actions.md\",\"content\":\"# Q2 Project Status Report — Action Items\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\\n\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":141,\"cache_read_input_tokens\":14688,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":141},\"output_tokens\":64,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"9c2ec3e6-05f5-4ace-8bc8-22b8c565ccf0\",\"request_id\":\"req_011CcS46wisVEj74EeTGGroY\"}",
69
- "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_0178h9tSYZhtyuJkNgJqGEeX\",\"type\":\"tool_result\",\"content\":\"File created successfully at: /sessions/local_eiaovtw6x1/mnt/project/outputs/actions.md (file state is current in your context — no need to Read it back)\"}]},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"29df2d4f-b498-4a3f-9f59-fd36c8080503\",\"timestamp\":\"2026-06-26T14:47:41.633Z\",\"tool_use_result\":{\"type\":\"create\",\"filePath\":\"/sessions/local_eiaovtw6x1/mnt/project/outputs/actions.md\",\"content\":\"# Q2 Project Status Report — Action Items\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\\n\",\"structuredPatch\":[],\"originalFile\":null,\"userModified\":false}}",
70
- "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_016HsgRG59PZEF2BaSFPxRg3\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"Done. Here's the summary and the deliverable.\\n\\n## Summary of report.pdf — Q2 Project Status Report\\n\\nThe migration to the new ingest pipeline is **on track**. Key points:\\n- **End-to-end latency dropped 30%** after the caching layer landed.\\n- **Error rates are within target.**\\n- **Remaining risk:** the data-backfill window.\\n\\n## Action items\\nI wrote them as a markdown checklist to `outputs/actions.md`:\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":259,\"cache_read_input_tokens\":14829,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":259},\"output_tokens\":7,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"uuid\":\"1843d071-c99c-46b3-acb2-95cfab3cd164\",\"request_id\":\"req_011CcS47Tm9XAf8AE61hJVLn\"}",
71
- "{\"type\":\"result\",\"subtype\":\"success\",\"is_error\":false,\"api_error_status\":null,\"duration_ms\":23898,\"duration_api_ms\":23846,\"ttft_ms\":2646,\"ttft_stream_ms\":1683,\"time_to_request_ms\":25,\"num_turns\":8,\"result\":\"Done. Here's the summary and the deliverable.\\n\\n## Summary of report.pdf — Q2 Project Status Report\\n\\nThe migration to the new ingest pipeline is **on track**. Key points:\\n- **End-to-end latency dropped 30%** after the caching layer landed.\\n- **Error rates are within target.**\\n- **Remaining risk:** the data-backfill window.\\n\\n## Action items\\nI wrote them as a markdown checklist to `outputs/actions.md`:\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\",\"stop_reason\":\"end_turn\",\"session_id\":\"85d14d70-0d40-4bb8-90be-572b617e2e30\",\"total_cost_usd\":0.2152815,\"usage\":{\"input_tokens\":1194,\"cache_creation_input_tokens\":15088,\"cache_read_input_tokens\":65913,\"output_tokens\":1019,\"server_tool_use\":{\"web_search_requests\":0,\"web_fetch_requests\":0},\"service_tier\":\"standard\",\"cache_creation\":{\"ephemeral_1h_input_tokens\":15088,\"ephemeral_5m_input_tokens\":0},\"inference_geo\":\"not_available\",\"iterations\":[{\"input_tokens\":2,\"output_tokens\":236,\"cache_read_input_tokens\":14829,\"cache_creation_input_tokens\":259,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":259},\"type\":\"message\"}],\"speed\":\"standard\"},\"modelUsage\":{\"claude-opus-4-8\":{\"inputTokens\":1194,\"outputTokens\":1019,\"cacheReadInputTokens\":65913,\"cacheCreationInputTokens\":15088,\"webSearchRequests\":0,\"costUSD\":0.2152815,\"contextWindow\":1000000,\"maxOutputTokens\":64000}},\"permission_denials\":[],\"terminal_reason\":\"completed\",\"fast_mode_state\":\"off\",\"uuid\":\"c06a056c-d9a5-468f-8c53-739f2f25fd3e\"}"
49
+ "{\"type\":\"system\",\"subtype\":\"init\",\"cwd\":\"/sessions/local_ejmj1pbepd\",\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"tools\":[\"Task\",\"AskUserQuestion\",\"Bash\",\"Edit\",\"Glob\",\"Grep\",\"NotebookEdit\",\"Read\",\"Skill\",\"TaskCreate\",\"TaskGet\",\"TaskList\",\"TaskStop\",\"TaskUpdate\",\"ToolSearch\",\"WebFetch\",\"WebSearch\",\"Write\"],\"mcp_servers\":[],\"model\":\"claude-opus-4-8\",\"permissionMode\":\"default\",\"slash_commands\":[\"deep-research\",\"my-pdf-skill:my-pdf-skill\",\"clear\",\"compact\",\"config\",\"context\",\"heapdump\",\"init\",\"reload-skills\",\"review\",\"security-review\",\"usage\",\"insights\",\"goal\",\"team-onboarding\"],\"apiKeySource\":\"none\",\"claude_code_version\":\"2.1.187\",\"output_style\":\"default\",\"agents\":[\"claude\",\"claude-code-guide\",\"Explore\",\"general-purpose\",\"Plan\",\"statusline-setup\"],\"skills\":[\"deep-research\",\"my-pdf-skill:my-pdf-skill\"],\"plugins\":[{\"name\":\"my-pdf-skill\",\"path\":\"/sessions/local_ejmj1pbepd/mnt/.local-plugins/marketplaces/local-desktop-app-uploads/my-pdf-skill\",\"source\":\"my-pdf-skill@inline\"}],\"analytics_disabled\":false,\"product_feedback_disabled\":false,\"uuid\":\"179f35c8-1285-435f-892d-10b9a7887c39\",\"memory_paths\":{\"auto\":\"/sessions/local_ejmj1pbepd/mnt/.claude/projects/-sessions-local-ejmj1pbepd/memory/\"},\"fast_mode_state\":\"off\"}",
50
+ "{\"type\":\"system\",\"subtype\":\"thinking_tokens\",\"estimated_tokens\":50,\"estimated_tokens_delta\":50,\"uuid\":\"32a1aedc-f6ad-4236-a43d-7ff1184f6a7d\",\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\"}",
51
+ "{\"type\":\"system\",\"subtype\":\"thinking_tokens\",\"estimated_tokens\":104,\"estimated_tokens_delta\":54,\"uuid\":\"182224b1-1130-46c6-b472-a028f5ba6bdf\",\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\"}",
52
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01VrJtHCvpRGo87QQo75tqiT\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"thinking\",\"thinking\":\"\",\"signature\":\"EpgDCmMIDxgCKkAOosBKnWtBHX1OCpx6TcnokZqxgl8UABBwddjAthAG3vtDeqoNl80CiEafnGLiNZzxY+26XuScfUtSEEn9bqu6Mg9jbGF1ZGUtb3B1cy00LTg4AEIIdGhpbmtpbmcSDHphyIo96kKl/wF+VRoM3F7//OptT27Wa+6aIjC8cNkQMD/F6phMr5TPnnvuLGzQnqnDUZpjhFw0xHIUhUmSS+524C2OLrFTE+n3VSMq4gEiOr0pogbUUROvLgbzRMudhFo5ZuBYAzPgKQcxdYyRMP8sGybJPtBa4dpf6C2GXeqTQzhf8uD3BqNMDIODjRS64EtP1ebhKr1XwkeXABkgH8WrK+tu++MMN7FhJvXaR3EnQfXRvVR9RxwOMcXj6V0FTwJMC37G/w40TCxQ8htZ1fk7WwM0IGR6xYgespnibwk/lADqPA7LhNot+WlY15oJ1eNG/LvTF9cCiG3yj/+Jc8EAFOI66F4cZw57gjxOMMp3DAd+nkgDwMzb9aD+QEYJ31rVUMfXM6QQpV5MN8zbOcuFGAE=\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1185,\"cache_creation_input_tokens\":3155,\"cache_read_input_tokens\":7859,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":3155},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"d50cca9a-cc31-4feb-ba0b-0883f8dddd1e\",\"request_id\":\"req_011CcS8rKDrjBom79YxjYpiY\"}",
53
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01VrJtHCvpRGo87QQo75tqiT\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"I'll use the PDF skill that matches this task.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1185,\"cache_creation_input_tokens\":3155,\"cache_read_input_tokens\":7859,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":3155},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"b9c7e2e4-130b-491d-95d2-4c30298b0f9c\",\"request_id\":\"req_011CcS8rKDrjBom79YxjYpiY\"}",
54
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01VrJtHCvpRGo87QQo75tqiT\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01S37Vv7s9tHngZ93gCguWoU\",\"name\":\"Skill\",\"input\":{\"skill\":\"my-pdf-skill:my-pdf-skill\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1185,\"cache_creation_input_tokens\":3155,\"cache_read_input_tokens\":7859,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":3155},\"output_tokens\":5,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"23976116-c1b3-494a-8538-830bdf4b545f\",\"request_id\":\"req_011CcS8rKDrjBom79YxjYpiY\"}",
55
+ "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"toolu_01S37Vv7s9tHngZ93gCguWoU\",\"content\":\"Launching skill: my-pdf-skill:my-pdf-skill\"}]},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"c5e8c095-4ea7-4d82-beda-afc30e67872e\",\"timestamp\":\"2026-06-26T15:49:53.491Z\",\"tool_use_result\":{\"success\":true,\"commandName\":\"my-pdf-skill:my-pdf-skill\"}}",
56
+ "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Base directory for this skill: /sessions/local_ejmj1pbepd/mnt/.local-plugins/marketplaces/local-desktop-app-uploads/my-pdf-skill/skills/my-pdf-skill\\n\\n# my-pdf-skill\\nPlaceholder skill so the example scenario resolves. Replace with the skill you're testing.\\n\"}]},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"efca3358-3d62-43e7-84fe-de234a2ebc8a\",\"timestamp\":\"2026-06-26T15:49:53.490Z\",\"isSynthetic\":true}",
57
+ "{\"type\":\"rate_limit_event\",\"rate_limit_info\":{\"status\":\"rejected\",\"resetsAt\":1782495000,\"rateLimitType\":\"five_hour\",\"overageStatus\":\"allowed\",\"overageResetsAt\":1782864000,\"isUsingOverage\":true,\"overageInUse\":true},\"uuid\":\"ca3ebe03-9376-4ce1-8daf-0d47b3cb4cee\",\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\"}",
58
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01K2TvjmkRZWaEzLXBoJQ8pK\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"thinking\",\"thinking\":\"\",\"signature\":\"Et8CCmMIDxgCKkCXAgvV9a8AVffd9k6BbyG037aLxYRfzqxCqGYYb3RWWiv969/Vv3PixZ3hrbgh0AJ2AiJy7ef4z9Yu7NpEZT0KMg9jbGF1ZGUtb3B1cy00LTg4AEIIdGhpbmtpbmcSDCzCuoh109laja5VoxoM1jWb8LHNxfyzLB+cIjCv3VZ137g27mzn0ta/0khjOHQNibq9tAD0KEJDfBn52sgCaZfP052efd73EyMGfNsqqQFnBDc17hp0pFJX3ibSxSlkjm8hPPo/b6/wmdYX/V5Uei0j0dECRfx+sOHjS5gBzOXpJ+C9vm3oGkBwFylBXa5XkvANi3LfFlbyM6Wtju3TMGm607NQjhAC1LfVcH1/O6pi6et0ejUqsuqLSV4+arRBaEG0dOLbcOtH9nc4NdpFmRY2iO3xyRKZfKRDMP6VhQbfBOzZxSgLg36yzAfdKTOKFrY7Cpp1+NX6GAE=\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1,\"cache_creation_input_tokens\":1482,\"cache_read_input_tokens\":11014,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1482},\"output_tokens\":2,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"8344d62d-6726-475e-aaaa-ea19c518b098\",\"request_id\":\"req_011CcS8rZ5HugFK22jV22BTv\"}",
59
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01K2TvjmkRZWaEzLXBoJQ8pK\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01PGc9pv7nG7P19ptAy4bnk4\",\"name\":\"Bash\",\"input\":{\"command\":\"ls -la /sessions/local_ejmj1pbepd/mnt/uploads/ 2>/dev/null; echo \\\"---project---\\\"; ls -la /sessions/local_ejmj1pbepd/mnt/project/ 2>/dev/null\",\"description\":\"List uploads and project folder\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":1,\"cache_creation_input_tokens\":1482,\"cache_read_input_tokens\":11014,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1482},\"output_tokens\":2,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"b4ace1c5-3b5e-41b8-8a1b-3adc96eb7ae6\",\"request_id\":\"req_011CcS8rZ5HugFK22jV22BTv\"}",
60
+ "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_01PGc9pv7nG7P19ptAy4bnk4\",\"type\":\"tool_result\",\"content\":\"total 4\\ndrwxr-xr-x 3 ubuntu ubuntu 96 Jun 26 15:49 .\\ndrwxr-xr-x 9 ubuntu ubuntu 288 Jun 26 15:49 ..\\n-rw-r--r-- 1 ubuntu ubuntu 1056 Jun 26 15:49 report.pdf\\n---project---\\ntotal 4\\ndrwxr-xr-x 3 ubuntu ubuntu 96 Jun 26 15:49 .\\ndrwxr-xr-x 9 ubuntu ubuntu 288 Jun 26 15:49 ..\\n-rw-r--r-- 1 ubuntu ubuntu 21 Jun 26 15:49 notes.txt\",\"is_error\":false}]},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"439b8a29-752a-4d50-8b57-34c6c09cd071\",\"timestamp\":\"2026-06-26T15:49:57.007Z\",\"tool_use_result\":{\"stdout\":\"total 4\\ndrwxr-xr-x 3 ubuntu ubuntu 96 Jun 26 15:49 .\\ndrwxr-xr-x 9 ubuntu ubuntu 288 Jun 26 15:49 ..\\n-rw-r--r-- 1 ubuntu ubuntu 1056 Jun 26 15:49 report.pdf\\n---project---\\ntotal 4\\ndrwxr-xr-x 3 ubuntu ubuntu 96 Jun 26 15:49 .\\ndrwxr-xr-x 9 ubuntu ubuntu 288 Jun 26 15:49 ..\\n-rw-r--r-- 1 ubuntu ubuntu 21 Jun 26 15:49 notes.txt\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":false}}",
61
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01A8FyXgPkQX2JPf13qSYA1S\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01VGhLZ68cRX63F9HwfoDnSR\",\"name\":\"Read\",\"input\":{\"file_path\":\"/sessions/local_ejmj1pbepd/mnt/uploads/report.pdf\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":458,\"cache_read_input_tokens\":12496,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":458},\"output_tokens\":73,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"884c5b3d-23d2-4e94-83c0-abd3f7339106\",\"request_id\":\"req_011CcS8rp2xUJ4Txs9epoq2k\"}",
62
+ "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_01VGhLZ68cRX63F9HwfoDnSR\",\"type\":\"tool_result\",\"content\":\"PDF file read: /sessions/local_ejmj1pbepd/mnt/uploads/report.pdf (1KB)\"}]},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"445bd4d6-39f4-4d85-9716-754481af75a7\",\"timestamp\":\"2026-06-26T15:49:58.991Z\",\"tool_use_result\":{\"type\":\"pdf\",\"file\":{\"filePath\":\"/sessions/local_ejmj1pbepd/mnt/uploads/report.pdf\",\"base64\":\"JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA0IDAgUiA+PiA+PiAvQ29udGVudHMgNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5cGUxIC9CYXNlRm9udCAvSGVsdmV0aWNhID4+CmVuZG9iago1IDAgb2JqCjw8IC9MZW5ndGggNTA1ID4+CnN0cmVhbQpCVAovRjEgMTQgVGYKNzIgNzIwIFRkCjE2IFRMCihRMiBQcm9qZWN0IFN0YXR1cyBSZXBvcnQpIFRqClQqClQqCihUaGUgbWlncmF0aW9uIHRvIHRoZSBuZXcgaW5nZXN0IHBpcGVsaW5lIGlzIG9uIHRyYWNrLiBFbmQtdG8tZW5kKSBUagpUKgoobGF0ZW5jeSBkcm9wcGVkIDMwJSBhZnRlciB0aGUgY2FjaGluZyBsYXllciBsYW5kZWQsIGFuZCBlcnJvciByYXRlcykgVGoKVCoKKGFyZSB3aXRoaW4gdGFyZ2V0LiBSZW1haW5pbmcgcmlzayBpcyB0aGUgZGF0YS1iYWNrZmlsbCB3aW5kb3cuKSBUagpUKgpUKgooQWN0aW9uIGl0ZW1zOikgVGoKVCoKKDEuIEFsaWNlOiBmaW5hbGl6ZSB0aGUgcHJvZHVjdGlvbiByb2xsb3V0IHBsYW4gYnkgSnVuZSAyMC4pIFRqClQqCigyLiBCb2I6IGFkZCBtb25pdG9yaW5nIGRhc2hib2FyZHMgZm9yIHRoZSBuZXcgcGlwZWxpbmUuKSBUagpUKgooMy4gQ2Fyb2w6IHVwZGF0ZSB0aGUgb24tY2FsbCBydW5ib29rIGFuZCBub3RpZnkgc3VwcG9ydC4pIFRqCkVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAwNjQgMDAwMDAgbiAKMDAwMDAwMDEyMSAwMDAwMCBuIAowMDAwMDAwMjQ3IDAwMDAwIG4gCjAwMDAwMDAzMTcgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA2IC9Sb290IDEgMCBSID4+CnN0YXJ0eHJlZgo4NzMKJSVFT0YK\",\"originalSize\":1056}}}",
63
+ "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"document\",\"source\":{\"type\":\"base64\",\"media_type\":\"application/pdf\",\"data\":\"JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA0IDAgUiA+PiA+PiAvQ29udGVudHMgNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5cGUxIC9CYXNlRm9udCAvSGVsdmV0aWNhID4+CmVuZG9iago1IDAgb2JqCjw8IC9MZW5ndGggNTA1ID4+CnN0cmVhbQpCVAovRjEgMTQgVGYKNzIgNzIwIFRkCjE2IFRMCihRMiBQcm9qZWN0IFN0YXR1cyBSZXBvcnQpIFRqClQqClQqCihUaGUgbWlncmF0aW9uIHRvIHRoZSBuZXcgaW5nZXN0IHBpcGVsaW5lIGlzIG9uIHRyYWNrLiBFbmQtdG8tZW5kKSBUagpUKgoobGF0ZW5jeSBkcm9wcGVkIDMwJSBhZnRlciB0aGUgY2FjaGluZyBsYXllciBsYW5kZWQsIGFuZCBlcnJvciByYXRlcykgVGoKVCoKKGFyZSB3aXRoaW4gdGFyZ2V0LiBSZW1haW5pbmcgcmlzayBpcyB0aGUgZGF0YS1iYWNrZmlsbCB3aW5kb3cuKSBUagpUKgpUKgooQWN0aW9uIGl0ZW1zOikgVGoKVCoKKDEuIEFsaWNlOiBmaW5hbGl6ZSB0aGUgcHJvZHVjdGlvbiByb2xsb3V0IHBsYW4gYnkgSnVuZSAyMC4pIFRqClQqCigyLiBCb2I6IGFkZCBtb25pdG9yaW5nIGRhc2hib2FyZHMgZm9yIHRoZSBuZXcgcGlwZWxpbmUuKSBUagpUKgooMy4gQ2Fyb2w6IHVwZGF0ZSB0aGUgb24tY2FsbCBydW5ib29rIGFuZCBub3RpZnkgc3VwcG9ydC4pIFRqCkVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAwNjQgMDAwMDAgbiAKMDAwMDAwMDEyMSAwMDAwMCBuIAowMDAwMDAwMjQ3IDAwMDAwIG4gCjAwMDAwMDAzMTcgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA2IC9Sb290IDEgMCBSID4+CnN0YXJ0eHJlZgo4NzMKJSVFT0YK\"}}]},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"35b35660-3bd4-499c-95ac-afcf5d6794e9\",\"timestamp\":\"2026-06-26T15:49:58.990Z\",\"isSynthetic\":true}",
64
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01RkZk2v7nj8hq2HzgH1S2x2\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"Now I'll write the action items checklist to the outputs folder.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":1848,\"cache_read_input_tokens\":12954,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1848},\"output_tokens\":4,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"d0b97666-df45-491f-856a-30ea001a63f6\",\"request_id\":\"req_011CcS8rxQz85PgkhXwFdTYY\"}",
65
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01RkZk2v7nj8hq2HzgH1S2x2\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"toolu_01NgzTwNYboGNidsrUbBXZj1\",\"name\":\"Write\",\"input\":{\"file_path\":\"/sessions/local_ejmj1pbepd/mnt/project/outputs/actions.md\",\"content\":\"# Action Items — Q2 Project Status Report\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\\n\"},\"caller\":{\"type\":\"direct\"}}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":1848,\"cache_read_input_tokens\":12954,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":1848},\"output_tokens\":4,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"f6efe271-a1f9-4c24-964b-633089c77270\",\"request_id\":\"req_011CcS8rxQz85PgkhXwFdTYY\"}",
66
+ "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"tool_use_id\":\"toolu_01NgzTwNYboGNidsrUbBXZj1\",\"type\":\"tool_result\",\"content\":\"File created successfully at: /sessions/local_ejmj1pbepd/mnt/project/outputs/actions.md (file state is current in your context — no need to Read it back)\"}]},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"e46b2b3d-9fa1-41d2-b2af-21dd71ea353d\",\"timestamp\":\"2026-06-26T15:50:02.995Z\",\"tool_use_result\":{\"type\":\"create\",\"filePath\":\"/sessions/local_ejmj1pbepd/mnt/project/outputs/actions.md\",\"content\":\"# Action Items — Q2 Project Status Report\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\\n\",\"structuredPatch\":[],\"originalFile\":null,\"userModified\":false}}",
67
+ "{\"type\":\"assistant\",\"message\":{\"model\":\"claude-opus-4-8\",\"id\":\"msg_01GATfmWcYKUV927tBW3uAHo\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"Done. Here's a summary of **report.pdf** (Q2 Project Status Report):\\n\\n- The migration to the new ingest pipeline is **on track**.\\n- End-to-end latency **dropped 30%** after the caching layer landed.\\n- Error rates are **within target**.\\n- The main remaining risk is the **data-backfill window**.\\n\\nI wrote the action items as a markdown checklist to `outputs/actions.md`:\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\"}],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":2,\"cache_creation_input_tokens\":280,\"cache_read_input_tokens\":14802,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":280},\"output_tokens\":3,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"},\"diagnostics\":null,\"context_management\":null},\"parent_tool_use_id\":null,\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"uuid\":\"01c9252f-db13-474d-b89c-c16c001a5c31\",\"request_id\":\"req_011CcS8sFsUCJAyMXgstAUmd\"}",
68
+ "{\"type\":\"result\",\"subtype\":\"success\",\"is_error\":false,\"api_error_status\":null,\"duration_ms\":16720,\"duration_api_ms\":16674,\"ttft_ms\":3023,\"ttft_stream_ms\":2075,\"time_to_request_ms\":25,\"num_turns\":7,\"result\":\"Done. Here's a summary of **report.pdf** (Q2 Project Status Report):\\n\\n- The migration to the new ingest pipeline is **on track**.\\n- End-to-end latency **dropped 30%** after the caching layer landed.\\n- Error rates are **within target**.\\n- The main remaining risk is the **data-backfill window**.\\n\\nI wrote the action items as a markdown checklist to `outputs/actions.md`:\\n\\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\\n- [ ] **Carol:** Update the on-call runbook and notify support.\",\"stop_reason\":\"end_turn\",\"session_id\":\"0adcc551-ce1d-47ae-b538-34d07c56147b\",\"total_cost_usd\":0.1298025,\"usage\":{\"input_tokens\":1192,\"cache_creation_input_tokens\":7223,\"cache_read_input_tokens\":59125,\"output_tokens\":882,\"server_tool_use\":{\"web_search_requests\":0,\"web_fetch_requests\":0},\"service_tier\":\"standard\",\"cache_creation\":{\"ephemeral_1h_input_tokens\":7223,\"ephemeral_5m_input_tokens\":0},\"inference_geo\":\"not_available\",\"iterations\":[{\"input_tokens\":2,\"output_tokens\":222,\"cache_read_input_tokens\":14802,\"cache_creation_input_tokens\":280,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":280},\"type\":\"message\"}],\"speed\":\"standard\"},\"modelUsage\":{\"claude-opus-4-8\":{\"inputTokens\":1192,\"outputTokens\":882,\"cacheReadInputTokens\":59125,\"cacheCreationInputTokens\":7223,\"webSearchRequests\":0,\"costUSD\":0.1298025,\"contextWindow\":1000000,\"maxOutputTokens\":64000}},\"permission_denials\":[],\"terminal_reason\":\"completed\",\"fast_mode_state\":\"off\",\"uuid\":\"c80eae47-616b-4552-91b3-157124075e81\"}"
72
69
  ],
73
70
  "controlOut": [
74
- "{\"type\":\"control_request\",\"request_id\":\"init-1\",\"request\":{\"subtype\":\"initialize\",\"appendSubagentSystemPrompt\":\"## Cowork environment\\n\\nYou are running as a subagent inside a Cowork session. Shell commands execute in an isolated Linux sandbox rooted at /sessions/local_eiaovtw6x1 — files created there (or under /tmp) exist only in the sandbox, not on the user's real computer. User-attached folders are mounted under /sessions/local_eiaovtw6x1/mnt/.\",\"hooks\":{\"PreToolUse\":[{\"matcher\":\"Task\",\"hookCallbackIds\":[\"cowork-task-bg-block\"]}]}}}",
71
+ "{\"type\":\"control_request\",\"request_id\":\"init-1\",\"request\":{\"subtype\":\"initialize\",\"appendSubagentSystemPrompt\":\"## Cowork environment\\n\\nYou are running as a subagent inside a Cowork session. Shell commands execute in an isolated Linux sandbox rooted at /sessions/local_ejmj1pbepd — files created there (or under /tmp) exist only in the sandbox, not on the user's real computer. User-attached folders are mounted under /sessions/local_ejmj1pbepd/mnt/.\",\"hooks\":{\"PreToolUse\":[{\"matcher\":\"Task\",\"hookCallbackIds\":[\"cowork-task-bg-block\"]}]}}}",
75
72
  "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Read report.pdf from your uploads, summarize it, and write the action items\\nto outputs/actions.md as a markdown checklist.\\n\"}]}}"
76
73
  ],
77
74
  "effectiveFidelity": "container",
@@ -85,8 +82,8 @@
85
82
  {
86
83
  "path": "project/outputs/actions.md",
87
84
  "bytes": 238,
88
- "sha256": "301f5444e923a478fdd0f568382747095f86f6167f07d48eb7326d62de099ad8",
89
- "body": "# Q2 Project Status Report — Action Items\n\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\n- [ ] **Carol:** Update the on-call runbook and notify support.\n"
85
+ "sha256": "571cb0fe873d1ddef40878855fb487d87777f9c4ac78918638e462405e3d809f",
86
+ "body": "# Action Items — Q2 Project Status Report\n\n- [ ] **Alice:** Finalize the production rollout plan by June 20.\n- [ ] **Bob:** Add monitoring dashboards for the new pipeline.\n- [ ] **Carol:** Update the on-call runbook and notify support.\n"
90
87
  }
91
88
  ],
92
89
  "userVisibleRoots": [
@@ -95,7 +92,7 @@
95
92
  ],
96
93
  "scenarioSource": "../scenarios/example-pdf-skill.yaml",
97
94
  "fingerprint": {
98
- "baseline": "1.15200.0",
95
+ "baseline": "1.15962.0",
99
96
  "skillHash": "4db1ddd5d109abc71f9b28807d3e31729f9882d9b85d6d0a9dd7a1980bed3110",
100
97
  "contentSig": "e8022822156176fa10e04f0e31d1269719fd09890488db3dfd6351ea8c34431c",
101
98
  "skillSources": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cowork-harness",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Scriptable, CI-friendly harness for Claude Cowork's runtime contract for testing skills across scenarios — same agent, mounts, egress allowlist, permission protocol, and sandbox limitations.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/python/README.md CHANGED
@@ -9,7 +9,7 @@ or Lima for `microvm`).
9
9
 
10
10
  1. **Build the CLI** — the helper drives `dist/cli.js`:
11
11
  ```bash
12
- npm install && npm run build # from the repo root, produces dist/cli.js
12
+ npm ci && npm run build # from the repo root, produces dist/cli.js
13
13
  ```
14
14
  Override the path with `COWORK_HARNESS_CLI=/path/to/cli.js` if it lives elsewhere.
15
15
  2. **Docker** + the agent image — for `container`, `hostloop`, and `cowork` (which auto-picks one of those):
@@ -154,6 +154,8 @@ pytest -m 'not cowork' # the fast loop (skips this lane) — the CI default
154
154
  `.results`. A single-file input still returns a plain `Result`.
155
155
  - `cowork.trace(run_id_or_dir, tools=False)` → `list[dict]` of trace rows (tool calls, sub-agent
156
156
  dispatches, decisions) — for asserting the *real* dispatch count vs. todo items named after sub-agents.
157
+ Pass `tools=True` to include tool rows (drives the CLI's legacy `--tools`; the canonical CLI form is
158
+ `--view tools|questions|dispatches`).
157
159
  - `Result`: `.assert_success()`, `.assert_transcript_contains(s)`, `.assert_tool_called(name)`,
158
160
  `.assert_subagent_dispatched(agent_type)`, `.assert_dispatch_count_max(n)`,
159
161
  `.assert_artifact_json(rel_path, predicate)`; plus `.result`, `.out_dir`, `.work_dir`, `.outputs_dir`