skills/compose-doctor/SKILL.md
Diagnose and fix broken Goldsky Compose apps interactively. Triggers on: compose app in error state, crashlooping, not running, not processing tasks, cron not firing, HTTP trigger returning 500, onchain event listener missing events, wallet errors, gas sponsorship failures, 'No bundler provider available', manifest validation errors, bundling/esbuild failures, secret missing, 'You cannot use a smart wallet in local dev', 'Transaction Receipt failed with status'. Also use when the user mentions a Compose app name alongside a problem, even if they don't say 'compose' explicitly, if they're referring to `goldsky compose` commands (not `goldsky turbo` or `goldsky pipeline`). Runs `status`/`logs`/`secret list`/`wallet list` to identify root cause, and offers fixes. For building a new app from scratch, use /compose instead. For manifest field / CLI flag / API lookups without an active problem, use /compose-reference instead. Do NOT trigger on Turbo or Mirror pipeline problems.
npx skillsauth add goldsky-io/goldsky-agent compose-doctorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Diagnose and fix broken Compose apps. Workflow-oriented: we walk through auth → app identification → status → logs → secrets → wallets → manifest → diagnosis → fix.
/compose for that./compose-reference./secrets. But DO check whether required secrets exist as part of diagnosis./turbo-doctor.Before running any commands, check if you have the Bash tool available:
goldsky project list 2>&1. If not logged in, use /auth-setup.
goldsky compose list. Confirm the app exists and note its current status.
goldsky compose status -n <app> or goldsky compose status -n <app> --json.
Possible statuses: RUNNING, PAUSED, ERROR, STARTING, STOPPED, PROVISIONING. Decision tree:
goldsky compose resume -n <app> if not..updated_at from --json output to compute how long.)goldsky compose logs -n <app> --tail 200 --json 2>&1 (add -f to stream, --level error,warn to filter, --since 1h for a window, --search <term> for text match).
How to match errors: scan the full log text (NDJSON .message field when --json is set) for exact substring against the first column of the error table below. Log lines include a dashboard_url attribute pointing to the specific run in the dashboard — surface it to the user alongside the diagnosis.
If logs show missing-secret or auth errors:
goldsky compose secret list -n <app>
Cross-reference against the manifest's secrets: array. Use /secrets or goldsky compose secret set to fix.
If logs show wallet or transaction errors:
goldsky compose wallet list -n <app>
Check whether the error is:
sponsorGas: false and fund the EOA manually.compose dev --fork-chains or use a BYO EOA wallet locally.dashboard_url from the log line — the run trace in the dashboard includes the decoded revert reason.If logs show Manifest validation failed: …, the manifest was rejected at deploy time. Common causes are in the error table below.
Present findings in this format:
## Diagnosis
**App:** <name>
**Status:** <status>
**Root cause:** <one-line explanation>
**Fix:** <one-line action, with exact command if possible>
**Verify:** <how to confirm it worked>
If the fix is mechanical (secret set, manifest edit, redeploy), execute it and re-run Steps 3–4 to verify. If the fix requires user input (contract revert reason, funding decision, API key rotation), surface the diagnosis and stop.
| Log / error message | Cause | Fix |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------- |
| Manifest validation failed: api_version is required for deployment. | Missing api_version at top of compose.yaml | Add api_version: stable (or a semver) |
| Manifest validation failed: api_version "<v>" is not valid. | Bad version value | Use stable, preview, canary, or semver |
| Project name must start with a letter… | Manifest name violates RFC 1123 | lowercase, letters/numbers/hyphens, letter-start |
| <task>.name must start with a letter or underscore… | Task name regex fail | match /^([a-zA-Z]\|_[a-zA-Z0-9])[a-zA-Z0-9_]*$/ |
| <task>.triggers[N].authentication must be either 'auth_token' or 'none' | HTTP trigger auth wrong | set to one of the two values |
| <task>.triggers[N].network must be in snake_case format | onchain_event network name wrong case | polygon_amoy, ethereum_mainnet (snake_case) |
| <task>.triggers[N].contract must be a valid EVM address | bad 0x address | check checksum + 40 hex chars |
| <task>.triggers[N].ip_whitelist[N] must be a valid IP or CIDR | malformed IP | fix format |
| Secret names must be in SCREAMING_SNAKE_CASE format | bad secret name | MY_SECRET, not my-secret |
| Secret name "<X>" in .env is reserved for the app's postgres database | secret clashes with hosted DB name (uppercased app name) | rename the secret |
| The following secrets are referenced in the manifest but are not set in your local .env file | local dev missing secret | add to .env or goldsky compose secret set --env local |
| Deploy blocked: required secrets are missing from cloud | cloud secret missing | goldsky compose secret set or deploy --sync-env |
| Task bundling failed: <msg> | esbuild compile error | fix the TS error in the task |
| esbuild native binary crashed… architecture mismatch… | arm/amd64 mismatch | rebuild image; rm -rf ~/.cache/esbuild |
| You cannot use a smart wallet in local dev unless you use chain forking. | Smart wallet in plain compose dev | compose dev --fork-chains or switch to a BYO EOA |
| No bundler provider available for chain <id>. | chain not supported by any bundler | change chains, or set sponsorGas: false |
| Chain <id> is not supported by Alchemy's bundler. | forced Alchemy on wrong chain | unset BUNDLER_PROVIDER env override |
| Transaction Receipt failed with status reverted | onchain revert | open dashboard_url for decoded revert reason |
| Cannot deserialize params: chain <id> not found | reorg replay for a chain missing in viem/chains | update the CLI / switch chains |
| [Warning] onReorg is not supported for gas-sponsored transactions. | non-fatal warning | if reorg matters, switch to non-sponsored |
| [Warning] The 'nonce' parameter is being ignored for gas-sponsored transactions. | passing nonce to sponsored send | remove the nonce override |
Every app has a dashboard page: https://app.goldsky.com/<project_id>/dashboard/compose/<app-name>. Every run has …/runs/<run_id>. When diagnosing, surface both links to the user.
If you don't have the Bash tool, output the diagnostic commands for the user to run, but structure them clearly:
This is the fallback path — always prefer running commands directly when Bash is available.
goldsky compose pause stops task execution without tearing down state.--delete-database on compose delete is irreversible — triple-check before running./compose — Build a new Compose app or explain what Compose is./compose-reference — Manifest / CLI / TaskContext / codegen lookups./secrets — Generic secret management./auth-setup — Fix authentication.development
Turbo pipeline YAML reference and architecture guide. Covers: YAML field syntax (start_at, from, version, primary_key), source/transform/sink configuration, validation errors, resource sizing (xs–xxl), architecture decisions (dataset vs kafka, streaming vs job, fan-out vs fan-in, sink selection, pipeline splitting). Triggers on: 'what does field X do', 'what fields does a postgres sink need', 'what resource size', 'should I use kafka or dataset', 'how to structure my pipeline'. For writing transforms, use /turbo-transforms. For end-to-end building, use /turbo-builder.
tools
Build and deploy new Goldsky Turbo pipelines from scratch. Triggers on: 'build a pipeline', 'index X on Y chain', 'set up a pipeline', 'track transfers to postgres', or any request describing data to move from a chain/contract to a destination (postgres, mysql, clickhouse, kafka, pubsub, s3, sqs, webhook). Covers the full workflow: requirements → dataset selection → YAML generation → validation → deploy. Not for debugging (use /turbo-doctor) or syntax lookups (use /turbo-pipelines).
development
Write SQL, TypeScript, and dynamic table transforms for Turbo pipelines. Covers: decoding EVM logs with _gs_log_decode, filtering/casting blockchain data, UNION ALL for combining events, TypeScript/WASM transforms (invoke function), dynamic lookup tables (dynamic_table_check), transform chaining, and Solana decoding. Triggers on: 'decode Transfer events', 'write a SQL transform', 'filter by contract', 'TypeScript transform', 'dynamic table', 'UNION ALL'. For pipeline YAML structure, use /turbo-pipelines. For end-to-end building, use /turbo-builder.
tools
Use this skill when a user wants to store, manage, or work with Goldsky secrets — the named credential objects used by pipeline sinks. This includes: creating a new secret from a connection string or credentials, listing or inspecting existing secrets, updating or rotating credentials after a password change, and deleting secrets that are no longer needed. Trigger for any query where the user mentions 'goldsky secret', wants to securely store database credentials for a pipeline, or is working with sink authentication for PostgreSQL, Neon, Supabase, ClickHouse, Kafka, S3, Google Cloud Pub/Sub, Elasticsearch, DynamoDB, SQS, OpenSearch, or webhooks.