monte-carlo-validation-notebook
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTip: This skill works well with Sonnet. Runbefore invoking for faster generation./model sonnet
Generate a SQL Notebook with validation queries for dbt changes.
Arguments: $ARGUMENTS
提示: 此技能与Sonnet搭配使用效果最佳。调用前运行可加快生成速度。/model sonnet
为dbt变更生成包含验证查询的SQL笔记本。
参数: $ARGUMENTS
When to Use
使用场景
Use this skill when the user wants to validate dbt model or snapshot changes with Monte Carlo SQL Notebook queries, either from a GitHub PR or a local dbt repository.
Parse the arguments:
- Target (required): first argument — a GitHub PR URL or local dbt repo path
- MC Base URL (optional): — defaults to
--mc-base-url <URL>https://getmontecarlo.com - Models (optional): — comma-separated list of model filenames (without
--models <model1,model2,...>extension) to generate queries for. Only these models will be included. By default, all changed models are included up to a maximum of 10..sql
当用户希望通过Monte Carlo SQL Notebook查询验证dbt模型或快照变更时(无论是来自GitHub PR还是本地dbt仓库),均可使用此技能。
解析参数:
- 目标(必填):第一个参数 — GitHub PR URL或本地dbt仓库路径
- MC基础URL(可选):— 默认值为
--mc-base-url <URL>https://getmontecarlo.com - 模型(可选):— 逗号分隔的模型文件名列表(不含
--models <model1,model2,...>扩展名),仅为这些模型生成查询。默认情况下,最多包含10个变更模型。.sql
Setup
安装配置
Prerequisites:
- (GitHub CLI) — required for PR mode. Must be authenticated (
gh).gh auth status - — required for helper scripts.
python3 - — install with
pyyaml(orpip3 install pyyaml,pip install pyyaml, etc.)uv pip install pyyaml
Note: Generated SQL uses ANSI-compatible syntax that works across Snowflake, BigQuery, Redshift, and Athena. Minor adjustments may be needed for specific warehouse quirks.
This skill includes two helper scripts in :
${CLAUDE_PLUGIN_ROOT}/skills/monte-carlo-validation-notebook/scripts/- - Resolves dbt model output schemas from
resolve_dbt_schema.pyrouting rules and model config overrides.dbt_project.yml - - Encodes notebook YAML into a base64 import URL and opens it in the browser.
generate_notebook_url.py
前置条件:
- (GitHub CLI)—— PR模式必填。必须已完成认证(运行
gh检查)。gh auth status - —— 辅助脚本必填。
python3 - —— 通过
pyyaml(或pip3 install pyyaml、pip install pyyaml等)安装。uv pip install pyyaml
注意: 生成的SQL采用ANSI兼容语法,可在Snowflake、BigQuery、Redshift和Athena中运行。针对特定数据仓库的特性可能需要进行细微调整。
此技能在目录下包含两个辅助脚本:
${CLAUDE_PLUGIN_ROOT}/skills/monte-carlo-validation-notebook/scripts/- - 从
resolve_dbt_schema.py路由规则和模型配置覆盖中解析dbt模型输出Schema。dbt_project.yml - - 将笔记本YAML编码为base64导入URL并在浏览器中打开。
generate_notebook_url.py
Mode Detection
模式检测
Auto-detect mode from the target argument:
- If target looks like a URL (contains or
://) -> PR modegithub.com - If target is a path (,
., relative path) -> Local mode/path/to/repo
根据目标参数自动检测模式:
- 如果目标看起来是URL(包含或
://)→ PR模式github.com - 如果目标是路径(、
.、相对路径)→ 本地模式/path/to/repo
Context
背景信息
This command generates a SQL Notebook containing validation queries for dbt changes. The notebook can be opened in the MC Bridge SQL Notebook interface for interactive validation.
The output is an import URL that opens directly in the notebook interface:
<MC_BASE_URL>/notebooks/import#<base64-encoded-yaml>Key Features:
- Database Parameters: Two parameters (
textandprod_db) for selecting databasesdev_db - Schema Inference: Automatically infers schema per model from and model configs
dbt_project.yml - Single-table queries: Basic validation queries using
{{prod_db}}.<SCHEMA>.<TABLE> - Comparison queries: Before/after queries comparing vs
{{prod_db}}{{dev_db}} - Flexible usage: Users can set both parameters to the same database for single-database analysis
此命令为dbt变更生成包含验证查询的SQL笔记本。该笔记本可在MC Bridge SQL Notebook界面中打开,进行交互式验证。
输出为可直接在笔记本界面打开的导入URL:
<MC_BASE_URL>/notebooks/import#<base64-encoded-yaml>核心特性:
- 数据库参数:两个参数(
text和prod_db)用于选择数据库dev_db - Schema推断:自动从和模型配置中为每个模型推断Schema
dbt_project.yml - 单表查询:使用的基础验证查询
{{prod_db}}.<SCHEMA>.<TABLE> - 对比查询:对比与
{{prod_db}}的前后查询{{dev_db}} - 灵活使用:用户可将两个参数设置为同一数据库,进行单数据库分析
Notebook YAML Spec Reference
Notebook YAML规范参考
Key structure:
yaml
version: 1
metadata:
id: string # kebab-case + random suffix
name: string # display name
created_at: string # ISO 8601
updated_at: string # ISO 8601
default_context: # optional database/schema context
database: string
schema: string
cells:
- id: string
type: sql | markdown | parameter
content: string # SQL, markdown, or parameter config (JSON)
display_type: table | bar | timeseries核心结构:
yaml
version: 1
metadata:
id: string # kebab-case + 随机后缀
name: string # 显示名称
created_at: string # ISO 8601格式
updated_at: string # ISO 8601格式
default_context: # 可选的数据库/Schema上下文
database: string
schema: string
cells:
- id: string
type: sql | markdown | parameter
content: string # SQL、markdown或参数配置(JSON)
display_type: table | bar | timeseriesParameter Cell Spec
参数单元格规范
Parameter cells allow defining variables referenced in SQL via syntax:
{{param_name}}yaml
- id: param-prod-db
type: parameter
content:
name: prod_db # variable name
config:
type: text # free-form text input
default_value: "ANALYTICS"
placeholder: "Prod database"
display_type: tableParameter types:
- : Free-form text input (used for database names)
text - : Two dropdowns (database -> schema), value stored as
schema_selectorDATABASE.SCHEMA - : Select from predefined options
dropdown
参数单元格允许定义通过语法在SQL中引用的变量:
{{param_name}}yaml
- id: param-prod-db
type: parameter
content:
name: prod_db # 变量名
config:
type: text # 自由文本输入
default_value: "ANALYTICS"
placeholder: "Prod database"
display_type: table参数类型:
- :自由文本输入(用于数据库名称)
text - :两个下拉菜单(数据库→Schema),值存储为
schema_selectorDATABASE.SCHEMA - :从预定义选项中选择
dropdown
Task
任务
Generate a SQL Notebook with validation queries based on the mode and target.
根据模式和目标生成包含验证查询的SQL笔记本。
Phase 1: Get Changed Files
阶段1:获取变更文件
The approach differs based on mode:
方法因模式而异:
If PR mode (GitHub PR):
如果是PR模式(GitHub PR):
-
Extract the PR number and repo from the target URL.
- Example: -> owner=
https://github.com/monte-carlo-data/dbt/pull/3386, repo=monte-carlo-data, PR=dbt3386
- Example:
-
Fetch PR metadata using:
gh
bash
gh pr view <PR#> --repo <owner>/<repo> --json number,title,author,mergedAt,headRefOid- Fetch the list of changed files:
bash
gh pr view <PR#> --repo <owner>/<repo> --json files --jq '.files[].path'- Fetch the diff:
bash
gh pr diff <PR#> --repo <owner>/<repo>-
Filter the changed files list to onlyfiles under
.sqlormodels/directories (at any depth — e.g.,snapshots/,models/,analytics/models/). These are the dbt models to analyze. If no model SQL files were changed, report that and stop.dbt/models/ -
For each changed model file, fetch the full file content at the head SHA:
bash
gh api repos/<owner>/<repo>/contents/<file_path>?ref=<head_sha> --jq '.content' | python3 -c "import sys,base64; sys.stdout.write(base64.b64decode(sys.stdin.read()).decode())"- Fetch dbt_project.yml for schema resolution. Detect the dbt project root by looking at the changed file paths — find the common parent directory that contains . Try these paths in order until one succeeds:
dbt_project.yml
bash
gh api repos/<owner>/<repo>/contents/<dbt_root>/dbt_project.yml?ref=<head_sha> --jq '.content' | python3 -c "import sys,base64; sys.stdout.write(base64.b64decode(sys.stdin.read()).decode())"Common locations: , (repo root), , . Try each until found.
<dbt_root>analytics.dbttransformSave to .
dbt_project.yml/tmp/validation_notebook_working/<PR#>/dbt_project.yml-
从目标URL中提取PR编号和仓库信息。
- 示例:→ owner=
https://github.com/monte-carlo-data/dbt/pull/3386,repo=monte-carlo-data,PR=dbt3386
- 示例:
-
使用获取PR元数据:
gh
bash
gh pr view <PR#> --repo <owner>/<repo> --json number,title,author,mergedAt,headRefOid- 获取变更文件列表:
bash
gh pr view <PR#> --repo <owner>/<repo> --json files --jq '.files[].path'- 获取差异内容:
bash
gh pr diff <PR#> --repo <owner>/<repo>-
筛选变更文件列表,仅保留或
models/目录下的snapshots/文件(任意深度——例如.sql、models/、analytics/models/)。这些是需要分析的dbt模型。如果没有变更的模型SQL文件,报告此情况并停止。dbt/models/ -
对于每个变更的模型文件,获取head SHA对应的完整文件内容:
bash
gh api repos/<owner>/<repo>/contents/<file_path>?ref=<head_sha> --jq '.content' | python3 -c "import sys,base64; sys.stdout.write(base64.b64decode(sys.stdin.read()).decode())"- 获取dbt_project.yml用于Schema解析。通过变更文件路径检测dbt项目根目录——找到包含的公共父目录。按以下顺序尝试路径,直到找到为止:
dbt_project.yml
bash
gh api repos/<owner>/<repo>/contents/<dbt_root>/dbt_project.yml?ref=<head_sha> --jq '.content' | python3 -c "import sys,base64; sys.stdout.write(base64.b64decode(sys.stdin.read()).decode())"常见的位置:、(仓库根目录)、、。逐个尝试直到找到。
<dbt_root>analytics.dbttransform将保存到。
dbt_project.yml/tmp/validation_notebook_working/<PR#>/dbt_project.ymlIf Local mode (Local Directory):
如果是本地模式(本地目录):
-
Change to the target directory.
-
Get current branch info:
bash
git rev-parse --abbrev-ref HEAD-
Detect base branch - try,
main,masterin order, or use upstream tracking branch.develop -
Get the list of changed SQL files compared to base branch:
bash
git diff --name-only <base_branch>...HEAD -- '*.sql'-
Filter to onlyfiles under
.sqlormodels/directories (at any depth — e.g.,snapshots/,models/,analytics/models/). If no model SQL files were changed, report that and stop.dbt/models/ -
Get the diff for each changed file:
bash
git diff <base_branch>...HEAD -- <file_path>-
Read model files directly from the filesystem.
-
Find dbt_project.yml:
bash
find . -name "dbt_project.yml" -type f | head -1- For notebook metadata in local mode, use:
- ID:
local-<branch-name>-<timestamp> - Title:
Local: <branch-name> - Author: Output of
git config user.name - Merged: "N/A (local)"
- ID:
-
切换到目标目录。
-
获取当前分支信息:
bash
git rev-parse --abbrev-ref HEAD-
检测基础分支——依次尝试、
main、master,或使用上游跟踪分支。develop -
获取与基础分支相比变更的SQL文件列表:
bash
git diff --name-only <base_branch>...HEAD -- '*.sql'-
筛选仅保留或
models/目录下的snapshots/文件(任意深度——例如.sql、models/、analytics/models/)。如果没有变更的模型SQL文件,报告此情况并停止。dbt/models/ -
获取每个变更文件的差异:
bash
git diff <base_branch>...HEAD -- <file_path>-
直接从文件系统读取模型文件。
-
查找dbt_project.yml:
bash
find . -name "dbt_project.yml" -type f | head -1- 本地模式下的笔记本元数据使用:
- ID:
local-<branch-name>-<timestamp> - 标题:
Local: <branch-name> - 作者:的输出
git config user.name - 合并状态:"N/A (local)"
- ID:
Model Selection (applies to both modes)
模型选择(适用于两种模式)
After filtering to files under or :
.sqlmodels/snapshots/-
Ifwas specified: Filter the changed files list to only include models whose filename (without
--modelsextension, case-insensitive) matches one of the specified model names. If any specified model is not found in the changed files, warn the user but continue with the models that were found. If none match, report that and stop..sql -
Model cap: If more than 10 models remain after filtering, select the first 10 (by file path order) and warn the user:
⚠️ <total_count> models changed — generating validation queries for the first 10 only. To generate for specific models, re-run with: --models <model1,model2,...> Skipped models: <list of skipped model filenames>
筛选出或下的文件后:
models/snapshots/.sql-
如果指定了: 筛选变更文件列表,仅包含文件名(不含
--models扩展名,不区分大小写)与指定模型名称匹配的模型。如果任何指定模型未在变更文件中找到,向用户发出警告但继续处理找到的模型。如果没有匹配的模型,报告此情况并停止。.sql -
模型数量上限: 如果筛选后剩余模型超过10个,选择前10个(按文件路径顺序)并向用户发出警告:
⚠️ 共变更了<total_count>个模型——仅为前10个生成验证查询。 如需为特定模型生成,请重新运行:--models <model1,model2,...> 跳过的模型:<跳过的模型文件名列表>
Phase 2: Parse Changed Models
阶段2:解析变更模型
For EACH changed dbt model file, parse and extract:
.sql对于每个变更的dbt模型文件,解析并提取:
.sql2a. Model Metadata
2a. 模型元数据
Output table name -- Derive from file name:
- -> table is
<any_path>/models/<subdir>/<model_name>.sql(uppercase, taken from the filename)<MODEL_NAME>
Output schema -- Use the schema resolution script:
-
Setup: Saveand model files to
dbt_project.ymlpreserving paths:/tmp/validation_notebook_working/<id>//tmp/validation_notebook_working/<id>/ +-- dbt_project.yml +-- models/ +-- <path>/<model>.sql -
Run the script for each model:bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/monte-carlo-validation-notebook/scripts/resolve_dbt_schema.py /tmp/validation_notebook_working/<id>/dbt_project.yml /tmp/validation_notebook_working/<id>/models/<path>/<model>.sql -
Error handling: If the script fails, STOP immediately and report the error. Do NOT proceed with notebook generation if schema resolution fails.
-
Output: The script prints the resolved schema (e.g.,,
PROD,PROD_STAGE)PROD_LINEAGE
Note: Do NOT manually parse dbt_project.yml or model configs for schema -- always use the script. It handles model config overrides, dbt_project.yml routing rules, PROD_ prefix for custom schemas, and defaults to .
PRODConfig block -- Look for and extract:
{{ config(...) }}- -- 'table', 'view', 'incremental', 'ephemeral'
materialized - -- the dedup key (may be a string or list)
unique_key - -- clustering fields (may contain the time axis)
cluster_by
Core segmentation fields -- Scan the entire model SQL for fields likely to be business keys:
- Fields named (e.g.,
*_id,account_id,resource_id) that appear in JOIN ON, GROUP BY, PARTITION BY, ormonitor_idunique_key - Deduplicate and rank by frequency. Take the top 3.
Time axis field -- Detect the model's time dimension (in priority order):
- block: field used in the WHERE comparison
is_incremental() - config: timestamp/date fields
cluster_by - Field name conventions: ,
ingest_ts,created_time,date_part,timestamp,run_start_time,export_tsevent_created_time - ORDER BY DESC in QUALIFY/ROW_NUMBER
If no time axis is found, skip time-axis queries for this model.
输出表名 —— 从文件名推导:
- → 表名为
<any_path>/models/<subdir>/<model_name>.sql(大写,取自文件名)<MODEL_NAME>
输出Schema —— 使用Schema解析脚本:
-
设置:将和模型文件保存到
dbt_project.yml并保留路径:/tmp/validation_notebook_working/<id>//tmp/validation_notebook_working/<id>/ +-- dbt_project.yml +-- models/ +-- <path>/<model>.sql -
为每个模型运行脚本:bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/monte-carlo-validation-notebook/scripts/resolve_dbt_schema.py /tmp/validation_notebook_working/<id>/dbt_project.yml /tmp/validation_notebook_working/<id>/models/<path>/<model>.sql -
错误处理:如果脚本失败,立即停止并报告错误。如果Schema解析失败,请勿继续生成笔记本。
-
输出:脚本打印解析后的Schema(例如、
PROD、PROD_STAGE)PROD_LINEAGE
注意:请勿手动解析dbt_project.yml或模型配置来获取Schema——始终使用脚本。它会处理模型配置覆盖、dbt_project.yml路由规则、自定义Schema的PROD前缀,并默认使用。
PROD配置块 —— 查找并提取:
{{ config(...) }}- —— 'table'、'view'、'incremental'、'ephemeral'
materialized - —— 去重键(可能是字符串或列表)
unique_key - —— 聚类字段(可能包含时间轴)
cluster_by
核心分段字段 —— 扫描整个模型SQL,查找可能是业务键的字段:
- 命名为的字段(例如
*_id、account_id、resource_id),出现在JOIN ON、GROUP BY、PARTITION BY或monitor_id中unique_key - 去重并按频率排序。取前3个。
时间轴字段 —— 检测模型的时间维度(按优先级排序):
- 块:WHERE比较中使用的字段
is_incremental() - 配置:时间戳/日期字段
cluster_by - 字段命名惯例:、
ingest_ts、created_time、date_part、timestamp、run_start_time、export_tsevent_created_time - QUALIFY/ROW_NUMBER中的ORDER BY DESC
如果未找到时间轴,则跳过此模型的时间轴查询。
2b. Diff Analysis
2b. 差异分析
Parse the diff hunks for this file. Classify each changed line:
- Changed fields -- Lines added/modified in SELECT clauses or CTE definitions. Extract the output column name.
- Changed filters -- Lines added/modified in WHERE clauses.
- Changed joins -- Lines added/modified in JOIN ON conditions.
- Changed unique_key -- If in config was modified, note both old and new values.
unique_key - New columns -- Columns in "after" SELECT that don't appear in "before" (pure additions).
解析此文件的差异块。对每个变更行进行分类:
- 变更字段 —— SELECT子句或CTE定义中添加/修改的行。提取输出列名。
- 变更过滤器 —— WHERE子句中添加/修改的行。
- 变更连接 —— JOIN ON条件中添加/修改的行。
- 变更unique_key —— 如果配置中的被修改,记录新旧值。
unique_key - 新列 —— "after" SELECT中出现但"before"中没有的列(纯新增)。
2c. Model Classification
2c. 模型分类
Classify each model as new or modified based on the diff:
- If the diff for this file contains → classify as new
new file mode - Otherwise → classify as modified
This classification determines which query patterns are generated in Phase 3.
Note: For new models, Phase 2b diff analysis is skipped (there is no "before" to compare against). Phase 2a metadata extraction still applies.
根据差异将每个模型分类为新建或修改:
- 如果文件差异包含→ 分类为新建
new file mode - 否则 → 分类为修改
此分类决定了阶段3中生成的查询模式。
注意: 对于新建模型,跳过阶段2b的差异分析(没有"before"可对比)。阶段2a的元数据提取仍然适用。
Phase 3: Generate Validation Queries
阶段3:生成验证查询
For each changed model, generate the applicable queries based on its classification (new vs modified).
CRITICAL: Parameter Placeholder Syntax
Use double curly braces for parameter placeholders. Do NOT use or any other syntax.
{{...}}${...}Correct:
Wrong:
{{prod_db}}.PROD.AGENT_RUNS${prod_db}.PROD.AGENT_RUNSTable Reference Format:
- Use for prod queries
{{prod_db}}.<SCHEMA>.<TABLE_NAME> - Use for dev queries
{{dev_db}}.<SCHEMA>.<TABLE_NAME> - is hardcoded per-model using the output from the schema resolution script
<SCHEMA>
对于每个变更模型,根据其分类(新建/修改)生成适用的查询。
关键:参数占位符语法
使用双大括号 作为参数占位符。请勿使用或其他语法。
{{...}}${...}正确:
错误:
{{prod_db}}.PROD.AGENT_RUNS${prod_db}.PROD.AGENT_RUNS表引用格式:
- 生产环境查询使用
{{prod_db}}.<SCHEMA>.<TABLE_NAME> - 开发环境查询使用
{{dev_db}}.<SCHEMA>.<TABLE_NAME> - 是每个模型硬编码的,使用Schema解析脚本的输出
<SCHEMA>
Query Patterns for NEW Models
新建模型的查询模式
For new models, all queries target only. No comparison queries are generated since no prod table exists.
{{dev_db}}对于新建模型,所有查询仅针对。由于不存在生产环境表,不生成对比查询。
{{dev_db}}Pattern 7-new: Total Row Count
模式7-new:总行数
Trigger: Always.
sql
SELECT COUNT(*) AS total_rows
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>触发条件: 始终触发。
sql
SELECT COUNT(*) AS total_rows
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>Pattern 9: Sample Data Preview
模式9:样本数据预览
Trigger: Always.
sql
SELECT *
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
LIMIT 20触发条件: 始终触发。
sql
SELECT *
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
LIMIT 20Pattern 2-new: Core Segmentation Counts
模式2-new:核心分段计数
Trigger: Always.
sql
SELECT
<segmentation_field>,
COUNT(*) AS row_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <segmentation_field>
ORDER BY row_count DESC
LIMIT 100触发条件: 始终触发。
sql
SELECT
<segmentation_field>,
COUNT(*) AS row_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <segmentation_field>
ORDER BY row_count DESC
LIMIT 100Pattern 5: Uniqueness Check
模式5:唯一性检查
Trigger: Always for new models (verify unique_key constraint from the start).
sql
SELECT
COUNT(*) AS total_rows,
COUNT(DISTINCT <key_fields>) AS distinct_keys,
COUNT(*) - COUNT(DISTINCT <key_fields>) AS duplicate_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>sql
SELECT <key_fields>, COUNT(*) AS n
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <key_fields>
HAVING COUNT(*) > 1
ORDER BY n DESC
LIMIT 100触发条件: 新建模型始终触发(从一开始验证unique_key约束)。
sql
SELECT
COUNT(*) AS total_rows,
COUNT(DISTINCT <key_fields>) AS distinct_keys,
COUNT(*) - COUNT(DISTINCT <key_fields>) AS duplicate_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>sql
SELECT <key_fields>, COUNT(*) AS n
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <key_fields>
HAVING COUNT(*) > 1
ORDER BY n DESC
LIMIT 100Pattern 6-new: NULL Rate Check (all columns)
模式6-new:NULL率检查(所有列)
Trigger: Always. Checks all output columns since everything is new.
sql
SELECT
COUNT(*) AS total_rows,
SUM(CASE WHEN <col1> IS NULL THEN 1 ELSE 0 END) AS <col1>_null_count,
ROUND(100.0 * SUM(CASE WHEN <col1> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS <col1>_null_pct,
SUM(CASE WHEN <col2> IS NULL THEN 1 ELSE 0 END) AS <col2>_null_count,
ROUND(100.0 * SUM(CASE WHEN <col2> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS <col2>_null_pct
-- repeat for each output column
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>触发条件: 始终触发。检查所有输出列,因为一切都是新的。
sql
SELECT
COUNT(*) AS total_rows,
SUM(CASE WHEN <col1> IS NULL THEN 1 ELSE 0 END) AS <col1>_null_count,
ROUND(100.0 * SUM(CASE WHEN <col1> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS <col1>_null_pct,
SUM(CASE WHEN <col2> IS NULL THEN 1 ELSE 0 END) AS <col2>_null_count,
ROUND(100.0 * SUM(CASE WHEN <col2> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS <col2>_null_pct
-- 为每个输出列重复上述内容
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>Pattern 8: Time-Axis Continuity
模式8:时间轴连续性
Trigger: Model is OR a time axis field was identified.
materialized='incremental'sql
SELECT
CAST(<time_axis> AS DATE) AS day,
COUNT(*) AS row_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
WHERE <time_axis> >= CURRENT_TIMESTAMP - INTERVAL '14' DAY
GROUP BY day
ORDER BY day DESC
LIMIT 30触发条件: 模型的或识别到时间轴字段。
materialized='incremental'sql
SELECT
CAST(<time_axis> AS DATE) AS day,
COUNT(*) AS row_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
WHERE <time_axis> >= CURRENT_TIMESTAMP - INTERVAL '14' DAY
GROUP BY day
ORDER BY day DESC
LIMIT 30Query Patterns for MODIFIED Models
修改模型的查询模式
For modified models, single-table queries use and comparison queries use both.
{{prod_db}}对于修改模型,单表查询使用,对比查询同时使用两者。
{{prod_db}}Pattern 7: Total Row Count
模式7:总行数
Trigger: Always.
sql
SELECT COUNT(*) AS total_rows
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>触发条件: 始终触发。
sql
SELECT COUNT(*) AS total_rows
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>Pattern 9: Sample Data Preview
模式9:样本数据预览
Trigger: Always.
sql
SELECT *
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
LIMIT 20触发条件: 始终触发。
sql
SELECT *
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
LIMIT 20Pattern 2: Core Segmentation Counts
模式2:核心分段计数
Trigger: Always.
sql
SELECT
<segmentation_field>,
COUNT(*) AS row_count
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <segmentation_field>
ORDER BY row_count DESC
LIMIT 100触发条件: 始终触发。
sql
SELECT
<segmentation_field>,
COUNT(*) AS row_count
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <segmentation_field>
ORDER BY row_count DESC
LIMIT 100Pattern 1: Changed Field Distribution
模式1:变更字段分布
Trigger: Changed fields found in Phase 2b. Exclude added columns (from "New columns" in Phase 2b) — only include fields that exist in prod.
sql
SELECT
<changed_field>,
COUNT(*) AS row_count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) AS pct
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <changed_field>
ORDER BY row_count DESC
LIMIT 100触发条件: 阶段2b中发现变更字段。排除新增列(阶段2b中的"新列")——仅包含生产环境中已存在的字段。
sql
SELECT
<changed_field>,
COUNT(*) AS row_count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) AS pct
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <changed_field>
ORDER BY row_count DESC
LIMIT 100Pattern 5: Uniqueness Check
模式5:唯一性检查
Trigger: JOIN condition changed, changed, or model is incremental.
unique_keysql
SELECT
COUNT(*) AS total_rows,
COUNT(DISTINCT <key_fields>) AS distinct_keys,
COUNT(*) - COUNT(DISTINCT <key_fields>) AS duplicate_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>sql
SELECT <key_fields>, COUNT(*) AS n
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <key_fields>
HAVING COUNT(*) > 1
ORDER BY n DESC
LIMIT 100触发条件: JOIN条件变更、变更,或模型为增量模型。
unique_keysql
SELECT
COUNT(*) AS total_rows,
COUNT(DISTINCT <key_fields>) AS distinct_keys,
COUNT(*) - COUNT(DISTINCT <key_fields>) AS duplicate_count
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>sql
SELECT <key_fields>, COUNT(*) AS n
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <key_fields>
HAVING COUNT(*) > 1
ORDER BY n DESC
LIMIT 100Pattern 6: NULL Rate Check
模式6:NULL率检查
Trigger: New column added, or column wrapped in COALESCE/NULLIF.
Important: Added columns (from "New columns" in Phase 2b) do NOT exist in prod yet. For added columns, query only. For modified columns (COALESCE/NULLIF changes), compare both databases.
{{dev_db}}For added columns (dev only):
sql
SELECT
COUNT(*) AS total_rows,
SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS null_pct
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>For modified columns (prod vs dev):
sql
SELECT
'prod' AS source,
COUNT(*) AS total_rows,
SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS null_pct
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
UNION ALL
SELECT
'dev' AS source,
COUNT(*) AS total_rows,
SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS null_pct
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>触发条件: 添加新列,或列被COALESCE/NULLIF包裹。
重要提示: 新增列(阶段2b中的"新列")在生产环境中尚不存在。对于新增列,仅查询。对于修改的列(COALESCE/NULLIF变更),对比两个数据库。
{{dev_db}}新增列(仅开发环境):
sql
SELECT
COUNT(*) AS total_rows,
SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS null_pct
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>修改列(生产环境vs开发环境):
sql
SELECT
'prod' AS source,
COUNT(*) AS total_rows,
SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS null_pct
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
UNION ALL
SELECT
'dev' AS source,
COUNT(*) AS total_rows,
SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(100.0 * SUM(CASE WHEN <column> IS NULL THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0), 2) AS null_pct
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>Pattern 8: Time-Axis Continuity
模式8:时间轴连续性
Trigger: Model is OR a time axis field was identified.
materialized='incremental'sql
SELECT
CAST(<time_axis> AS DATE) AS day,
COUNT(*) AS row_count
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
WHERE <time_axis> >= CURRENT_TIMESTAMP - INTERVAL '14' DAY
GROUP BY day
ORDER BY day DESC
LIMIT 30触发条件: 模型的或识别到时间轴字段。
materialized='incremental'sql
SELECT
CAST(<time_axis> AS DATE) AS day,
COUNT(*) AS row_count
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
WHERE <time_axis> >= CURRENT_TIMESTAMP - INTERVAL '14' DAY
GROUP BY day
ORDER BY day DESC
LIMIT 30Pattern 3: Before/After Comparison
模式3:前后对比
Trigger: Always (for changed fields + top segmentation field). Modified models only.
Important: Exclude added columns (from "New columns" in Phase 2b) from . Only use fields that exist in BOTH prod and dev. Added columns don't exist in prod and will cause query errors.
<group_fields>sql
WITH prod AS (
SELECT <group_fields>, COUNT(*) AS cnt
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <group_fields>
),
dev AS (
SELECT <group_fields>, COUNT(*) AS cnt
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <group_fields>
)
SELECT
COALESCE(b.<field>, d.<field>) AS <field>,
COALESCE(b.cnt, 0) AS cnt_prod,
COALESCE(d.cnt, 0) AS cnt_dev,
COALESCE(d.cnt, 0) - COALESCE(b.cnt, 0) AS diff
FROM prod b
FULL OUTER JOIN dev d ON b.<field> = d.<field>
ORDER BY ABS(diff) DESC
LIMIT 100触发条件: 始终触发(针对变更字段+顶级分段字段)。仅适用于修改模型。
重要提示: 从中排除新增列(阶段2b中的"新列")。仅使用在生产环境和开发环境中均存在的字段。新增列在生产环境中不存在,会导致查询错误。
<group_fields>sql
WITH prod AS (
SELECT <group_fields>, COUNT(*) AS cnt
FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <group_fields>
),
dev AS (
SELECT <group_fields>, COUNT(*) AS cnt
FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>
GROUP BY <group_fields>
)
SELECT
COALESCE(b.<field>, d.<field>) AS <field>,
COALESCE(b.cnt, 0) AS cnt_prod,
COALESCE(d.cnt, 0) AS cnt_dev,
COALESCE(d.cnt, 0) - COALESCE(b.cnt, 0) AS diff
FROM prod b
FULL OUTER JOIN dev d ON b.<field> = d.<field>
ORDER BY ABS(diff) DESC
LIMIT 100Pattern 7b: Row Count Comparison
模式7b:行数对比
Trigger: Always. Modified models only.
sql
SELECT 'prod' AS source, COUNT(*) AS row_count FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
UNION ALL
SELECT 'dev' AS source, COUNT(*) AS row_count FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>触发条件: 始终触发。仅适用于修改模型。
sql
SELECT 'prod' AS source, COUNT(*) AS row_count FROM {{prod_db}}.<SCHEMA>.<TABLE_NAME>
UNION ALL
SELECT 'dev' AS source, COUNT(*) AS row_count FROM {{dev_db}}.<SCHEMA>.<TABLE_NAME>Phase 4: Build Notebook YAML
阶段4:构建Notebook YAML
4a. Metadata
4a. 元数据
yaml
version: 1
metadata:
id: validation-pr-<PR_NUMBER>-<random_suffix>
name: "Validation: PR #<PR_NUMBER> - <PR_TITLE_TRUNCATED>"
created_at: "<current_iso_timestamp>"
updated_at: "<current_iso_timestamp>"yaml
version: 1
metadata:
id: validation-pr-<PR_NUMBER>-<random_suffix>
name: "Validation: PR #<PR_NUMBER> - <PR_TITLE_TRUNCATED>"
created_at: "<current_iso_timestamp>"
updated_at: "<current_iso_timestamp>"4b. Parameter Cells
4b. 参数单元格
Only include if there are modified models. If all models are new, only include .
prod_dbdev_dbyaml
undefined仅当存在修改模型时才包含。如果所有模型都是新建的,仅包含。
prod_dbdev_dbyaml
undefinedInclude ONLY if there are modified models:
仅当存在修改模型时包含:
- id: param-prod-db type: parameter content: name: prod_db config: type: text default_value: "ANALYTICS" placeholder: "Prod database (e.g., ANALYTICS)" display_type: table
- id: param-prod-db type: parameter content: name: prod_db config: type: text default_value: "ANALYTICS" placeholder: "Prod database (e.g., ANALYTICS)" display_type: table
Always include:
始终包含:
- id: param-dev-db type: parameter content: name: dev_db config: type: text default_value: "PERSONAL_<USER>" placeholder: "Dev database (e.g., PERSONAL_JSMITH)" display_type: table
undefined- id: param-dev-db type: parameter content: name: dev_db config: type: text default_value: "PERSONAL_<USER>" placeholder: "Dev database (e.g., PERSONAL_JSMITH)" display_type: table
undefined4c. Markdown Summary Cell
4c. Markdown摘要单元格
yaml
- id: cell-summary
type: markdown
content: |
# Validation Queries for <PR or Local Branch>
## Summary
- **Title:** <title>
- **Author:** <author>
- **Source:** <PR URL or "Local branch: <branch>">
- **Status:** <merge_timestamp or "Not yet merged" or "N/A (local)">
## Changes
<brief description based on diff analysis>
## Changed Models
- `<SCHEMA>.<TABLE_NAME>` (from `<file_path>`)
## How to Use
1. Select your Snowflake connector above
2. Set **dev_db** to your dev database (e.g., `PERSONAL_JSMITH`)
3. If modified models are present, set **prod_db** to your prod database (e.g., `ANALYTICS`)
4. Run single-table queries first, then comparison queries
display_type: tableyaml
- id: cell-summary
type: markdown
content: |
# <PR或本地分支>的验证查询
## 摘要
- **标题:** <title>
- **作者:** <author>
- **来源:** <PR URL或"Local branch: <branch>">
- **状态:** <merge_timestamp或"Not yet merged"或"N/A (local)">
## 变更内容
<基于差异分析的简要描述>
## 变更模型
- `<SCHEMA>.<TABLE_NAME>`(来自`<file_path>`)
## 使用方法
1. 在上方选择您的Snowflake连接器
2. 将**dev_db**设置为您的开发数据库(例如`PERSONAL_JSMITH`)
3. 如果存在修改模型,将**prod_db**设置为您的生产数据库(例如`ANALYTICS`)
4. 先运行单表查询,再运行对比查询
display_type: table4d. SQL Cell Format
4d. SQL单元格格式
yaml
- id: cell-<pattern>-<model>-<index>
type: sql
content: |
/*
========================================
<Pattern Name (human-readable, e.g. "Total Row Count" — do NOT include pattern numbers like "Pattern 7:")>
========================================
Model: <SCHEMA>.<TABLE_NAME>
Triggered by: <why this pattern was generated>
What to look for: <interpretation guidance>
----------------------------------------
*/
<actual_sql_query>
display_type: tableyaml
- id: cell-<pattern>-<model>-<index>
type: sql
content: |
/*
========================================
<模式名称(易读格式,例如"总行数"——请勿包含模式编号如"Pattern 7:")>
========================================
模型:<SCHEMA>.<TABLE_NAME>
触发原因:<生成此模式的原因>
关注要点:<解释指导>
----------------------------------------
*/
<实际SQL查询>
display_type: table4e. Cell Organization
4e. 单元格组织
Cells are ordered consistently for both model types, following this sequence:
New models:
- Summary markdown cell (note that model is new)
- Parameter cells (dev_db only — no prod_db if all models are new)
- Total row count (Pattern 7-new)
- Sample data preview (Pattern 9)
- Core segmentation counts (Pattern 2-new)
- Uniqueness check (Pattern 5), NULL rate check (Pattern 6-new), Time-axis continuity (Pattern 8)
Modified models:
- Summary markdown cell
- Parameter cells (prod_db, dev_db)
- Total row count (Pattern 7)
- Sample data preview (Pattern 9)
- Core segmentation counts (Pattern 2)
- Changed field distribution (Pattern 1)
- Uniqueness check (Pattern 5), NULL rate check (Pattern 6), Time-axis continuity (Pattern 8)
- Before/after comparisons (Pattern 3), Row count comparison (Pattern 7b)
两种模型类型的单元格顺序一致,遵循以下序列:
新建模型:
- 摘要markdown单元格(注明模型为新建)
- 参数单元格(仅dev_db——如果所有模型都是新建的,则不包含prod_db)
- 总行数(模式7-new)
- 样本数据预览(模式9)
- 核心分段计数(模式2-new)
- 唯一性检查(模式5)、NULL率检查(模式6-new)、时间轴连续性(模式8)
修改模型:
- 摘要markdown单元格
- 参数单元格(prod_db、dev_db)
- 总行数(模式7)
- 样本数据预览(模式9)
- 核心分段计数(模式2)
- 变更字段分布(模式1)
- 唯一性检查(模式5)、NULL率检查(模式6)、时间轴连续性(模式8)
- 前后对比(模式3)、行数对比(模式7b)
Phase 5: Generate Import URL
阶段5:生成导入URL
- Write notebook YAML to
/tmp/validation_notebook_working/<id>/notebook.yaml - Run the URL generation script:
bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/monte-carlo-validation-notebook/scripts/generate_notebook_url.py /tmp/validation_notebook_working/<id>/notebook.yaml --mc-base-url <MC_BASE_URL>- The script validates both YAML syntax and notebook schema (required fields on metadata and cells). If validation fails, read the error messages carefully, fix the YAML to match the spec in Phase 4, and re-run.
- 将Notebook YAML写入
/tmp/validation_notebook_working/<id>/notebook.yaml - 运行URL生成脚本:
bash
python3 ${CLAUDE_PLUGIN_ROOT}/skills/monte-carlo-validation-notebook/scripts/generate_notebook_url.py /tmp/validation_notebook_working/<id>/notebook.yaml --mc-base-url <MC_BASE_URL>- 脚本验证YAML语法和笔记本Schema(元数据和单元格上的必填字段)。如果验证失败,仔细阅读错误消息,修复YAML使其符合阶段4中的规范,然后重新运行。
Phase 6: Output
阶段6:输出
Present:
markdown
undefined呈现:
markdown
undefinedValidation Notebook Generated
验证笔记本已生成
Summary
摘要
- Source: PR #<number> - <title> OR Local: <branch>
- Author: <author>
- Changed Models: <count> models (of <total_count> changed)
- Generated Queries: <count> queries
⚠️ If models were capped: "Only the first 10 of <total_count> changed models were included. Re-run withto select specific models."--models
- 来源: PR #<number> - <title> 或 Local: <branch>
- 作者: <author>
- 变更模型: <count>个模型(共<total_count>个变更)
- 生成查询: <count>个查询
⚠️ 如果模型数量受限:"仅包含了<total_count>个变更模型中的前10个。重新运行时使用选择特定模型。"--models
Notebook Opened
笔记本已打开
The notebook has been opened directly in your browser.
Select your Snowflake connector in the notebook interface to begin running queries.
Make sure MC Bridge is running. Let me know if you want tips on how to install this locally
undefined笔记本已直接在您的浏览器中打开。
在笔记本界面中选择您的Snowflake连接器开始运行查询。
确保MC Bridge正在运行。如果您需要本地安装的提示,请告知我
undefinedImportant Guidelines
重要指南
- Do NOT execute queries -- only generate the notebook
- Keep SQL readable -- proper formatting and meaningful aliases
- Include LIMIT 100 on queries that could return many rows
- Use double curly braces -- NOT
{{prod_db}}${prod_db} - Use correct table format -- and
{{prod_db}}.<SCHEMA>.<TABLE>{{dev_db}}.<SCHEMA>.<TABLE> - Always use the schema resolution script -- do NOT manually parse dbt_project.yml
- Schema is NOT a parameter -- only and
prod_dbare parametersdev_db - Skip ephemeral models -- they have no physical table
- Truncate notebook name -- keep under 50 chars
- Generate unique cell IDs -- use pattern like
cell-p3-model-1 - YAML multiline content -- use block scalar for SQL with comments
| - ASCII-only YAML -- the script sanitizes and validates before encoding
- 请勿执行查询——仅生成笔记本
- 保持SQL可读性——适当的格式和有意义的别名
- 在可能返回大量行的查询中包含LIMIT 100
- 使用双大括号——而非
{{prod_db}}${prod_db} - 使用正确的表格式——和
{{prod_db}}.<SCHEMA>.<TABLE>{{dev_db}}.<SCHEMA>.<TABLE> - 始终使用Schema解析脚本——请勿手动解析dbt_project.yml
- Schema不是参数——仅和
prod_db是参数dev_db - 跳过临时模型——它们没有物理表
- 截断笔记本名称——保持在50字符以内
- 生成唯一的单元格ID——使用类似的格式
cell-p3-model-1 - YAML多行内容——对带注释的SQL使用块标量
| - 仅使用ASCII的YAML——脚本在编码前会进行清理和验证
Query Pattern Reference
查询模式参考
| Pattern | Name | Trigger | Model Type | Database | Order |
|---|---|---|---|---|---|
| 7 / 7-new | Total Row Count | Always | Both | | 1 |
| 9 | Sample Data Preview | Always | Both | | 2 |
| 2 / 2-new | Core Segmentation Counts | Always | Both | | 3 |
| 1 | Changed Field Distribution | Column modified in diff (not added) | Modified only | | 4 |
| 5 | Uniqueness Check | JOIN/unique_key changed (modified) / Always (new) | Both | | 5 |
| 6 / 6-new | NULL Rate Check | New column or COALESCE (modified) / Always (new) | Both | Added col: | 5 |
| 8 | Time-Axis Continuity | Incremental or time field | Both | | 5 |
| 3 | Before/After Comparison | Changed fields (not added) | Modified only | Both | 6 |
| 7b | Row Count Comparison | Always | Modified only | Both | 6 |
| 模式 | 名称 | 触发条件 | 模型类型 | 数据库 | 顺序 |
|---|---|---|---|---|---|
| 7 / 7-new | 总行数 | 始终 | 两者 | | 1 |
| 9 | 样本数据预览 | 始终 | 两者 | | 2 |
| 2 / 2-new | 核心分段计数 | 始终 | 两者 | | 3 |
| 1 | 变更字段分布 | 差异中修改的列(非新增) | 仅修改 | | 4 |
| 5 | 唯一性检查 | JOIN/unique_key变更(修改)/ 始终(新建) | 两者 | | 5 |
| 6 / 6-new | NULL率检查 | 新增列或COALESCE(修改)/ 始终(新建) | 两者 | 新增列:仅 | 5 |
| 8 | 时间轴连续性 | 增量模型或时间字段 | 两者 | | 5 |
| 3 | 前后对比 | 变更字段(非新增) | 仅修改 | 两者 | 6 |
| 7b | 行数对比 | 始终 | 仅修改 | 两者 | 6 |
MC Bridge Setup Help
MC Bridge安装配置帮助
If the user asks how to install or set up MC Bridge, fetch the README from the mc-bridge repo and show the relevant quick start / setup instructions:
bash
gh api repos/monte-carlo-data/mc-bridge/readme --jq '.content' | base64 --decodeFocus on: how to install, configure connections, and run MC Bridge. Don't dump the entire README — extract just the setup-relevant sections.
如果用户询问如何安装或设置MC Bridge,从mc-bridge仓库获取README并显示相关的快速开始/安装配置说明:
bash
gh api repos/monte-carlo-data/mc-bridge/readme --jq '.content' | base64 --decode重点关注:如何安装、配置连接和运行MC Bridge。不要输出整个README——仅提取与安装配置相关的部分。
Limitations
局限性
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
- 仅当任务明确符合上述描述的范围时使用此技能。
- 不要将输出视为环境特定验证、测试或专家评审的替代品。
- 如果缺少所需输入、权限、安全边界或成功标准,请停止并请求澄清。