Plan Step 1. Builds the probe vehicle and the checklist; does NOT answer it. The four questions all require the operator in a live Cowork session on this Mac, and that is a fact about the measurement rather than a caveat: measured 2026-09-04, the session mode is not readable from disk (cowork_settings.json carries only extraKnownMarketplaces; the desktop config carries coworkNetworkMode and a trusted-folder list, neither states where a session runs), and the other three each need a plugin installed in a live session. The step's Verify is therefore RED on purpose and stays red until the operator answers: test "$(grep -cE '...' docs/cowork-probe.md)" = 4 -> exit 1 (0 of 4 matched) Validated in both directions: a fully answered copy exits 0, a copy with three of four answered exits 1. The gate can pass, so its failure means something. Probe vehicle: jobbsok-probe, exactly four files under tests/fixtures/cowork-probe/ -- manifest, skills/probe-versjon/SKILL.md, .mcp.json declaring the stdio server probe-tools, and probe_tools.py (standard library only). Smoke-tested from Claude Code: initialize handshake completes, tools/list returns probe_ping, tools/call returns an interpreter version, an unknown tool name is rejected. What is NOT verified is whether Cowork ever starts it -- that is the question. Archive is built from an explicit four-file include list, never zip -r over the repo root; verified to contain no .git, STATE.md, .venv or .claude/ entry. The degradation branch for each possible nei is written down now, before any answer is known, so it is not decided under pressure later. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6 KiB
Cowork probe
Plan Step 1 (M1). An empirical record of what this operator's Cowork installation actually does, measured before any code depends on it.
Operator decision 7 — Python as a CLI plus a host-side stdio MCP server — is void if host-side servers never appear in a Cowork session. That is not knowable from Claude Code, so it is measured here first, and the milestone that depends on it carries a written degradation branch either way.
Status: unanswered. All four questions require the operator sitting in a Cowork session on this Mac. The executor session built the probe vehicle and this checklist; it did not and could not answer them. The verify command for this step is written so an unanswered checklist fails:
test "$(grep -cE '^- (Sesjonsmodus|Host-MCP|python3|CLAUDE_PLUGIN_ROOT): +(lokal VM|sky|ja|nei)\b' docs/cowork-probe.md)" = 4
A bullet still reading ubesvart does not match, the count drops below four,
and the command exits non-zero. That is the intended behaviour until the
operator has run the probe.
Results
Overwrite ubesvart with one of the allowed answers, and put the date of the
measurement in the Measured column. A nei is a result, not a failure — it
selects the degradation branch below.
- Sesjonsmodus: ubesvart
- Host-MCP: ubesvart
- python3: ubesvart
- CLAUDE_PLUGIN_ROOT: ubesvart
| Bullet | What the operator does in Cowork | Allowed answer | Measured |
|---|---|---|---|
- Sesjonsmodus: |
Open a Cowork session and read whether it is a local VM or cloud | lokal VM or sky |
|
- Host-MCP: |
Upload jobbsok-probe.plugin via Customize -> Plugins; does probe-tools appear as a connector, and does probe_ping return? |
ja or nei |
|
- python3: |
Run the probe-versjon skill; does it succeed in invoking python3, and which version does it report? |
ja or nei, followed by the reported version |
|
- CLAUDE_PLUGIN_ROOT: |
Run probe-versjon; does it print a resolved absolute path, or the literal variable name? |
ja or nei |
What is already known, and what is not
Measured 2026-09-04 from Claude Code, before the probe was built:
- Cowork is installed and available on this Intel Mac.
- The session mode is not readable from disk.
cowork_settings.jsoncarries onlyextraKnownMarketplaces; the desktop config carriescoworkNetworkModeand a trusted-folder list, and neither states where a session runs. So- Sesjonsmodus:cannot be answered by reading files — it has to be read off a live session. - The other three each require a plugin installed in a live Cowork session. Nothing about them is decidable from Claude Code.
The probe vehicle
jobbsok-probe — a throwaway test plugin, deliberately not the jobbsok
plugin itself. jobbsok's own .mcp.json (Step 12) and packaging script
(Step 13) land eleven steps later, and this probe must not wait for them.
It holds exactly four files, under tests/fixtures/cowork-probe/:
| File | What it is for |
|---|---|
.claude-plugin/plugin.json |
Manifest. Name jobbsok-probe, version 0.0.1. The version is what probe-versjon echoes, so a mismatch reveals a cached build. |
skills/probe-versjon/SKILL.md |
A skill that reports the manifest version, the resolved ${CLAUDE_PLUGIN_ROOT}, and whether it can invoke python3. Answers three of the four questions. |
.mcp.json |
Declares one stdio server, probe-tools. Its appearance in the session is the whole - Host-MCP: question. |
probe_tools.py |
Standard-library JSON-RPC server exposing one tool, probe_ping, returning the interpreter actually running it. No third-party imports: a server that failed on a missing dependency would answer a different question than the one asked. |
Verified from Claude Code 2026-09-04: the server completes an initialize
handshake, lists probe_ping, returns an interpreter version on
tools/call, and rejects an unknown tool name. What is unverified is whether
Cowork ever starts it.
Building the archive
Run from the repository root. The file list is explicit, and that is the point:
cd tests/fixtures/cowork-probe && \
zip -X /tmp/jobbsok-probe.plugin \
.claude-plugin/plugin.json \
.mcp.json \
probe_tools.py \
skills/probe-versjon/SKILL.md
Never zip -r over the repository root. A recursive archive of the repo would
ship .git, STATE.md, .claude/ and the virtualenv into an uploaded plugin.
The include list above names the four files and can carry nothing else.
Then upload /tmp/jobbsok-probe.plugin through Customize -> Plugins, run the
probe-versjon skill, and check whether probe-tools appears as a connector.
Degradation branch
Written now, so the answer does not get decided under pressure later.
If - Host-MCP: is nei — host-side stdio servers do not appear in this
Cowork installation:
- Operator decision 7's Cowork half is unavailable. Nothing changes for Claude Code, where the scripts are invoked directly.
- Every script-backed skill degrades to reading files that the Claude Code CLI produced. The skills stay useful; they stop being able to compute.
Verifiser i Coworkfor the affected milestones means "the skills load and read files produced from Claude Code" — not "the connector answers".- The degradation is recorded in
STATE.md.
This is risk H12's mitigation, and it is why the probe is the first step of the build rather than a later check.
If - python3: is nei — a skill cannot invoke python3 in a Cowork
session: the same degradation applies, and more broadly, since it removes the
CLI half too. Escalate to the operator before building further on decision 7.
If - CLAUDE_PLUGIN_ROOT: is nei — the variable does not resolve: every
intra-plugin path in the plan is affected, not just this milestone's. Escalate;
do not paper over it with hardcoded paths.
If - Sesjonsmodus: is sky — sessions run in the cloud, and host-side
servers cannot reach this machine at all. - Host-MCP: should then read nei,
and its branch applies. If the two disagree, the disagreement is the finding.