Fluid Forge
Why Forge
Concepts
Get Started
  • Consume a Data Product
  • See it run
  • Demos
  • Local (DuckDB)
  • Source-Aligned (Postgres → DuckDB)
  • AI Forge + Data Models
  • MCP Output Port — Serve to AI Agents
  • GCP (BigQuery)
  • Snowflake Team Collaboration
  • Declarative Airflow
  • Orchestration Export
  • Jenkins CI/CD
  • Universal Pipeline
  • 11-Stage Production Pipeline
  • Catalog Forge End-to-End
CLI Reference
  • Agent Policy (concept)
  • MCP Output Port — Serve to Agents
  • MCP deep-dive
  • AI-assisted authoring
  • LLM providers & backends
  • Overview
  • Quickstart
  • Examples
  • Your own CI
  • Your own scaffolding
  • Custom validator
  • Apply hook
  • Reference
  • Overview
  • Architecture
  • GCP (BigQuery)
  • AWS (S3 + Athena)
  • Snowflake
  • Local (DuckDB)
  • Custom Providers
  • Roadmap
GitHub
Why Forge
Concepts
Get Started
  • Consume a Data Product
  • See it run
  • Demos
  • Local (DuckDB)
  • Source-Aligned (Postgres → DuckDB)
  • AI Forge + Data Models
  • MCP Output Port — Serve to AI Agents
  • GCP (BigQuery)
  • Snowflake Team Collaboration
  • Declarative Airflow
  • Orchestration Export
  • Jenkins CI/CD
  • Universal Pipeline
  • 11-Stage Production Pipeline
  • Catalog Forge End-to-End
CLI Reference
  • Agent Policy (concept)
  • MCP Output Port — Serve to Agents
  • MCP deep-dive
  • AI-assisted authoring
  • LLM providers & backends
  • Overview
  • Quickstart
  • Examples
  • Your own CI
  • Your own scaffolding
  • Custom validator
  • Apply hook
  • Reference
  • Overview
  • Architecture
  • GCP (BigQuery)
  • AWS (S3 + Athena)
  • Snowflake
  • Local (DuckDB)
  • Custom Providers
  • Roadmap
GitHub
  • Introduction

    • Home
    • Why Fluid Forge
    • Getting Started
    • Snowflake Quickstart
    • See it run
    • Forge Data Model
    • Vision & Roadmap
    • Playground
    • FAQ
  • Concepts

    • Concepts
    • Builds, Exposes, Bindings
    • What is a contract?
    • Quality, SLAs & Lineage
    • Governance & Policy
    • Agent Policy (LLM/AI governance)
    • Providers vs Platforms
    • Fluid Forge vs alternatives
  • Data Products

    • Consume a Data Product
    • Product Types — SDP, ADP, CDP
  • Walkthroughs

    • Walkthrough: Local Development
    • Source-Aligned: Postgres → DuckDB → Parquet
    • AI Forge And Data-Model Journeys
    • Walkthrough: MCP Output Port
    • Walkthrough: Deploy to Google Cloud Platform
    • Walkthrough: Snowflake Team Collaboration
    • Declarative Airflow DAG Generation - The FLUID Way
    • Generating Orchestration Code from Contracts
    • Jenkins CI/CD for FLUID Data Products
    • Universal Pipeline
    • The 11-Stage Pipeline
    • End-to-End Walkthrough: Catalog → Contract → Transformation
  • CLI Reference

    • CLI Reference
    • Core workflow

      • fluid init
      • fluid demo
      • fluid forge
      • fluid validate
      • fluid plan
      • fluid apply
      • fluid diff
      • fluid status
    • Build & ship

      • fluid bundle
      • fluid generate
      • fluid generate artifacts
      • fluid validate-artifacts
      • fluid verify-signature
      • fluid generate iac
      • fluid generate-airflow
      • fluid generate-pipeline
      • fluid generate vector
      • fluid viz-graph
      • fluid publish
      • fluid ship
      • fluid rollback
      • fluid schedule-sync
    • AI & Agents

      • fluid ai
      • fluid agents
      • fluid mission
      • fluid mcp
      • fluid memory
      • fluid stats
      • fluid skills
    • Quality & governance

      • fluid test
      • fluid verify
      • fluid contract-tests
      • fluid contract-validation
      • fluid policy
      • fluid policy check
      • fluid policy compile
      • fluid policy apply
    • Standards & interoperability

      • fluid odps
      • fluid odps-bitol
      • fluid odcs
      • fluid export
      • fluid export-odps
      • fluid exporters
      • fluid import
      • fluid market
      • fluid datamesh-manager
    • Project & workspace

      • fluid product-new
      • fluid product-add
      • fluid workspace
      • fluid contract
      • fluid split
      • fluid config
      • fluid providers
      • fluid plugins
      • fluid provider-init
      • fluid auth
      • fluid secrets
      • fluid ide
      • fluid scaffold-ci
      • fluid scaffold-composer
      • fluid scaffold-ide
      • fluid docs
      • fluid runs
      • fluid retention
      • fluid describe
      • fluid doctor
      • fluid roadmap
      • fluid version
    • Catalog adapters

      • Source Catalog Integration (V1.5)
      • Publishing to a Catalog — Overview
      • BigQuery Catalog
      • Snowflake Horizon Catalog
      • Databricks Unity Catalog
      • Google Dataplex Catalog
      • AWS Glue Data Catalog
      • DataHub Catalog
      • Data Mesh Manager Catalog
      • OpenMetadata Catalog
    • CLI by task

      • CLI by task
      • Add quality rules
      • Add agent governance
      • Debug a failed pipeline run
      • Switch clouds with one line
  • Recipes

    • Recipes
    • Recipe — add a quality rule
    • Recipe — switch clouds with one line
    • Recipe — tag PII in your schema
    • Write a contract that consumes another contract
    • Generate per-environment overlays
  • SDK & Plugins

    • SDK & Plugins
    • Quickstart — your first plugin
    • Examples

      • Runnable examples
      • Example: hello-scaffold — the minimal viable plugin
      • Example: gitlab-ci-scaffold — generate a complete CI project
      • Example: steward-validator — a custom governance rule
      • Example: prod-key-guard — apply-time invariant check
    • Journeys

      • Journeys
      • Your own CI/CD

        • You have your own CI/CD setup, no problem
        • GitLab CI — the bundle template
        • GitHub Actions — the bundle template
        • Jenkins — the bundle template
        • CircleCI — the bundle template
      • You have a strict project layout, no problem
      • You have governance rules, no problem
      • You want a check at apply time, no problem
    • Reference

      • Reference
      • Roles reference
      • Entry points reference
      • Trust model
      • Packaging
      • Companion packages
  • Providers

    • Providers
    • Provider Architecture
    • GCP Provider
    • AWS Provider
    • Snowflake Provider
    • Local Provider
    • Creating Custom Providers
    • Provider Roadmap
  • AI & Agents

    • MCP Server
    • Built-in And Custom Forge Guidance
    • Forge Discovery Guide
    • Forge Memory Guide
    • Authoring Forge Tools
    • Guided fluid forge UX
    • LLM Providers
    • LiteLLM Backend
    • Capability Warnings
    • Cost Tracking
    • FLUID Forge Contract GPT Packet
    • Agentic Primitives
  • Operate & Deploy

    • Operating in CI
    • Production Troubleshooting
    • Airflow Integration
    • Blueprints
    • Source-Aligned Acquisition
  • Govern & Secure

    • Governance, Compliance & the Business Case
    • Governance & Compliance
    • Network Safety
    • Credential Resolver — Security Model
  • Configuration & Reference

    • Environment Variables
    • Typed Errors
    • Typed CLI Errors
    • API Stability — fluid_build.api
  • Architecture & Releases

    • V1.5 Catalog Integration — Architecture Deep-Dive
    • V1.5 + V2 Hardening — Release Notes
  • Project

    • Contributing to Fluid Forge
    • Fluid Forge Docs Baseline: CLI 0.14.0
    • Fluid Forge Docs Baseline: CLI 0.13.0
    • Fluid Forge Docs Baseline: CLI 0.12.0
    • Fluid Forge Docs Baseline: CLI 0.11.0
    • Fluid Forge Docs Baseline: CLI 0.10.0
    • Fluid Forge Docs Baseline: CLI 0.9.0
    • Fluid Forge Docs Baseline: CLI 0.8.11
    • Fluid Forge Docs Baseline: CLI 0.8.10
    • Fluid Forge Docs Baseline: CLI 0.8.9
    • Fluid Forge Docs Baseline: CLI 0.8.8
    • Fluid Forge Docs Baseline: CLI 0.8.7
    • Fluid Forge Docs Baseline: CLI 0.8.6
    • Fluid Forge Docs Baseline: CLI 0.8.5
    • Fluid Forge Docs Baseline: CLI 0.8.4
    • Fluid Forge Docs Baseline: CLI 0.8.3
    • Fluid Forge Docs Baseline: CLI 0.8.0
    • Fluid Forge Docs Baseline: CLI 0.7.11
    • Fluid Forge Docs Baseline: CLI 0.7.9
    • Fluid Forge v0.7.1 - Multi-Provider Export Release

Production Troubleshooting

Symptom → diagnosis → fix runbook for fluid pipelines in production. Everything on this page is verified against CLI v0.11.0.

First responder

Start every incident with fluid doctor. It checks infrastructure, feature availability, copilot readiness, and the active state-store backend in one pass — and --env dumps every recognised FLUID_* kill switch with its current value.

First responder: fluid doctor

InvocationWhat you get
fluid doctorBase infrastructure + feature checks
fluid doctor --envEvery recognised FLUID_* runtime kill switch: current value, default, one-line description
fluid doctor --jsonMachine-readable output for tickets and dashboards
fluid doctor --extendedComprehensive checks (slower)
fluid doctor --scope <area>Acquisition-stack scoped checks
fluid doctor --out-dir runtime/diagWhere the diagnostic bundle is written (default runtime/diag)

Attach the --json output and the diagnostic bundle to any escalation.

Plan-binding rejections

Symptom: fluid apply refuses to run with a PlanBindingError before any DDL executes.

Each error carries a stable kind tag — a distinct, greppable CI event:

kindDiagnosisFix
bundle-mismatchThe plan's bundleDigest disagrees with the bundle on disk — the bundle was swapped after plan ran, or the contract was re-bundled without re-planningRe-run fluid bundle then fluid plan, and apply the fresh pair
plan-tamperThe plan's planDigest disagrees with the recomputed digest — plan.json was edited between stages 6 and 7 (a missing/empty planDigest is treated the same)Never hand-edit plan.json; regenerate with fluid plan
bundle-missingThe plan carries a bundleDigest but no bundle was supplied or auto-discovered — the gate fails closed rather than silently skippingPass --bundle <path-to-tgz> or restore the sibling .tgz
bundle-manifest-missing / bundle-manifest-invalidThe tgz has no MANIFEST.json, or its per-file SHAs / merkle root don't verify (truncated or corrupted archive)Re-run fluid bundle --format tgz
bundle-merkle-mismatchThe merkle root recomputed from the bundle's raw bytes disagrees with the root declared in its MANIFEST.jsonSame — rebuild the bundle; treat as possible tampering
binding-mode-missing / binding-mode-invalid / binding-mode-mismatchThe plan's bindingMode field is absent, unrecognised, or contradicts the presence of bundleDigest (e.g. bundleDigest stripped to dodge the bundle check)Regenerate via fluid plan — the plan came from an older CLI or was edited

--no-verify-plan-binding is a DR hatch, not a fix

When the bundle is genuinely unrecoverable (disaster recovery from partial artifacts), fluid apply --no-verify-plan-binding skips the verification — and logs at WARNING so the audit trail records it. If you reach for it during routine operations, the actual fix is regenerating the bundle+plan pair. The federation upstream-digest gate has its own separate hatch, --no-verify-federation.

Apply data-loss gate

Symptom: apply aborts telling you to re-run with --allow-data-loss.

SituationDiagnosisFix
--mode replace / replace-and-build outside dev, or the target has rowsThe destructive-modes gate: replace modes require an explicit --allow-data-loss acknowledgementConfirm the target really should be rebuilt, then re-run with --allow-data-loss. A pre-replace snapshot is taken, so fluid rollback can restore it
OpenTofu apply blocked with an opentofu_data_loss_gate eventThe IaC plan wants to destroy resources that hold dataSame override. The bypass emits an audit-trail WARNING plus a structured opentofu_destructive_gate_override event — search your logs for that tag when auditing who overrode the gate
Apply refuses due to a plan/apply mode mismatchThe plan was generated for a different --mode than apply was invoked withRe-run fluid plan --mode <mode> matching the intended apply mode

Build and run failures

Symptom: an acquisition build failed, or produced unexpected output.

Work the run-record surface under the state root (./.fluid by default; override with --state-root):

fluid runs status <product_id> --last 5             # recent runs of a product
fluid runs status <product_id> --build <build_id>   # pin a specific build
fluid runs logs <product_id> --component build      # component: build|infra|server|worker|dlq
fluid runs logs <product_id> --run-id <id> --grep ERROR --limit 200
fluid runs diff <product_id> --build <b> --run-a <baseline> --run-b <comparison>

runs diff reports the schema + row-count delta between two runs — the fastest way to confirm whether a failure changed the data shape or just the run status. All three verbs accept --json.

Cursor rewind and replay-pending markers

Symptom: a file appears at .fluid/<product_id>/runtime/replay-pending.json.

An upstream source-aligned product's cursor moved backward (a reprocess), and the runners marked every downstream product that consumes[] it as dirty — "loud drift" instead of a silently stale downstream. The marker records what happened:

{
  "upstream_product_id": "bronze.crm.customers",
  "upstream_build_id": "main_build",
  "old_cursor_value": "2026-04-30T00:00:00Z",
  "new_cursor_value": "2026-04-15T00:00:00Z",
  "detected_at": "2026-05-02T12:30:00Z",
  "reason": "upstream cursor rewound 15 days"
}

Fix: re-run the marked downstream product's build so it re-reads the rewound window, then delete the marker file. Leaving the marker in place is harmless to execution but means your team loses the drift signal for the next rewind.

Secrets and credentials

SymptomDiagnosisFix
SecretResolutionError at apply/build timeA ${SECRET:...} reference couldn't be resolved from the backendfluid secrets verify <ref> to confirm the ref exists; printf '%s' "$VALUE" | fluid secrets login <ref> to (re)store it. Values are read from stdin or an interactive prompt only — never argv
A stored secret is stale or leakedRotation neededprintf '%s' "$NEW" | fluid secrets rotate <ref> (supports --expires-at <ISO-8601>)
CredentialError: "Encrypted credential store … cannot be decrypted with the current key"The Fernet key at the recorded key path no longer matches the ciphertext — the key was regenerated, or the store was copied from another host. The store is deliberately not wiped: the ciphertext is still recoverable with the original keyBack up first (cp <store> <store>.bak), then either restore the original key, or supply it via FLUID_ENCRYPTION_KEY / FLUID_ENCRYPTION_PASSPHRASE, or — accepting the loss — remove the store and re-enter credentials

OpenTofu failures

SymptomDiagnosisFix
"tofu X.Y.Z is older than the required minimum 1.6.0"The runner has an outdated tofu (or only terraform) on PATHUpgrade from opentofu.org, or let the CLI provision a pinned, SHA-256-verified build: fluid apply --ensure-opentofu
`tofu apply` exceeded the 1800s wall-clock limit (exit code 124)A large first apply (or a hung provider call) hit the per-subprocess timeoutRaise FLUID_TOFU_TIMEOUT_SECONDS; if it recurs on a small change set, investigate provider-side throttling instead of raising the cap further
Apply blocked before tofu apply with a plan-binding errorSame integrity gate as the native engine — the OpenTofu path re-verifies plan.json digests tooSee plan-binding rejections

LLM / copilot authentication failures

Symptom: an LLM-driven command (e.g. fluid forge) fails with a 401 / invalid-key error, typically right after a provider key rotation.

fluid ai status      # which provider + model + key source is configured
fluid ai test        # quick connectivity test against the configured provider
fluid ai test --provider anthropic --model <model>   # test an override before saving it
fluid ai setup       # re-run setup to store the rotated key

Update the key at whichever source fluid ai status reports — the provider env var (OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, …) or the stored configuration — then confirm with fluid ai test. See LLM providers & backends for the resolution order.

Where logs live

SettingEffect
FLUID_LOG_FILE=<path> (or --log-file)Write logs to a file in addition to stderr
FLUID_LOG_FORMAT=jsonStructured JSON logs — the right setting for shipping to a log aggregator
FLUID_LOG_LEVEL=DEBUGVerbose logging (credential-bearing values are redacted by the logging filter)
fluid runs logs …Per-component run logs from the ./.fluid state root
fluid doctor --out-dir runtime/diagDiagnostic bundle location

Retention sweep

Run-state accumulates under the state root; sweep it on a schedule:

fluid retention sweep                     # sweep ./.fluid with a structured summary
fluid retention sweep --state-root /data/pipelines/.fluid --json

If a replay is later requested past the swept horizon it fails with StaleReplayError (the manifest is gone) — see Typed CLI Errors. Balance the sweep cadence against how far back you realistically replay.

See also

  • Operating in CI — the pipeline these failures occur in
  • Typed CLI Errors — the 15-class error catalog and exit codes
  • fluid doctor / fluid runs / fluid retention / fluid secrets — command references
  • fluid rollback — restoring a pre-replace snapshot
  • Environment variables — the canonical FLUID_* index
Edit this page on GitHub
Last Updated: 7/18/26, 7:43 AM
Contributors: fas89
Prev
Operating in CI
Next
Airflow Integration