SKILL.md
SKILL.mdBrowse 33 files
6,283 tokens
24,075 bytes
Token encoding: o200k_base
Snapshot 24fd22b
1---2name: comfyui3description: Generate images, video, and audio via diffusion workflows.4version: 5.1.05author: [kshitijk4poor, alt-glitch, purzbeats]6license: MIT7platforms: [macos, linux, windows]8compatibility: "Requires ComfyUI (local, Comfy Desktop, or Comfy Cloud) and comfy-cli (auto-installed via pipx/uvx by the setup script)."9prerequisites:10 commands: ["python"]11setup:12 help: "Run scripts/hardware_check.py FIRST to decide local vs Comfy Cloud; then scripts/comfyui_setup.sh auto-installs locally (or use Cloud API key for platform.comfy.org)."13metadata:14 hermes:15 tags:16 - comfyui17 - image-generation18 - stable-diffusion19 - flux20 - sd321 - wan-video22 - hunyuan-video23 - creative24 - generative-ai25 - video-generation26 related_skills: [stable-diffusion]27 category: creative28---29 30# ComfyUI31 32Generate images, video, audio, and 3D content through ComfyUI using the33official `comfy-cli` for setup/lifecycle and direct REST/WebSocket API34for workflow execution.35 36## What's in this skill37 38**Reference docs (`references/`):**39 40- `official-cli.md` — every `comfy ...` command, with flags41- `rest-api.md` — REST + WebSocket endpoints (local + cloud), payload schemas42- `workflow-format.md` — API-format JSON, common node types, param mapping43- `template-integrity.md` — converting `comfyui-workflow-templates` from44 editor format to API format: Reroute bypass, dotted dynamic-input keys45 (`values.a`, `resize_type.width`), Cloud quirks (302 redirect, 1 concurrent46 free-tier job, 1080p VRAM ceiling), Discord-compatible ffmpeg stitch.47 Authored by [@purzbeats](https://github.com/purzbeats). Load this whenever48 you're starting from an official template.49 50**Scripts (`scripts/`):**51 52| Script | Purpose |53|--------|---------|54| `_common.py` | Shared HTTP, cloud routing, node catalogs (don't run directly) |55| `hardware_check.py` | Probe GPU/VRAM/disk → recommend local vs Comfy Cloud |56| `comfyui_setup.sh` | Hardware check + comfy-cli + ComfyUI install + launch + verify |57| `extract_schema.py` | Read a workflow → list controllable params + model deps |58| `check_deps.py` | Check workflow against running server → list missing nodes/models |59| `auto_fix_deps.py` | Run check_deps then `comfy node install` / `comfy model download` |60| `run_workflow.py` | Inject params, submit, monitor, download outputs (HTTP or WS) |61| `run_batch.py` | Submit a workflow N times with sweeps, parallel up to your tier |62| `ws_monitor.py` | Real-time WebSocket viewer for executing jobs (live progress) |63| `health_check.py` | Verification checklist runner — comfy-cli + server + models + smoke test |64| `fetch_logs.py` | Pull traceback / status messages for a given prompt_id |65 66**Example workflows (`workflows/`):** SD 1.5, SDXL, Flux Dev, SDXL img2img,67SDXL inpaint, ESRGAN upscale, AnimateDiff video, Wan T2V. See68`workflows/README.md`.69 70## When to Use71 72- User asks to generate images with Stable Diffusion, SDXL, Flux, SD3, etc.73- User wants to run a specific ComfyUI workflow file74- User wants to chain generative steps (txt2img → upscale → face restore)75- User needs ControlNet, inpainting, img2img, or other advanced pipelines76- User asks to manage ComfyUI queue, check models, or install custom nodes77- User wants video/audio/3D generation via AnimateDiff, Hunyuan, Wan, AudioCraft, etc.78 79## Architecture: Two Layers80 81```82┌─────────────────────────────────────────────────────┐83│ Layer 1: comfy-cli (official lifecycle tool) │84│ Setup, server lifecycle, custom nodes, models │85│ → comfy install / launch / stop / node / model │86└─────────────────────────┬───────────────────────────┘87 │88┌─────────────────────────▼───────────────────────────┐89│ Layer 2: REST/WebSocket API + skill scripts │90│ Workflow execution, param injection, monitoring │91│ POST /api/prompt, GET /api/view, WS /ws │92│ → run_workflow.py, run_batch.py, ws_monitor.py │93└─────────────────────────────────────────────────────┘94```95 96**Why two layers?** The official CLI is excellent for installation and server97management but has minimal workflow execution support. The REST/WS API fills98that gap — the scripts handle param injection, execution monitoring, and99output download that the CLI doesn't do.100 101## Quick Start102 103### Detect environment104 105```bash106# What's available?107command -v comfy >/dev/null 2>&1 && echo "comfy-cli: installed"108curl -s http://127.0.0.1:8188/system_stats 2>/dev/null && echo "server: running"109 110# Can this machine run ComfyUI locally? (GPU/VRAM/disk check)111python scripts/hardware_check.py112```113 114If nothing is installed, see **Setup & Onboarding** below — but always run the115hardware check first.116 117### One-line health check118 119```bash120python scripts/health_check.py121# → JSON: comfy_cli on PATH? server reachable? at least one checkpoint? smoke-test passes?122```123 124## Core Workflow125 126### Step 1: Get a workflow JSON in API format127 128Workflows must be in API format (each node has `class_type`). They come from:129 130- ComfyUI web UI → **Workflow → Export (API)** (newer UI) or131 the legacy "Save (API Format)" button (older UI)132- This skill's `workflows/` directory (ready-to-run examples)133- Community downloads (civitai, Reddit, Discord) — usually editor format,134 must be loaded into ComfyUI then re-exported135 136Editor format (top-level `nodes` and `links` arrays) is **not directly137executable**. The scripts detect this and tell you to re-export.138 139### Step 2: See what's controllable140 141```bash142python scripts/extract_schema.py workflow_api.json --summary-only143# → {"parameter_count": 12, "has_negative_prompt": true, "has_seed": true, ...}144 145python scripts/extract_schema.py workflow_api.json146# → full schema with parameters, model deps, embedding refs147```148 149### Step 3: Run with parameters150 151```bash152# Local (defaults to http://127.0.0.1:8188)153python scripts/run_workflow.py \154 --workflow workflow_api.json \155 --args '{"prompt": "a beautiful sunset over mountains", "seed": -1, "steps": 30}' \156 --output-dir ./outputs157 158# Cloud (export API key once; uses correct /api routing automatically)159export COMFY_CLOUD_API_KEY="comfyui-..."160python scripts/run_workflow.py \161 --workflow workflow_api.json \162 --args '{"prompt": "..."}' \163 --host https://cloud.comfy.org \164 --output-dir ./outputs165 166# Real-time progress via WebSocket (requires `pip install websocket-client`)167python scripts/run_workflow.py \168 --workflow flux_dev.json \169 --args '{"prompt": "..."}' \170 --ws171 172# img2img / inpaint: pass --input-image to upload + reference automatically173python scripts/run_workflow.py \174 --workflow sdxl_img2img.json \175 --input-image image=./photo.png \176 --args '{"prompt": "make it watercolor", "denoise": 0.6}'177 178# Batch / sweep: 8 random seeds, parallel up to cloud tier limit179python scripts/run_batch.py \180 --workflow sdxl.json \181 --args '{"prompt": "abstract"}' \182 --count 8 --randomize-seed --parallel 3 \183 --output-dir ./outputs/batch184```185 186`-1` for `seed` (or omitting it with `--randomize-seed`) generates a fresh187random seed per run.188 189### Step 4: Present results190 191The scripts emit JSON to stdout describing every output file:192 193```json194{195 "status": "success",196 "prompt_id": "abc-123",197 "outputs": [198 {"file": "./outputs/sdxl_00001_.png", "node_id": "9",199 "type": "image", "filename": "sdxl_00001_.png"}200 ]201}202```203 204## Decision Tree205 206| User says | Tool | Command |207|-----------|------|---------|208| **Lifecycle (use comfy-cli)** | | |209| "install ComfyUI" | comfy-cli | `bash scripts/comfyui_setup.sh` |210| "start ComfyUI" | comfy-cli | `comfy launch --background` |211| "stop ComfyUI" | comfy-cli | `comfy stop` |212| "install X node" | comfy-cli | `comfy node install <name>` |213| "download X model" | comfy-cli | `comfy model download --url <url> --relative-path models/checkpoints` |214| "list installed models" | comfy-cli | `comfy model list` |215| "list installed nodes" | comfy-cli | `comfy node show installed` |216| **Execution (use scripts)** | | |217| "is everything ready?" | script | `health_check.py` (optionally with `--workflow X --smoke-test`) |218| "what can I change in this workflow?" | script | `extract_schema.py W.json` |219| "check if W's deps are met" | script | `check_deps.py W.json` |220| "fix missing deps" | script | `auto_fix_deps.py W.json` |221| "generate an image" | script | `run_workflow.py --workflow W --args '{...}'` |222| "use this image" (img2img) | script | `run_workflow.py --input-image image=./x.png ...` |223| "8 variations with random seeds" | script | `run_batch.py --count 8 --randomize-seed ...` |224| "show me live progress" | script | `ws_monitor.py --prompt-id <id>` |225| "fetch the error from job X" | script | `fetch_logs.py <prompt_id>` |226| **Direct REST** | | |227| "what's in the queue?" | REST | `curl http://HOST:8188/queue` (local) or `--host https://cloud.comfy.org` |228| "cancel that" | REST | `curl -X POST http://HOST:8188/interrupt` |229| "free GPU memory" | REST | `curl -X POST http://HOST:8188/free` |230 231## Setup & Onboarding232 233When a user asks to set up ComfyUI, **the FIRST thing to do is ask whether234they want Comfy Cloud (hosted, zero install, API key) or Local (install235ComfyUI on their machine)**. Don't start running install commands or hardware236checks until they've answered.237 238**Official docs:** https://docs.comfy.org/installation239**CLI docs:** https://docs.comfy.org/comfy-cli/getting-started240**Cloud docs:** https://docs.comfy.org/get_started/cloud241**Cloud API:** https://docs.comfy.org/development/cloud/overview242 243### Step 0: Ask Local vs Cloud (ALWAYS FIRST)244 245Suggested script:246 247> "Do you want to run ComfyUI locally on your machine, or use Comfy Cloud?248>249> - **Comfy Cloud** — hosted on RTX 6000 Pro GPUs, all common models pre-installed,250> zero setup. Requires an API key (paid subscription required to actually run251> workflows; free tier is read-only). Best if you don't have a capable GPU.252> - **Local** — free, but your machine MUST meet the hardware requirements:253> - NVIDIA GPU with **≥6 GB VRAM** (≥8 GB for SDXL, ≥12 GB for Flux/video), OR254> - AMD GPU with ROCm support (Linux), OR255> - Apple Silicon Mac (M1+) with **≥16 GB unified memory** (≥32 GB recommended).256> - Intel Macs and machines with no GPU will NOT work — use Cloud instead.257>258> Which would you like?"259 260Routing:261 262- **Cloud** → skip to **Path A**.263- **Local** → run hardware check first, then pick a path from Paths B–E based on the verdict.264- **Unsure** → run the hardware check and let the verdict decide.265 266### Step 1: Verify Hardware (ONLY if user chose local)267 268```bash269python scripts/hardware_check.py --json270# Optional: also probe `torch` for actual CUDA/MPS:271python scripts/hardware_check.py --json --check-pytorch272```273 274| Verdict | Meaning | Action |275|------------|---------------------------------------------------------------|--------|276| `ok` | ≥8 GB VRAM (discrete) OR ≥32 GB unified (Apple Silicon) | Local install — use `comfy_cli_flag` from report |277| `marginal` | SD1.5 works; SDXL tight; Flux/video unlikely | Local OK for light workflows, else **Path A (Cloud)** |278| `cloud` | No usable GPU, <6 GB VRAM, <16 GB Apple unified, Intel Mac, Rosetta Python | **Switch to Cloud** unless user explicitly forces local |279 280The script also surfaces `wsl: true` (WSL2 with NVIDIA passthrough) and281`rosetta: true` (x86_64 Python on Apple Silicon — must reinstall as ARM64).282 283If verdict is `cloud` but the user wants local, do not proceed silently.284Show the `notes` array verbatim and ask whether they want to (a) switch to285Cloud or (b) force a local install (will OOM or be unusably slow on modern models).286 287### Choosing an Installation Path288 289Use the hardware check first. The table below is the fallback for when the290user has already told you their hardware:291 292| Situation | Recommended Path |293|-----------|------------------|294| `verdict: cloud` from hardware check | **Path A: Comfy Cloud** |295| No GPU / want to try without commitment | **Path A: Comfy Cloud** |296| Windows + NVIDIA + non-technical | **Path B: ComfyUI Desktop** |297| Windows + NVIDIA + technical | **Path C: Portable** or **Path D: comfy-cli** |298| Linux + any GPU | **Path D: comfy-cli** (easiest) |299| macOS + Apple Silicon | **Path B: Desktop** or **Path D: comfy-cli** |300| Headless / server / CI / agents | **Path D: comfy-cli** |301 302For the fully automated path (hardware check → install → launch → verify):303 304```bash305bash scripts/comfyui_setup.sh306# Or with overrides:307bash scripts/comfyui_setup.sh --m-series --port=8190 --workspace=/data/comfy308```309 310It runs `hardware_check.py` internally, refuses to install locally when the311verdict is `cloud` (unless `--force-cloud-override`), picks the right312`comfy-cli` flag, and prefers `pipx`/`uvx` over global `pip` to avoid polluting313system Python.314 315---316 317### Path A: Comfy Cloud (No Local Install)318 319For users without a capable GPU or who want zero setup. Hosted on RTX 6000 Pro.320 321**Docs:** https://docs.comfy.org/get_started/cloud322 3231. Sign up at https://comfy.org/cloud3242. Generate an API key at https://platform.comfy.org/login3253. Set the key:326 ```bash327 export COMFY_CLOUD_API_KEY="your-comfyui-key"328 ```3294. Run workflows:330 ```bash331 python scripts/run_workflow.py \332 --workflow workflows/flux_dev_txt2img.json \333 --args '{"prompt": "..."}' \334 --host https://cloud.comfy.org \335 --output-dir ./outputs336 ```337 338**Pricing:** https://www.comfy.org/cloud/pricing339**Concurrent jobs:** Free/Standard 1, Creator 3, Pro 5. Free tier340**cannot run workflows via API** — only browse models. Paid subscription341required for `/api/prompt`, `/api/upload/*`, `/api/view`, etc.342 343---344 345### Path B: ComfyUI Desktop (Windows / macOS)346 347One-click installer for non-technical users. Currently Beta.348 349**Docs:** https://docs.comfy.org/installation/desktop350- **Windows (NVIDIA):** https://download.comfy.org/windows/nsis/x64351- **macOS (Apple Silicon):** https://comfy.org352 353Linux is **not supported** for Desktop — use Path D.354 355---356 357### Path C: ComfyUI Portable (Windows Only)358 359**Docs:** https://docs.comfy.org/installation/comfyui_portable_windows360 361Download from https://github.com/comfyanonymous/ComfyUI/releases, extract,362run `run_nvidia_gpu.bat`. Update via `update/update_comfyui_stable.bat`.363 364---365 366### Path D: comfy-cli (All Platforms — Recommended for Agents)367 368The official CLI is the best path for headless/automated setups.369 370**Docs:** https://docs.comfy.org/comfy-cli/getting-started371 372#### Install comfy-cli373 374```bash375# Recommended:376pipx install comfy-cli377# Or use uvx without installing:378uvx --from comfy-cli comfy --help379# Or (if pipx/uvx unavailable):380pip install --user comfy-cli381```382 383Disable analytics non-interactively:384```bash385comfy --skip-prompt tracking disable386```387 388#### Install ComfyUI389 390```bash391comfy --skip-prompt install --nvidia # NVIDIA (CUDA)392comfy --skip-prompt install --amd # AMD (ROCm, Linux)393comfy --skip-prompt install --m-series # Apple Silicon (MPS)394comfy --skip-prompt install --cpu # CPU only (slow)395comfy --skip-prompt install --nvidia --fast-deps # uv-based dep resolution396```397 398Default location: `~/comfy/ComfyUI` (Linux), `~/Documents/comfy/ComfyUI`399(macOS/Win). Override with `comfy --workspace /custom/path install`.400 401#### Launch / verify402 403```bash404comfy launch --background # background daemon on :8188405comfy launch -- --listen 0.0.0.0 --port 8190 # LAN-accessible custom port406curl -s http://127.0.0.1:8188/system_stats # health check407```408 409---410 411### Path E: Manual Install (Advanced / Unsupported Hardware)412 413For Ascend NPU, Cambricon MLU, Intel Arc, or other unsupported hardware.414 415**Docs:** https://docs.comfy.org/installation/manual_install416 417```bash418git clone https://github.com/comfyanonymous/ComfyUI.git419cd ComfyUI420pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu130421pip install -r requirements.txt422python main.py423```424 425---426 427### Post-Install: Download Models428 429```bash430# SDXL (general purpose, ~6.5 GB)431comfy model download \432 --url "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors" \433 --relative-path models/checkpoints434 435# SD 1.5 (lighter, ~4 GB, good for 6 GB cards)436comfy model download \437 --url "https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors" \438 --relative-path models/checkpoints439 440# Flux Dev fp8 (smaller variant, ~12 GB)441comfy model download \442 --url "https://huggingface.co/Comfy-Org/flux1-dev/resolve/main/flux1-dev-fp8.safetensors" \443 --relative-path models/checkpoints444 445# CivitAI (set token first):446comfy model download \447 --url "https://civitai.com/api/download/models/128713" \448 --relative-path models/checkpoints \449 --set-civitai-api-token "YOUR_TOKEN"450```451 452List installed: `comfy model list`.453 454### Post-Install: Install Custom Nodes455 456```bash457comfy node install comfyui-impact-pack # popular utility pack458comfy node install comfyui-animatediff-evolved # video generation459comfy node install comfyui-controlnet-aux # ControlNet preprocessors460comfy node install comfyui-essentials # common helpers461comfy node update all462comfy node install-deps --workflow=workflow.json # install everything a workflow needs463```464 465### Post-Install: Verify466 467```bash468python scripts/health_check.py469# → comfy_cli on PATH? server reachable? checkpoints? smoke test?470 471python scripts/check_deps.py my_workflow.json472# → are this workflow's nodes/models/embeddings installed?473 474python scripts/run_workflow.py \475 --workflow workflows/sd15_txt2img.json \476 --args '{"prompt": "test", "steps": 4}' \477 --output-dir ./test-outputs478```479 480## Image Upload (img2img / Inpainting)481 482The simplest way is to use `--input-image` with `run_workflow.py`:483 484```bash485python scripts/run_workflow.py \486 --workflow workflows/sdxl_img2img.json \487 --input-image image=./photo.png \488 --args '{"prompt": "make it cyberpunk", "denoise": 0.6}'489```490 491The flag uploads `photo.png`, then injects its server-side filename into492whatever schema parameter is named `image`. For inpainting, pass both:493 494```bash495python scripts/run_workflow.py \496 --workflow workflows/sdxl_inpaint.json \497 --input-image image=./photo.png \498 --input-image mask_image=./mask.png \499 --args '{"prompt": "fill with flowers"}'500```501 502Manual upload via REST:503```bash504curl -X POST "http://127.0.0.1:8188/upload/image" \505 -F "image=@photo.png" -F "type=input" -F "overwrite=true"506# Returns: {"name": "photo.png", "subfolder": "", "type": "input"}507 508# Cloud equivalent:509curl -X POST "https://cloud.comfy.org/api/upload/image" \510 -H "X-API-Key: $COMFY_CLOUD_API_KEY" \511 -F "image=@photo.png" -F "type=input" -F "overwrite=true"512```513 514## Cloud Specifics515 516- **Base URL:** `https://cloud.comfy.org`517- **Auth:** `X-API-Key` header (or `?token=KEY` for WebSocket)518- **API key:** set `$COMFY_CLOUD_API_KEY` once and the scripts pick it up automatically519- **Output download:** `/api/view` returns a 302 to a signed URL; the scripts520 follow it and strip `X-API-Key` before fetching from the storage backend521 (don't leak the API key to S3/CloudFront).522- **Endpoint differences from local ComfyUI:**523 - `/api/object_info`, `/api/queue`, `/api/userdata` — **403 on free tier**;524 paid only.525 - `/history` is renamed to `/history_v2` on cloud (the scripts route526 automatically).527 - `/models/<folder>` is renamed to `/experiment/models/<folder>` on cloud528 (the scripts route automatically).529 - `clientId` in WebSocket is currently ignored — all connections for a530 user receive the same broadcast. Filter by `prompt_id` client-side.531 - `subfolder` is accepted on uploads but ignored — cloud has a flat namespace.532- **Concurrent jobs:** Free/Standard: 1, Creator: 3, Pro: 5. Extras queue533 automatically. Use `run_batch.py --parallel N` to saturate your tier.534 535## Queue & System Management536 537```bash538# Local539curl -s http://127.0.0.1:8188/queue | python -m json.tool540curl -X POST http://127.0.0.1:8188/queue -d '{"clear": true}' # cancel pending541curl -X POST http://127.0.0.1:8188/interrupt # cancel running542curl -X POST http://127.0.0.1:8188/free \543 -H "Content-Type: application/json" \544 -d '{"unload_models": true, "free_memory": true}'545 546# Cloud — same paths under /api/, plus:547python scripts/fetch_logs.py --tail-queue --host https://cloud.comfy.org548```549 550## Pitfalls551 5521. **API format required** — every script and the `/api/prompt` endpoint expect553 API-format workflow JSON. The scripts detect editor format (top-level554 `nodes` and `links` arrays) and tell you to re-export via555 "Workflow → Export (API)" (newer UI) or "Save (API Format)" (older UI).556 5572. **Server must be running** — all execution requires a live server.558 `comfy launch --background` starts one. Verify with559 `curl http://127.0.0.1:8188/system_stats`.560 5613. **Model names are exact** — case-sensitive, includes file extension.562 `check_deps.py` does fuzzy matching (with/without extension and folder563 prefix), but the workflow itself must use the canonical name. Use564 `comfy model list` to discover what's installed.565 5664. **Missing custom nodes** — "class_type not found" means a required node567 isn't installed. `check_deps.py` reports which package to install;568 `auto_fix_deps.py` runs the install for you.569 5705. **Working directory** — `comfy-cli` auto-detects the ComfyUI workspace.571 If commands fail with "no workspace found", use572 `comfy --workspace /path/to/ComfyUI <command>` or573 `comfy set-default /path/to/ComfyUI`.574 5756. **Cloud free-tier API limits** — `/api/prompt`, `/api/view`, `/api/upload/*`,576 `/api/object_info` all return 403 on free accounts. `health_check.py` and577 `check_deps.py` handle this gracefully and surface a clear message.578 5797. **Timeout for video/audio workflows** — auto-detected when an output node580 is `VHS_VideoCombine`, `SaveVideo`, etc.; the default jumps from 300 s to581 900 s. Override explicitly with `--timeout 1800`.582 5838. **Path traversal in output filenames** — server-supplied filenames are584 passed through `safe_path_join` to refuse anything escaping `--output-dir`.585 Keep this protection on — workflows with custom save nodes can produce586 arbitrary paths.587 5889. **Workflow JSON is arbitrary code** — custom nodes run Python, so589 submitting an unknown workflow has the same trust profile as `eval`.590 Inspect workflows from untrusted sources before running.591 59210. **Auto-randomized seed** — pass `seed: -1` in `--args` (or use593 `--randomize-seed` and omit the seed) to get a fresh seed per run.594 The actual seed is logged to stderr.595 59611. **`tracking` prompt** — first run of `comfy` may prompt for analytics.597 Use `comfy --skip-prompt tracking disable` to skip non-interactively.598 `comfyui_setup.sh` does this for you.599 600## Verification Checklist601 602Use `python scripts/health_check.py` to run the whole list at once. Manual:603 604- [ ] `hardware_check.py` verdict is `ok` OR the user explicitly chose Comfy Cloud605- [ ] `comfy --version` works (or `uvx --from comfy-cli comfy --help`)606- [ ] `curl http://HOST:PORT/system_stats` returns JSON607- [ ] `comfy model list` shows at least one checkpoint (local) OR608 `/api/experiment/models/checkpoints` returns models (cloud)609- [ ] Workflow JSON is in API format610- [ ] `check_deps.py` reports `is_ready: true` (or only `node_check_skipped`611 on cloud free tier)612- [ ] Test run with a small workflow completes; outputs land in `--output-dir`613 Discovery context
Discovered by repository scan. No exact path reference found in the snapshot’s root AGENTS.md.