Fluid Forge Docs Baseline: CLI 0.8.8
Release Date: May 31, 2026 Status: Superseded by 0.8.9 (supersedes 0.8.7)
Headline
0.8.8 delivers two headline improvements: an on-demand OpenTofu provisioner — fluid apply --ensure-opentofu downloads a pinned, SHA-256-verified tofu using only the Python standard library (no root, gpg, cosign, curl, or unzip), so cloud applies finally run on locked-down / non-root CI runners (a non-root Jenkins agent is the canonical case); and a real fluid market — catalog discovery now runs over MCP against DataHub, OpenMetadata, and Data Mesh Manager (replacing the previous demo data), with two-phase metadata enrichment and offline blueprints. No schema change vs 0.8.7 (contract schema stays at fluidVersion 0.7.4).
Who should upgrade
Anyone running fluid apply against AWS / GCP / Snowflake from CI — especially non-root runners that previously failed with opentofu_engine_no_tofu. Also anyone using fluid market against a real DataHub / OpenMetadata / Data Mesh Manager catalog.
What changed in v0.8.8
Added
On-demand OpenTofu provisioner —
fluid apply --ensure-opentofu. Cloud applies (AWS / GCP / Snowflake) run through the OpenTofu engine, which shells out totofu. The official standalone installer needs root (/usr/local/bin) and gpg/cosign to verify — which a non-root CI agent can't provide, so generated cloud-apply pipelines failed on a fresh runner withopentofu_engine_no_tofu. When--ensure-opentofuis set andtofuis missing, FLUID downloads the pinned OpenTofu release zip + itsSHA256SUMSover TLS, verifies the SHA-256 before extracting, extracts only thetofuentry (no zip-slip), installs it to a writable dir (the console-scripts dir, else~/.cache/fluid), and prepends it to the processPATH. It uses only the Python standard library — no root, gpg, cosign, curl, or unzip — and is idempotent (a usabletofuat/above the engine's version floor is left untouched, so a pre-baked runner image still wins). Override the pinned version withFLUID_OPENTOFU_VERSION.# provision tofu on demand if it's missing, then apply fluid apply runtime/plan.json --ensure-opentofu --yesfluid generate cibakes--ensure-opentofuinto the apply stage of all seven CI runners (Jenkins, GitHub Actions, GitLab, Azure DevOps, Bitbucket, CircleCI, Tekton). The flag is idempotent and a no-op for native /localapplies that never touch the OpenTofu engine.fluid marketreal catalog discovery over MCP — DataHub, OpenMetadata, and Data Mesh Manager, replacing the previous demo data.fluid marketmetadata enrichment — a two-phase fetch surfaces full product detail plus data-asset column schema;--detailedis now a true superset of the listing rather than a replacement.fluid marketonboarding + trust/usage surfacing — actionable next steps and trust / usage signals in the listing.fluid market --blueprintsworks offline via bundled blueprints.
Changed
fluid marketno longer serves fabricated demo data for roadmap-only catalog connectors (datahub / glue / data-catalog / rest); they are skipped with a clear roadmap note.fluid market --format jsonemits clean, machine-parseable output.- Faster CLI startup — validation providers are lazy-loaded.
Fixed
- Generated dev-source Jenkins pipelines could not call
fluid. The dev-source bootstrap ranpip uninstall -y data-product-forge— deleting thefluidconsole script (the package's entry point) — then invokedfluidrelying only onPYTHONPATH, so stage 0 died withfluid: not found. The bootstrap now keeps the installed console script (aPYTHONPATHprepend already shadows its modules with the bind-mounted checkout) and sanity-checks the import. - Generated Jenkins
policy-applystage emitted an empty--modeon the first build (before the param is injected), whichfluid policy-applyrejected; it now defaults toenforce. fluid forge --from-sourcesanitizes the contract id derived from a sqlite file path.- build-runners now warn when an inline-SQL build declares
engine: dbt(previously silently ignored). fluid policy-applysurfaces a no-op message when a provider has no policy applier instead of appearing to succeed silently.fluid marketper-catalog MCP search-limit param corrected (OpenMetadatasize, DataHubnum_results), and the command raises a proper error instead of crashing with aTypeError.
Removed
- Dead, never-wired-in modules:
fluid_build/validation.pyand the unused SQL-allowlist helpers (parse_and_allowlist_sql+ type/language validators).
Security
- Re-symmetrized the Snowflake provider-local secret redactor with the global logging filter so new secret shapes are masked in both layers.
Upgrade
pip install --upgrade "data-product-forge==0.8.8"
Contracts need no changes — contract schema stays at fluidVersion 0.7.4, unchanged from 0.8.7.