{
  "notes": "EPISODE 3 (2026-10-27). WHAT HAPPENED: episode 2 carried nothing out. The plane refused 'spawn profile-wide' because its brief asked about the machine the worker runs on (it contained a sentence telling workers not to install or run the tool locally or read their own machine; any mention of the worker's machine is refused). Every read of profile-wide/* and the wake were refused because the batch never existed. stalled.inARow was 1 at the start of this episode. Items used before this episode: 6 of 30 (discover: 2, profile-pilot: 4). This episode spawns 16, so 22 are used and 8 remain; episodes 4, 5, 6 remain.\n\nRULE LEARNED: a brief may say 'work only from public web pages' and 'do not guess', but must never mention the worker's machine, local installation, running the tool, environment, keys or credentials, even as a prohibition.\n\nDECISIONS THIS EPISODE: spawn 'profiles-round2' (16 items, json output, 24000 bytes, no merge so each item is handed back as is). Same six-question profile as the pilot that worked for aider/opencode/gemini-cli, now ordering release dates from the GitHub releases API or atom feed and asking stable and prerelease separately. Item keys: goose, cline-cli, qwen-code, kilo-cli, kimi-code, mistral-vibe, continue-cli, pi, letta-code, forgecode, hermes-agent, gptme, zcode, mini-swe-agent, openhands-current, opencode-v2. All 16 are in read. Wake when profiles-round2 settles or after 90 minutes. finish=false.\n\nREPOSITORY FACTS CHECKED THIS EPISODE via api.github.com (2026-10-27): pi moved from badlogic/pi-mono to earendil-works/pi (MIT, pushed 2026-10-27); antinomyhq/forge moved to tailcallhq/forgecode (Apache-2.0, pushed 2026-10-27, site forgecode.dev); ZCode is zai-org/ZCode (Apache-2.0, pushed 2026-10-20, site zcode.z.ai); Kimi Code CLI is MoonshotAI/kimi-code (MIT, pushed 2026-10-27, docs kimi.com/code/docs); NousResearch/hermes-agent (MIT, pushed 2026-10-27); continuedev/continue (Apache-2.0, pushed 2026-10-26). Kilo CLI is @kilocode/cli in Kilo-Org/kilocode, a fork of OpenCode, 'kilo run' for non-interactive use, --auto disables prompts (README). These are repo-level facts only; the profiles must still cite pages.\n\nWHAT THE PILOT ESTABLISHED (details with sources in profile-pilot/aider, /opencode, /gemini-cli, /openhands; ask for them in read again when ranking):\n- Aider (Apache-2.0): headless via --message/--message-file plus --yes-always, but --yes-always answers 'n' to LLM-suggested shell commands; no cwd flag; no JSON result output; confinement only --read, .aiderignore, --subtree-only, --dry-run, no shell allow/deny, no sandbox; usage printed as text per reply and as JSONL via --analytics-log (prompt_tokens, completion_tokens, cost); no subagents; providers via LiteLLM incl. Ollama and OpenAI-compatible; subscription only GitHub Copilot via a copied oauth token; newest GitHub release v0.86.0 2025-08-09, PyPI 0.86.2 2026-02-12, last commit 2026-05-22.\n- OpenCode 1.x (MIT, anomalyco/opencode): opencode run --dir <d> --auto --format json '<prompt>'; permission rules per tool (bash command patterns allow/ask/deny, edit, external_directory, webfetch/websearch, task) in opencode.json or OPENCODE_PERMISSION; no OS sandbox (PR #21538 closed unmerged); usage via opencode stats and JSON step-finish events with cost and tokens{input,output,reasoning,cache}; subagents and opencode serve; 75+ providers via models.dev; subscription login: ChatGPT Plus, GitHub Copilot, GitLab Duo, SuperGrok; Claude Pro/Max explicitly not (removed in 1.3.0). v1.19.4 2026-10-22. Discovery saw v2.1.4 (2026-10-23) = OpenCode 2 line, profiled this episode as opencode-v2.\n- Gemini CLI (Apache-2.0): gemini -p, --output-format json|stream-json with per-model token stats, no cost; --approval-mode auto_edit|yolo; TOML policy engine (allow/deny/ask_user by toolName, commandPrefix, argsPattern; ask_user becomes deny headless); sandbox -s with Seatbelt, Docker/Podman, gVisor; network allowed by default; subagents on by default, parallel sessions via experimental --worktree; Google models only (Google login incl. AI Pro/Ultra, API key, Vertex); stable v0.65.0 2026-10-20.\n- OpenHands-CLI (MIT, separate repo OpenHands/OpenHands-CLI, README says no longer actively maintained, 1.16.0 2026-05-08): openhands --headless -t|-f, --json; always auto-approve headless; no confinement and no token output found. Re-profiled from the main repo as openhands-current.\n\nCANDIDATES NOT PROFILED, to list in the deliverable with reason and the discovery citation: Crush (FSL-1.1-MIT, source-available; issue #2792 says --yolo unavailable for run); Roo Code (archived 2026-05-15); Kimi CLI legacy (archived, replaced by kimi-code); Octofriend (no headless mode); SWE-agent (research scaffold, v1.1.0 2025-05-22; mini-swe-agent is its successor); Plandex (needs own server, last push 2025-10); Trae Agent (no releases, last push 2026-02). Second tier, only if budget remains: Nanocoder, Kode CLI, Open Interpreter, Grok CLI community, Grok Build, DeepSeek Harness, Freebuff. Proprietary, excluded with discovery citations: Amp, GitHub Copilot CLI, Cursor CLI, Auggie, Factory Droid, iFlow.\n\nPLAN FOR THE REST (8 items left after this episode):\n- EP4: read the 16 profiles. Spawn 'rank' (1 item): give it the profile results it needs through read is not possible for workers, so put the condensed per-tool facts with their URLs into the brief vars (max 3000 chars filled; if too long, split the facts across two rank items with different subsets and merge by hand in the deliverable). Spawn 'gapfill' (at most 2 items) only for fields still 'not found' on the strongest tools. If any profiles-round2 item failed, re-run just those keys in a new batch name (e.g. 'profiles-round3') before ranking. Keep used <= 26.\n- EP5: 'recipe' (1 item) for the first-ranked tool: exact invocation, confinement, metering, tool limits, each step cited. Then finish=true (EP5 or EP6) and write the deliverable from the notes and results, saying what is missing. Reserve >= 3 items for a judge send-back.\n- If profiles-round2 is refused again: do not re-spawn the same text; strip the brief further to the six numbered questions only, and spawn a 2-item pilot first.\n\nRANKING HINTS SO FAR (not final): OpenCode and Gemini CLI lead on headless plus permissions plus JSON usage output; Gemini has a real sandbox but Google-only models; OpenCode has subscription logins (not Claude) and no OS sandbox; Aider is mature but no JSON result, no shell allow-list, slowing maintenance; Mistral Vibe (--max-tokens, --max-price, --output json, --auto-approve per discovery) and Goose (ACP, 15+ providers) look strong pending profiles.\n\nBatch names used so far (never reuse): discover, profile-pilot, profile-wide (refused, still treat as used), profiles-round2.",
  "spawn": [
    {
      "name": "profiles-round2",
      "mode": "research",
      "brief": "Profile the open-source coding-agent CLI {{name}} (source repository {{repo}}; documentation starts at {{docs}}) as a candidate unattended worker runtime: given a prompt and a working directory, it must run from a script to completion with nobody at the keyboard and leave files behind. Work only from public web pages: the official repository (README, docs folder, source files, releases page, GitHub releases API or atom feed), the official documentation site and its changelog; use a third-party page only where the official pages are silent, and mark it third-party. Establish, each with the exact URL it came from and a short verbatim quote: (1) HEADLESS: the command line that runs one prompt non-interactively and exits (flag names; whether a prompt file or stdin is accepted; the flag that selects the working directory; exit codes; whether approval prompts are auto-answered and how). (2) CONFINEMENT: how shell commands, file writes and network access are restricted (allow/deny lists per tool or command, permission modes, any OS-level sandbox such as Docker, seatbelt, gVisor or bubblewrap, and whether network can be switched off). (3) TOKEN REPORTING: whether a run reports the tokens it used, in what form (text, JSON output, log file, session file, SDK event) and which fields (input, output, cached, reasoning, cost). (4) PARALLELISM: whether it can spawn subagents, run agents in parallel or run many sessions at once, and how that is configured. (5) PROVIDERS: which model providers and local backends it supports, and whether a subscription login (OAuth or device-code login to ChatGPT, Claude, Gemini, GitHub Copilot or the vendor's own plan) can be used instead of an API key. (6) LICENSE AND RELEASE: the SPDX license named in the LICENSE file; the newest stable release tag and its ISO date and the newest prerelease tag and date, taken from the GitHub releases API (https://api.github.com/repos/<owner>/<repo>/releases) or the releases atom feed, not from the HTML page; the package registry version if any; and the date of the last commit on the default branch. Also say whether the tool is a fork of another coding agent and whether the repository is archived or marked unmaintained. Return one JSON object with keys: name, repo, docs, headless, confinement, token_reporting, parallelism, providers, subscription_login, license, latest_stable, latest_prerelease, last_commit, fork_of, maintenance, gaps, sources. Each fact key holds an object {finding, quote, url, third_party}; where nothing was found, set finding to \"not found\" and list in gaps which pages were checked. sources is the list of every URL used. Do not guess: a claim without a URL is not allowed.",
      "items": [
        {
          "key": "goose",
          "vars": {
            "name": "Goose",
            "repo": "https://github.com/block/goose",
            "docs": "https://block.github.io/goose/docs/"
          }
        },
        {
          "key": "cline-cli",
          "vars": {
            "name": "Cline CLI",
            "repo": "https://github.com/cline/cline",
            "docs": "https://docs.cline.bot/cline-cli/overview"
          }
        },
        {
          "key": "qwen-code",
          "vars": {
            "name": "Qwen Code",
            "repo": "https://github.com/QwenLM/qwen-code",
            "docs": "https://qwenlm.github.io/qwen-code-docs/"
          }
        },
        {
          "key": "kilo-cli",
          "vars": {
            "name": "Kilo CLI (@kilocode/cli, a fork of OpenCode)",
            "repo": "https://github.com/Kilo-Org/kilocode",
            "docs": "https://kilo.ai/docs/code-with-ai/platforms/cli"
          }
        },
        {
          "key": "kimi-code",
          "vars": {
            "name": "Kimi Code CLI",
            "repo": "https://github.com/MoonshotAI/kimi-code",
            "docs": "https://www.kimi.com/code/docs/"
          }
        },
        {
          "key": "mistral-vibe",
          "vars": {
            "name": "Mistral Vibe",
            "repo": "https://github.com/mistralai/mistral-vibe",
            "docs": "https://docs.mistral.ai/vibe/code/cli/"
          }
        },
        {
          "key": "continue-cli",
          "vars": {
            "name": "Continue CLI (cn)",
            "repo": "https://github.com/continuedev/continue",
            "docs": "https://docs.continue.dev/cli/overview"
          }
        },
        {
          "key": "pi",
          "vars": {
            "name": "pi coding agent (formerly badlogic/pi-mono)",
            "repo": "https://github.com/earendil-works/pi",
            "docs": "https://pi.dev/docs/latest"
          }
        },
        {
          "key": "letta-code",
          "vars": {
            "name": "Letta Code",
            "repo": "https://github.com/letta-ai/letta-code",
            "docs": "https://docs.letta.com/letta-code"
          }
        },
        {
          "key": "forgecode",
          "vars": {
            "name": "ForgeCode (formerly antinomyhq/forge)",
            "repo": "https://github.com/tailcallhq/forgecode",
            "docs": "https://forgecode.dev/docs/"
          }
        },
        {
          "key": "hermes-agent",
          "vars": {
            "name": "Hermes Agent",
            "repo": "https://github.com/NousResearch/hermes-agent",
            "docs": "https://hermes-agent.nousresearch.com/"
          }
        },
        {
          "key": "gptme",
          "vars": {
            "name": "gptme",
            "repo": "https://github.com/gptme/gptme",
            "docs": "https://gptme.org/docs/"
          }
        },
        {
          "key": "zcode",
          "vars": {
            "name": "ZCode (Z.ai, terminal CLI in apps/zcode-cli)",
            "repo": "https://github.com/zai-org/ZCode",
            "docs": "https://zcode.z.ai/"
          }
        },
        {
          "key": "mini-swe-agent",
          "vars": {
            "name": "mini-SWE-agent",
            "repo": "https://github.com/SWE-agent/mini-swe-agent",
            "docs": "https://mini-swe-agent.com/latest/"
          }
        },
        {
          "key": "openhands-current",
          "vars": {
            "name": "OpenHands CLI as shipped from the main OpenHands repository (not the archived OpenHands/OpenHands-CLI repo)",
            "repo": "https://github.com/OpenHands/OpenHands",
            "docs": "https://docs.openhands.dev/"
          }
        },
        {
          "key": "opencode-v2",
          "vars": {
            "name": "OpenCode 2 (the 2.x release line; profile 2.x only, 1.x is already profiled)",
            "repo": "https://github.com/anomalyco/opencode",
            "docs": "https://opencode.ai/v2/docs/"
          }
        }
      ],
      "output": {
        "format": "json",
        "maxBytes": 24000
      }
    }
  ],
  "read": [
    "profiles-round2/goose",
    "profiles-round2/cline-cli",
    "profiles-round2/qwen-code",
    "profiles-round2/kilo-cli",
    "profiles-round2/kimi-code",
    "profiles-round2/mistral-vibe",
    "profiles-round2/continue-cli",
    "profiles-round2/pi",
    "profiles-round2/letta-code",
    "profiles-round2/forgecode",
    "profiles-round2/hermes-agent",
    "profiles-round2/gptme",
    "profiles-round2/zcode",
    "profiles-round2/mini-swe-agent",
    "profiles-round2/openhands-current",
    "profiles-round2/opencode-v2"
  ],
  "cancel": [],
  "wake": {
    "batches": [
      "profiles-round2"
    ],
    "afterMinutes": 90
  },
  "finish": false
}
