mmodarre/lakehouse_plumber/lhp

Claude Code and agent skill by mmodarre/lakehouse_plumber

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Build, configure, debug and maintain Lakehouse Plumber (LHP) projects for Databricks Lakeflow Spark Declarative Pipelines. Use for LHP YAML, flowgroups, CLI commands, project setup, feature explanations, validation, generation, deployment and troubleshooting. Includes offline technical references. Guided courses and learner exercises belong to the separate lhp-learn skill; do not start lessons during ordinary development work.

Install

npx vskill@latest install mmodarre/lakehouse_plumber/lhp

SKILL.md

Lakehouse Plumber (LHP)

Modern YAML-driven ETL framework for Databricks Lakeflow Spark Declarative Pipelines.

Use the technical references bundled with this installed release. Read only those needed for the current development task. Website access is optional. Complete the requested work and explain relevant decisions; do not introduce course checkpoints.

For environment installation, use setup.md.

Before You Start (read this first)

  • Reuse before authoring. On any "create a flowgroup / pipeline / ingestion" request, scan templates/ and blueprints/ first. If an existing template (one parameterised flowgroup) or blueprint (a whole-flowgroup pattern repeated per site/region/tenant) already fits, reuse it via use_template: / use_blueprint: when it matches the request. Ask only if the choice is ambiguous or changes the requested behaviour. Only author fresh YAML when nothing fits.
  • Write-target rule of thumb: incremental/append/streaming ingest → streaming_table; full recompute, joins, aggregations, or dimensional rebuilds → materialized_view.
  • New project from scratch? Load quickstart.md for the init → lhp.yaml/substitutions/pipeline_config → validate → generate path.
  • Common mistakes to avoid:
  • Deprecated {token} braces — always ${token} (only %{local_var} uses non-$ braces).
  • Missing stream(view) wrapper in a SQL transform that reads a streaming source.
  • Secrets inline in YAML — always ${secret:scope/key}.
  • operational_metadata at the write level — apply it at the load/transform (action) level.
  • Suggesting lhp show (removed) or lhp deps / --force (deprecated). Use lhp dag, lhp diff; every generate is a full regenerate.
Read Project Context

Read the user's existing project files before generating new configurations:

  1. lhp.yaml — project config, operational metadata definitions
  2. substitutions/ — environment tokens and secret scopes
  3. presets/ — reusable defaults (action-type config)
  4. templates/ — reusable action patterns (one parameterised flowgroup)
  5. blueprints/ — reusable whole-flowgroup patterns, instantiated per site/region/tenant
  6. Existing pipelines/ YAML files — match naming/structure conventions

Core Architecture

Three main actions: Load, Transform, Write.
- Load: Load data from a source into a view.
- Transform: Transform data in a view into a new view.
- Write: Write data from a view into a table or sink.
One auxiliary action: Test.
- Test: For testing only in test environment using expectations.
  • Pipeline: Logical grouping; generated files organized by pipeline name. All files in a pipeline run in a single Spark Declarative Pipeline.
  • FlowGroup: One source entity; becomes one Python file. A flowgroup is a logical grouping of actions.
  • Action: Individual operation (load, transform, write, test)
Minimal FlowGroup
yaml
pipeline: <pipeline_name>
flowgroup: <flowgroup_name>
actions:
- name: <action_name>
type: load
readMode: stream # stream or batch
source:
type: cloudfiles # cloudfiles|delta|sql|jdbc|python|kafka|custom_datasource
path: "${landing_volume}/folder/*.csv"
format: csv
target: v_raw_data
- name: transform_data
type: transform
transform_type: sql # sql|python|schema|data_quality|temp_table
source: v_raw_data
target: v_cleaned
sql: |
SELECT * FROM stream(v_raw_data)
- name: write_table
type: write
source: v_cleaned
write_target:
type: streaming_table # streaming_table|materialized_view
database: "${catalog}.${schema}"
table: "my_table"
Substitution Syntax (Processing Order)
OrderSyntaxType
1st%{var}Local variable (flowgroup-scoped)
2nd{{ param }}Template parameter (Jinja2)
3rd${token}Environment substitution (bare {token} is deprecated, LHP-DEPR-001)
4th${secret:scope/key}Secret -> dbutils.secrets.get()

Template and Flowgroup Naming Conventions

When creating reusable templates:

Template Files: TMPL<number>_<source_type>_<function>.yaml

  • <number>: Sequential identifier (001, 002, etc.)
  • <source_type>: Source type from the load action (delta, cloudfiles, jdbc, kafka, sql, etc.)
  • <function>: What the template does (scd2, bronze, incremental, etc.)
  • Examples:
  • TMPL001_delta_scd2.yaml - SCD Type 2 from Delta source
  • TMPL002_cloudfiles_bronze.yaml - Bronze ingestion from CloudFiles
  • TMPL003_jdbc_incremental.yaml - Incremental load from JDBC

Flowgroups Using Templates: <domain>_<final_table>_TMPL<number>

  • <domain>: Business domain or subject area (billing, orders, customers, etc.)
  • <final_table>: The final target table name
  • TMPL<number>: Template number being used (must match template file)
  • Examples:
  • billing_invoice_TMPL001 - Uses TMPL001 for invoice table
  • orders_customer_TMPL002 - Uses TMPL002 for customer table
  • analytics_fact_sales_TMPL003 - Uses TMPL003 for fact_sales table

Quick Reference: Action Types

Each sub-type has its own leaf reference file. Load only the one(s) you need.

ActionSub-typeReference
Loadcloudfilesactions-load-cloudfiles.md
Loaddeltaactions-load-delta.md
Loadsqlactions-load-sql.md
Loadpythonactions-load-python.md
Loadjdbcactions-load-jdbc.md
Loadcustom_datasourceactions-load-custom-datasource.md
Loadkafkaactions-load-kafka.md
Transformsql (stream(view) for streaming)actions-transform-sql.md
Transformpythonactions-transform-python.md
Transformdata_qualityactions-transform-data-quality.md
Transformtemp_tableactions-transform-temp-table.md
Transformschemaactions-transform-schema.md
Writestreaming_table (standard)actions-write-streaming-table-standard.md
Writestreaming_table mode: cdc (cdc_config)actions-write-streaming-table-cdc.md
Writestreaming_table mode: snapshot_cdcactions-write-streaming-table-snapshot-cdc.md
Writestreaming_table mode: replace (REPLACE USING, replace_config)actions-write-streaming-table-replace.md
Writestreaming_table mode: replace_where (REPLACE WHERE, replace_where_config)actions-write-streaming-table-replace-where.md
Writematerialized_viewactions-write-materialized-view.md
Writesink (delta)actions-write-sink-delta.md
Writesink (kafka)actions-write-sink-kafka.md
Writesink (Azure Event Hubs, via Kafka)actions-write-sink-eventhubs.md
Writesink (custom)actions-write-sink-custom.md
Writesink (foreachbatch)actions-write-sink-foreachbatch.md
Testrow_count (--include-tests needed)actions-test-row-count.md
Testuniquenessactions-test-uniqueness.md
Testreferential_integrityactions-test-referential-integrity.md
Testcompletenessactions-test-completeness.md
Testrangeactions-test-range.md
Testschema_matchactions-test-schema-match.md
Testall_lookups_foundactions-test-all-lookups-found.md
Testcustom_sqlactions-test-custom-sql.md
Testcustom_expectationsactions-test-custom-expectations.md
Monitoringevent_log, monitoring in lhp.yamlmonitoring.md

Key Rules

  1. `stream(view_name)` required in SQL transforms reading from streaming sources
  2. CloudFiles `_metadata.*` columns only available in views, not downstream transforms
  3. Preset lists are replaced, not merged; nested dicts are deep-merged
  4. All-or-nothing job_name: if any flowgroup has job_name, all must have it
  5. Never put secrets in YAML values — always use ${secret:scope/key}
  6. Validate before generating: lhp validate --env <env>
  7. `readMode: stream` -> spark.readStream, `batch` -> spark.read
  8. Monitoring requires event_log — monitoring: {} won't work without event_log section
  9. `catalog` and `schema` are REQUIRED in `pipeline_config.yaml` — set them per-pipeline or in a top-level project_defaults block. Missing either fails generation. See project-config.md.
  10. `resources/lhp/` is exclusively managed by LHP — every lhp generate wipes it and rewrites it. Place custom resource YAMLs (hand-written jobs, dashboards, secret scopes) under resources/ at the top level or any non-lhp subdirectory.
  11. Every `lhp generate` is a full regenerate — there is no incremental mode and no --force flag (it was removed and is a no-op). Never suggest --force.

Best Practice Defaults (apply unless the user overrides)

These defaults reflect LHP's published enterprise best practices. Load best-practices.md for full rules and rationale.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
67
Repository forks
15
7-day trend score
0

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/mmodarre/lakehouse_plumber/lhp/badge)](https://verified-skill.com/skills/mmodarre/lakehouse_plumber/lhp)

Something wrong with this skill or its page? Tell us.