debug-pipeline
Skill16 starsChanged 3 days agoApache-2.0View on GitHub
Debug a Dagster pipeline by analyzing failed materializations, sensor issues, partition problems, resource config errors, and IO manager failures. Uses Dagster MCP tools to inspect runs, assets, and errors directly. Use when user says 'pipeline failed', 'asset won't materialize', 'sensor not firing', 'S3 connection failed', 'Milvus error', 'partition stuck', 'rclone not working', 'embedding failed', 'document parsing error', or 'Dagster run failed'. Do NOT use for pipeline architecture questions (use dagster-pipelines), scaffolding new pipelines (use scaffold-pipeline), or rclone setup (use rclone-guide).
- Reads credentials
We split this skill into the rules it gives an agent
26 rules. 0 are common, 14 are distinctive, and 12 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
14
Distinctive
This author's own choices. Worth a look.
12
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 14
Follow the diagnostic steps below.
- Distinctive: line 21
Use the Dagster MCP tools to gather diagnostic data before reading code.
- Very specific: line 26
Use mcp__dagster__list_repositories to see all code locations.
- Very specific: line 31
Use mcp__dagster__recent_runs (default limit: 10) to find failed runs.
- Distinctive: line 33
If the user hasn't provided a run ID, show them the recent failures and ask which one to investigate.
- Very specific: line 38
Use mcp__dagster__get_run_info with the run ID to get:
- Distinctive: line 40
Run status and timestamps
- Very specific: line 50
Use mcp__dagster__get_asset_info with the asset key to check:
- Distinctive: line 56
If the user mentions a specific asset but not a run ID, start here.
- Distinctive: line 61
Ask the user for identifying information when you need it:
- Distinctive: line 65
Repository: Only ask if multiple code locations exist (rare in dev)
- Distinctive: line 71
Use the error information from Step 1 to match against these known patterns.
- Distinctive: line 77
Automation condition not triggered: Check that upstream asset has a version change
- Very specific: line 80
Verify asset has AutomationCondition.eager() or all_deps_completed
- Very specific: line 85
Verify default_automation_sensor(assets) is in the sensors list
- Very specific: line 90
Check max_partitions limit -- if exceeded, some partitions are deferred
- Very specific: line 94
Check the resources dict in the Definitions matches all ResourceParam[T] types in ops
- Distinctive: line 111
Check S3 bucket contents
- Distinctive: line 121
Default: 1000 partitions per observation
- Distinctive: line 122
If more files exist, they'll be picked up in subsequent runs
- Distinctive: line 139
Check consumer name uniqueness
- Distinctive: line 153
After 6 retries with exponential backoff, op fails permanently
- Very specific: line 289
Re-materialize an asset: Use mcp__dagster__materialize_asset with the asset key, repository location, and repository name
- Very specific: line 291
Re-launch a job: Use mcp__dagster__launch_run with the job name and repository info
- Very specific: line 292
Verify success: Use mcp__dagster__recent_runs and mcp__dagster__get_run_info to confirm the re-run succeeded
- Very specific: line 293
Terminate stuck run: Use mcp__dagster__terminate_run if a run is hanging
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Debug Pipeline -- Troubleshooting Guide
Investigate the pipeline issue described via $ARGUMENTS.
Follow the diagnostic steps below. Start with Dagster MCP tools to gather concrete error data, then investigate the code.
Step 1: Triage via Dagster MCP
Use the Dagster MCP tools to gather diagnostic data before reading code. These tools query the running Dagster instance directly.
1a. Discover What's Deployed
Use mcp__dagster__list_repositories to see all code locations. Then use mcp__dagster__list_assets and
mcp__dagster__list_jobs with the repository location and name to understand what's running.
1b. Find Recent Failures
Use mcp__dagster__recent_runs (default limit: 10) to find failed runs. Look for runs with FAILURE status.
If the user hasn't provided a run ID, show them the recent failures and ask which one to investigate. If only one failure exists, proceed with that.
1c. Get Detailed Error Info
Use mcp__dagster__get_run_info with the run ID to get:
- Run status and timestamps
- Error messages and stack traces
- Step-level failure details
- Run configuration
This replaces manually checking the Dagster UI. The error message from get_run_info is usually sufficient to identify
the root cause.
1d. Check Asset Status
Use mcp__dagster__get_asset_info with the asset key to check:
- Latest materialization status
- Partition status
- Upstream dependency state
If the user mentions a specific asset but not a run ID, start here. Ask the user for the asset key if it's not clear from context.
When to Ask the User
Ask the user for identifying information when you need it:
- Run ID: "Which run failed? I can see these recent failures: [list from recent_runs]"
- Asset key: "Which asset is failing? Here are the assets in this repository: [list from list_assets]"
- Repository: Only ask if multiple code locations exist (rare in dev)
Step 2: Diagnose by Symptom
Use the error information from Step 1 to match against these known patterns.
Asset Won't Materialize
Possible causes:
Automation condition not triggered: Check that upstream asset has a version change
- Read:
packages/pipeline/swiss_ai_hub/pipeline/automation/all_deps_completed.py - Verify asset has
AutomationCondition.eager()orall_deps_completed
- Read:
Automation sensor not running: The sensor must be included in
Definitions- Read:
packages/pipeline/swiss_ai_hub/pipeline/sensors/factory.py - Verify
default_automation_sensor(assets)is in the sensors list
- Read:
Partition key mismatch: Dynamic partitions may not have been created
- Read:
packages/pipeline/swiss_ai_hub/pipeline/util/partition_utils.py - Check
max_partitionslimit -- if exceeded, some partitions are deferred
- Read:
Resource missing: Op can't find required resource
- Check the
resourcesdict in theDefinitionsmatches allResourceParam[T]types in ops - Stage 2 always supplies every enrichment resource (
table_refinement,summary_parser): the graph is the same for every knowledge database, and each step decides per run from the bucket's configuration whether it has work. A missing one is a wiring bug, never a deployment setting.
- Check the
IO Manager mismatch: Asset output type doesn't match IO manager expectations
- S3DataLakeIOManager expects
DataLakeFile - DocStoreIOManager expects
RefDocDocument - VectorStoreIOManager expects
list[TextNode]
- S3DataLakeIOManager expects
Observable Asset Returns No Changes
Possible causes:
No files in source: The data lake / rclone remote is empty
- Check S3 bucket contents
- For rclone: verify remote is configured and accessible
Hash unchanged: Content hash matches previous observation
- Data versions are content-based -- if file content didn't change, no version change
- Read:
packages/pipeline/swiss_ai_hub/pipeline/ops/data_lake/data_version_by_partition_for_data_lake.py
Partition limit reached:
max_partitionscaps how many partitions are processed per run- Default: 1000 partitions per observation
- If more files exist, they'll be picked up in subsequent runs
Sensor Not Firing
Check automation sensor:
- Read:
packages/pipeline/swiss_ai_hub/pipeline/sensors/factory.py - Is
default_automation_sensor(assets)in theDefinitions.sensorslist? - Is
minimum_interval_secondsappropriate? (default: 60s)
Check NATS sensor:
- Read:
packages/pipeline/swiss_ai_hub/pipeline/sensors/nats/nats_document_uploaded_sensor.py - Is NATS reachable? Check
NATS_ENDPOINTenv var - Is the JetStream stream created? (poller creates it on first run) — events published before the stream exists are dropped, since JetStream has nowhere to store them
- Are
SourceUpdatedEventmessages being published? - Check consumer name uniqueness
skipped: Observation run <id> is already in flightis normal, not a fault — the sensor deliberately keeps one observation at a time and re-arms afterwards. LikewiseDebouncing N pending event(s)means a burst is being collected (30 s). Read the sensor's cursor in the Dagster UI to seepending_events/followup_armed; if a run seems missing, check whether itsdagster/run_keywas deduplicated
Embedding Failures
Symptoms: RetryPolicy exhausted, ValidationError in embed_nodes
- Read:
packages/pipeline/swiss_ai_hub/pipeline/ops/nodes/embed_nodes.py - LiteLLM endpoint unreachable
- Token limit exceeded: document too large after chunking
- Batch splitting: on
ValidationError, batch is recursively split in half - After 6 retries with exponential backoff, op fails permanently
Document Parsing Failures
Symptoms: parse_document_from_data_lake fails
- Read:
packages/pipeline/swiss_ai_hub/pipeline/ops/data_lake/parse_document_from_data_lake.py - Read:
packages/pipeline/swiss_ai_hub/pipeline/resources/parser/document_parser_resource.py - MinerU service not running (if using remote MinerU)
- Unsupported file type
- Corrupted file content
- Large file timeout
- MinerU and MarkItDown conversions are cached by content hash in the
parse-cachebucket (MineruParseCache,MarkItDownParseCache, both inpackages/core/swiss_ai_hub/core/generative_ai/document/loaders/); a stale or wrong result for the same bytes means the cache entry (keyed also by MinerU settings, or by the MarkItDown version andXlsxMarkdownConverter's format) is the thing to inspect or delete, entries expire by lifecycle rule
Step 3: Check Infrastructure Connections
S3 (SeaweedFS)
Symptoms: botocore.exceptions.ClientError, EndpointConnectionError
Settings: packages/core/swiss_ai_hub/core/infrastructure/s3/s3_storage_settings.py
| Env Variable | Purpose |
S3_STORAGE_ENDPOINT | S3 endpoint URL (SeaweedFS S3 gateway in dev) |
S3_STORAGE_ACCESS_KEY | Access key |
S3_STORAGE_SECRET_KEY | Secret key |
S3_STORAGE_REGION | Region (default: us-east-1) |
Common issues: SeaweedFS not running (docker compose -f infra/docker-compose.dev.yml ps seaweedfs-s3), bucket doesn't
exist, wrong endpoint (inside Docker use http://seaweedfs-s3:9000, not localhost).
Milvus
Symptoms: MilvusException, connection timeout
Settings: packages/core/swiss_ai_hub/core/infrastructure/milvus/milvus_settings.py
| Env Variable | Purpose |
MILVUS_URL | Milvus endpoint |
MILVUS_ROOT_PASSWORD | Root password (optional; token is root:<password>) |
MILVUS_DIMENSION | Default embedding dimensions |
Common issues: Milvus not running, dimension mismatch (embedding model dimensions must match collection dimensions), collection not found (auto-created on first insert).
MongoDB/FerretDB
Symptoms: ConnectionFailure, OperationFailure
Settings: packages/core/swiss_ai_hub/core/infrastructure/mongo/mongo_settings.py
Common issues: FerretDB not running, database name mismatch (derived from bucket name via
get_db_name_from_bucket_name() in packages/pipeline/swiss_ai_hub/pipeline/util/bucket_utils.py).
Rclone
Symptoms: ClientConnectorError, 403 Forbidden, remote not found
Settings: packages/core/swiss_ai_hub/core/infrastructure/rclone/rclone_settings.py Client:
packages/pipeline/swiss_ai_hub/pipeline/resources/rclone/rclone_client.py Per-run remote:
packages/pipeline/swiss_ai_hub/pipeline/util/source_builders.py
| Env Variable | Purpose |
RCLONE_URL | RC API endpoint |
RCLONE_RC_USER | Auth username |
RCLONE_RC_PASS | Auth password |
RCLONE_LOCAL_SOURCE_ROOT | Directory a local source may read; unset disables that backend |
Common issues: Rclone service not running, the daemon lost its remotes after a restart (expected, it keeps no config
file: the next run re-creates them from the database's stored source configuration), OAuth token expired, wrong
--rc-serve flag (required for file downloads), a config/create error such as invalid key or value contains \n (a
multi-line credential; Google Drive JSON and SFTP PEM keys are normalised, other backends are not).
NATS
Settings: packages/core/swiss_ai_hub/core/infrastructure/nats/nats_settings.py
Common issues: NATS not running, JetStream not enabled, stream/consumer not created.
Docker Quick Check
# Check which services are running
docker compose -f infra/docker-compose.dev.yml ps
# Check specific service logs
docker compose -f infra/docker-compose.dev.yml logs <service> --tail=50Step 4: Common Error Patterns
"No partition definition found for the upstream asset"
IO manager can't find partition info. Check asset has partitions_def set and IO manager handles both partitioned and
non-partitioned cases.
"Expected a DataLakeFile or a list of DataLakeFiles"
S3DataLakeIOManager received wrong type. Check asset's io_manager_key matches the correct IO manager and op return
type matches expectations.
"Cannot connect to host seaweedfs-s3:9000"
S3 unreachable. Check the SeaweedFS S3 gateway is running, S3_STORAGE_ENDPOINT is correct, network connectivity
between Dagster and SeaweedFS containers.
"No nodes found for document after retrying for 30 seconds"
VectorStoreIOManager eventual consistency timeout. Check Milvus is healthy, nodes were actually inserted (check collection), and document ID conversion (URI to hash) is consistent.
"Rclone remote not found"
Read: packages/pipeline/swiss_ai_hub/pipeline/util/source_builders.py (rclone_remote_for_bucket).
Remotes are named rclone_{bucket} and rebuilt from BucketEntity.source_configuration on every run; nothing is
configured by hand. A missing remote therefore means the run never reached config/create: the database has no source
any more, its stored configuration fails validation (check the run's first step), or the daemon at RCLONE_URL is not
the one the pipeline talks to.
Step 5: Re-trigger After Fix
Once the root cause is fixed, use MCP tools to verify the fix:
- Re-materialize an asset: Use
mcp__dagster__materialize_assetwith the asset key, repository location, and repository name - Re-launch a job: Use
mcp__dagster__launch_runwith the job name and repository info - Verify success: Use
mcp__dagster__recent_runsandmcp__dagster__get_run_infoto confirm the re-run succeeded - Terminate stuck run: Use
mcp__dagster__terminate_runif a run is hanging
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- harness/harness-skills★ 127same name
- tstephx/book-mcp-server★ 1same name
- glassflow/agent-skills★ 0same name
- LuisHiluy/claude-code-pipeline-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository50 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- docs/CLAUDE.mdCLAUDE.md
- .github/actions/CLAUDE.mdCLAUDE.md
- arc42Skill
- audit-frontendSkill
- bot-frameworkSkill
- create-or-audit-claude-mdSkill
- create-or-audit-skillSkill
- create-or-audit-subagentSkill
- create-prSkill
- dagster-pipelinesSkill
- debug-agentSkill
- debug-frontendSkill
- design-systemSkill
- docker-devSkill
- document-decisionSkill
- document-featureSkill
- explainSkill
- generate-sdkSkill
- i18nSkill
- implement-feedback-from-prSkill
- likec4-dslSkill
- lintSkill
- merge-mainSkill
- nats-eventsSkill
- plan-issueSkill
- pr-demo-videoSkill
- primevue-lookupSkill
- rclone-guideSkill
- reflectSkill
- review-diffSkill
- scaffold-agentSkill
- scaffold-api-endpointSkill
- scaffold-api-repositorySkill
- scaffold-api-serviceSkill
- scaffold-bot-handlerSkill
- scaffold-composableSkill
- scaffold-event-displaySkill
- scaffold-frontend-componentSkill
- scaffold-frontend-pageSkill
- scaffold-frontend-subpageSkill
- scaffold-pipelineSkill
- setup-bot-connectionSkill
- splice-issueSkill
- sync-agent-docsSkill
- test-scopeSkill
- update-docSkill
- verify-sdk-syncSkill
- write-docSkill
- write-issueSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

