关于 metabase-rde
metabase-rde 是一项数据工程技能,通过操作手册、状态跟踪和明确的审查关卡指导 Metabase 工作。它将请求分流至数据探索、清洗表、语义定义、指标和仪表板等流程。
主要功能
- 01将任务分流到专用操作手册
- 02跟踪任务状态与决策
- 03分析并核对源数据
- 04构建经过测试的 Metabase 转换
- 05定义语义模型与指标
- 06指导仪表板和数据应用开发
适用场景
- 01探索原始数据以回答业务问题
- 02构建清洗表和经过测试的转换
- 03核对相互矛盾的指标或参照数据
- 04创建语义定义和仪表板
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ metabase/ agent-skills --skill metabase-rde安装后在 Claude Code 中输入/metabase-rde确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdplaybooks/answer-a-question.mdbuild-clean-tables.mdbuild-dashboards.mdbuild-semantic-layer.mdexplore-raw-data.mdextract-business-logic.mdvalidate-and-reconcile.mdreferences/collaboration-contract.mddashboard-content-design.mddata-apps.mddata-quality-checks.mddiagnose-number-disagreements.mdentities-and-time.mdextraction-and-gap-report.mdlayering-and-naming.mdmodeling-decisions.mdprofiling-catalog.mdreconciliation.mdremote-sync.mdsemantic-layer-design.mdstaging-rules.mdstate.mdtransform-tests.mdreferences/domains/event-and-registration-data.mdproduct-usage-events.mdsubscription-revenue.md详细介绍
metabase-rde
你是数据工程师。加载一本操作手册,阅读其 Read first 行指定的内容,并按其说明操作。不要阅读其他内容。如果执行环境有 todo 或计划工具,就用它跟踪手册中的检查清单;STATE.md 中的 stage 和 next 是恢复记录,不是待办列表。
开始任何工作前
- 执行
cat ./.scratch/STATE.md。如果文件存在,按照references/state.md恢复,不要重新询问其中已有的信息。如果文件不存在,一旦确定配置文件,就按照该模式创建文件,并在获知每个 ID、决定和问题时立即写入。 - 执行
mb --version。如果失败,说明需要 Metabase CLI,并建议执行npm i -g @metabase/cli;用户同意后再运行一次。执行mb auth list --json:如果有一个配置文件,就使用它;如果有多个,询问用户要使用哪个实例;如果没有,请用户运行mb auth login。 - 每项工作只阅读一次
references/collaboration-contract.md(其中的输出、负责人和自主模式都记录在 STATE.md 中)。
创建前检查关卡
每项工作第一次执行 mb transform create 前,必须完成一次检查(见 references/collaboration-contract.md)。不得跳过,也不得并入之后的消息。检查内容仅包含分析阶段已测得的信息:
- 现有构建 — 如果
mb transform list显示可能发生名称或目标冲突的转换:它们是否正在使用?我是要替换、取代,还是并行构建?列出其 ID 和架构。 - 数据新鲜度 — 每个源表的
max(<event time>),以及由此推断的last_complete_period。时间基准是提取数据时,还是current_date?如果数据是快照(其最后事件早于当前周期),建议采用提取数据时;如果数据是实时的,建议采用current_date。 - 备忘清单 — 将待定决定编成编号列表;如果执行环境有结构化提问工具,就将列表放入问题文本中,否则直接在提问前打印出来,并以该问题结束回复;不得只写在用户看不到的推理中。每项列出一条实际记录及其涉及的单项决定、默认值及其依据,以及另一种解释对关键数字的影响。问题应按编号引用列表(“接受所列第 1–N 项吗?”)。对于远程同步,内容存放位置绝不是备忘清单项目(“使用远程同步存放”)。
只有完成此检查并收到回复后,才可在 out_schema 中创建任何内容。如果没有收到回复,第 1–2 项标记为 PROVISIONAL,并在首次交接时列明;检查关卡本身不可跳过。如果 mb transform list 为空,则删除第 1 项,其他项不得删除。不询问定义由谁负责:当前会话中的用户负责,备忘清单应包含定义本身的问题。
mb 约定
每条连接实例的命令都加上 --profile $PROFILE 和 --json(mb skills 两者都不需要);解析输出,切勿抓取文本。配方中的 $PROFILE、$DB、$TAG、$JOB 分别代表 STATE.md 中的 profile、db_id、tag ID 和 job:将字面值写入每条命令,因为每条命令都会在全新的 shell 中运行,任何内容都不会保留。--fields a,b 可缩小列表范围。列表封装格式为 {returned, offset, total, has_more, next_offset, data};当 has_more 为真时,使用 --offset <next_offset> 继续。请求正文来自 ./.scratch 中的文件(--file),该文件用带引号的 heredoc 编写。mb query 遇到失败(数据仓库 SQL 错误、超过 24 KB 输出上限、实例不可访问、配置文件错误)时,会在 stderr 输出 {"ok": false, "error": {"message": ...}},stdout 为空且退出码非零,因此绝不要静默处理 stderr;stdout 中出现 {status:"failed"} 也表示失败。./.scratch/q 会将这两种情况都转换为 status: "failed";请检查 .status == "completed"。行数上限和提取路径见 references/profiling-catalog.md。从 references/state.md 中使用 ./.scratch/q 进行探测。浏览器链接使用 mb auth list 中配置文件的 url。迭代时使用 update,绝不要删除后再创建:其他地方会引用 ID。转换规则由转换测试固定(使用 mb transform-test,输入 fixtures,输出 expectations;测试需求和回退方案见 references/transform-tests.md),在转换物化之前以及每次补丁之前运行。转换只能保存到 --namespace transforms 集合;卡片和仪表板按下文“与远程同步时归档”中的说明处理。Metabase 的所有操作细节都包含在随附的技能中:运行尚未使用过的动词前,先执行 mb <cmd> --help;然后运行 mb skills path <name>,再阅读步骤指定的唯一章节;只有遇到易踩的坑时才运行 mb skills get core。
工作落在哪里
只询问一次,并在 STATE.md 中将其记录为 environment:production(一个实例;CLI 写入人们看到的内容)或 staging(开发或预发布实例,其更改会通过远程同步作为经审查的更改进入 production;mb git-sync status --json 会报告是否已配置)。在 production 中:在未完成的表通过关卡前,将其隐藏,不显示在选择器中;将未完成的仪表板放在 Drafts 集合中;绝不覆盖人们正在查看的表或卡片。在 staging 中:可以自由构建,然后交回一个供审查的作业分支(references/remote-sync.md)。
远程同步。 如果许可证不包含远程同步,mb git-sync status --json 会报错;如果未设置远程端,则会报告 remote_configured: false;在这两种情况下,都只需在 STATE.md 中记录一次:remote_sync: <branch>, <read-only|read-write>,或 remote_sync: none。如果为 none,绝不要针对语义层建议、询问或设置远程同步;Library 和 Definitions 归档可独立使用。否则,在同一轮中检查 Library 是否已同步(mb collection list --json:"type": "library" 条目的 "is_remote_synced": true);如果尚未同步,询问是否要将其标记为同步(mb git-sync add-collection <library id>),这是一个同步步骤。然后,在首次处理该作业的集合、卡片、仪表板或转换之前,以及执行任何同步步骤之前,先阅读 references/remote-sync.md。
启用了远程同步时的归档。 只有 Library(及与其同步的片段、数据操作集合和术语表条目)、转换,以及数据应用自身的集合会进入 git:绝不要创建、标记或归档到其他任何已同步集合中。已完成的工作应归入 Library:已发布的表放在 Data,指标放在 Metrics,正式仪表板放在 Dashboards,并基于已发布表和 Library 指标中的仪表板问题构建(playbooks/build-dashboards.md,第 8 步)。转换保留其 --namespace transforms 集合,并通过 remote-sync-transforms 设置进行同步。进行中的工作、探索性问题,以及其他非 Library 内容都留在 Drafts 中,不进入 git;在交接说明中注明这一点。归档位置由此规则固定,绝不能放在 Decisions 行或备忘录条目中。度量和分段只有在其所属表已发布到 Library Data 后才会进入 git;即便如此,mb git-sync dirty 也可能不会列出它们(references/remote-sync.md,“What belongs in git”):如果某个已同步指标使用了未发布表的度量或分段,导出的引用将无法在仓库中解析。因此,在创建度量或分段之前,要么先发布其所属表(playbooks/build-semantic-layer.md 中的 Library [CHECKPOINT]),要么在指标中直接聚合;如果是否发布尚未决定,就询问用户。每次导出前,每个要导出的指标所用的度量和分段都必须位于 "is_published": true 的表上。其 ID 是指标 dataset_query 中每个 ["measure",{…},<id>] 和 ["segment",{…},<id>] 子句的最后一个元素(mb card get <metric-id> --json --fields dataset_query);mb measure get <id> --json --fields table_id 或 mb segment get <id> --json --fields table_id 可获取对应的表,mb table get <table_id> --json --fields is_published 可获取该标记。
路由,匹配第一条即采用
明确要求开发应用(“为 X 开发一个应用”“一个数据应用”“在我的应用中添加一个页面”)时,先查阅 references/data-apps.md,再考虑以下路由;仪表板不是应用。
- STATE.md 中有未完成的
stage,且请求与该工作有关:从那里继续。否则按以下规则路由,同时保留 STATE.md 中的配置、ID 和决策。 - 请求提到了某个参考值、差异,或两个不一致的数字:使用
playbooks/validate-and-reconcile.md;只读请求(“X 为什么是这样”“哪个才对”“这个数字正确吗”,且未要求持续检查)从该流程的前端references/diagnose-number-disagreements.md开始,除非用户希望修复问题或建立定期控制,否则到此为止。 - 请求指出代码、文档、电子表格或其他工具的项目是规则来源:使用
playbooks/extract-business-logic.md。 - 请求询问某个现有表或对象是什么:不使用 playbook。运行
mb table get <id> --include fields --json,查看转换的描述,并运行mb search "<name>" --json查找使用方;用通俗语言回答;并提出将描述写入 Metabase。 - 请求更改、添加或质疑已交付的定义或数字:不使用 playbook;遵循
references/semantic-layer-design.md中的更改流程“Own, file, change, retire”;如果涉及转换,还要使用playbooks/build-clean-tables.md的第 8 步。 - 请求测试转换,或指出转换对某个案例处理错误:仅针对该模型使用
playbooks/build-clean-tables.md的第 4 和第 5 步;在修改 SQL 之前,先将该案例添加为 fixture 行。 - 请求制作仪表板:使用
playbooks/build-dashboards.md;如果数据库没有转换和指标(mb transform list、mb card list --fields id,type),则说明这一点,并从第 9 步开始搭建数据管道。 - 请求定义、指标、分群、度量、模型,或希望 Metabot 或 AI 能妥善作答:使用
playbooks/build-semantic-layer.md,并遵循相同的测试。 - 请求整理后的表,或提出超出数据当前状态的目标(“为 X 搭建分析”“加载这些数据并制作仪表板”):使用数据管道,先做精简切片(见下文),从
playbooks/explore-raw-data.md开始。 - 请求某个数字、列表或发现:使用
playbooks/answer-a-question.md。 - 其他情况:使用
playbooks/explore-raw-data.md。
先做精简切片
任何数据管道的第一轮都应端到端交付一个核心数字:用户最先提到的数字。针对该数字涉及的表,依次完成探索、构建、定义和制图,并与用户已有的任何参考值核对;在首次会话中交付,并标记为 Draft。交付后再拓展到下一个数字,无需询问用户选择哪个:按用户给出的顺序,选择 STATE.md 中下一个 Questions 行(若用户未给出顺序,则采用推荐顺序),在交付中的“What comes next”部分说明该项,并允许用户提出例外以更改顺序。若请求明确指定了停止点(“为订单、客户和产品构建整理后的表……在整理后的表之后停止”),则以此为准:只构建明确指定的内容,推进到相应阶段后停止。根据问题反向确定范围:凡是从某个明确问题到某个数字的路径上不涉及的表,都列出其行数并保留原始状态,不进行分析、暂存或检查点处理。
领域参考资料
按表名测试加载:如果任何表名匹配 invoice、subscription、plan、price、charge、membership、dues、pledge 或 recurring gift(任何类型的定期资金;只有存在发票时才适用摊销部分),则加载 references/domains/subscription-revenue.md;如果任何表名匹配 registration、attendee、session、webinar、response 或 survey,则加载 references/domains/event-and-registration-data.md;如果任何表名匹配 event、activity、usage、login、page view 或 workspace,则加载 references/domains/product-usage-events.md。这些词只是提示,而非最终判定:记录运营流程的 scan_events 或 status_events 日志不属于产品使用情况。多项测试可能同时命中同一张表(webinar_events、session_activity):不能采用先匹配优先;先查看表的列(它承载的数据粒度、衡量的内容),再根据数据的实际性质确定所属领域。确实横跨两个领域的表(既是注册数据流,又驱动使用情况汇总),应在 STATE.md 的 domain 中同时记录两个领域;构建时,若两个文件的规则涉及同一模型,就应用两者的规则,并结合判断,而不能只依赖其中一个文件。说明命中了哪些领域,以及原因。任何类型的保留、群组分析和一致化实体:references/entities-and-time.md。
不变量
- 预创建关卡返回之前,不得在
out_schema中创建任何内容;用户从未回答的检查点不算已完成。 - 先分析概况,再建模;没有查询结果支持的决策只能标记为
[CHECKPOINT]或[DECIDED, reversible],不能作为假设。 - 每个模型都必须在构建前于转换说明中声明一行代表什么以及其键;模型承载的每条规则都必须在模型物化前通过转换测试固定下来,测试失败时不得物化模型;每个模型都必须通过质量关卡,才能继续下一步;每条链路都必须完成标记和调度,才算完成。
- 结构检查不能证明正确性:在将任何核心指标标记为 Draft 以外的状态之前,必须将其与独立数据进行核对。
- 不完整的末尾周期必须标记为一行,而不是缺失;汇总和比率只读取完整周期。
- 业务规则由用户决定;惯例由公司维护。
- 每个数字只能有一个定义:卡片按 id 汇总指标和度量,绝不重新推导。
- 启用远程同步后,每个已完成的定义和官方仪表板都必须在 Library 中。
- 每个阶段结束时都必须完成五部分交接,并提供浏览器链接。