| name | gooddata-to-sigma |
| description | Migrate GoodData Cloud / GoodData.CN workspaces to Sigma. Use when the user has a GoodData workspace โ datasets, MAQL metrics, insights, and analytical dashboards โ and wants to recreate it in Sigma. Exports the workspace via the declarative layout API (logicalModel + analyticsModel), maps the LDM (datasets / attributes / facts / references) to a Sigma data model, translates MAQL metrics to Sigma formulas, maps insights to workbook charts/KPIs/pivots and dashboards to pages + layout, ports user data filters (RLS) to Sigma user attributes, and verifies parity against the same warehouse. Translates what maps cleanly and flags what doesn't (compute-engine-only metrics, exotic MAQL context, unsupported widgets) instead of emitting wrong logic. Legacy GoodData Platform (/gdc/md classic) is out of scope for now โ Cloud / .CN only. |
| user-invocable | true |
GoodData โ Sigma
Status: LIVE-VALIDATED โ exact parity, data model + workbook.
Proven end-to-end on a GoodData Cloud trial โ Sigma (both on Snowflake): a
workspace (LDM + MAQL metrics + insights + dashboard) migrated to a Sigma data
model + workbook with exact parity on metrics and the relationship-backed
by-region breakdown; the BY ALL share metric was correctly flagged. Build
order, risks, and remaining work (live FOR-PREVIOUS date-intel) are in
refs/design-notes.md. Still: never claim a specific conversion works until
it passes live parity for that workspace.
Recreate a GoodData workspace in Sigma, in the same phase structure as the
sibling converters (Tableau, Power BI, Qlik, Cognos, MicroStrategy, SSRS, โฆ).
This skill defers all workbook-spec authoring to the sigma-workbooks skill
and all data-model authoring to sigma-data-models.
Read these first
refs/gooddata-api.md โ declarative export API, auth, LDM + analytics shape.
refs/maql-mapping.md โ MAQL โ Sigma formula contract (the hard part).
refs/viz-type-mapping.md โ insight + dashboard โ Sigma element mapping.
refs/design-notes.md โ full architecture, parity, RLS, risks, build order.
Phases
Phase 0 โ Assess. Run the gooddata-assessment skill for an inventory +
readiness readout before committing to a conversion.
Phase 1 โ Discover. eval "$(scripts/get-token.sh)" then
python3 scripts/discover.py --workspace <id> โ workspace_layout.json
(full LDM + analytics model). Confirm counts and the MAQL-keyword / insight-type
histograms it prints.
Phase 1b โ Gap-scout (measure MAQL coverage first).
python3 scripts/scan_gaps.py --workspace gd_workspace.json reports coverage by
category โ AUTO (data-model metric), TIME_INTEL (โ workbook DateLookback),
CONTEXT (โ workbook grouping/Level), UNHANDLED (logged to learned-rules). Run
this before converting so coverage is known, not assumed.
Phase 1c โ Reuse check (avoid DM sprawl). Before creating a new data model,
reuse-check: look for an existing Sigma DM with the same signature (same
connection + tables) and reuse/pick it (find-or-pick-dm) rather than POSTing a
duplicate. Only build a fresh DM when no match exists.
Phase 2 โ Data model. scripts/convert.py maps LDM datasets โ Sigma
warehouse-table elements (dim-before-fact; recover the path from the data-source
db/schema so parity runs on the same warehouse), attributes/facts โ columns,
references โ relationships, MAQL metrics โ DM metrics (via maql.py); flagged
metrics go to flags.json. POST the emitted spec to /v2/dataModels/spec
(needs top-level schemaVersion + folderId), then read back the created
DM (GET /v2/dataModels/{id}/spec) to capture the real, server-assigned
element/column ids โ a hard gate before any workbook work (POST reassigns ids).
python3 scripts/convert.py --workspace gd_workspace.json \
--connection-id <sigma-conn-uuid> --db <DB> --schema <SCHEMA> \
--folder-id <sigma-folder> --out dm_spec.json --flags flags.json
Phase 3 โ Workbook. scripts/build_workbook.py maps insights โ
kpi-chart/bar-chart (each sourcing the migrated DM fact element; charts
auto-aggregate by axis), recursively inlines metric MAQL into measure formulas,
and resolves a related-dataset view attribute to a cross-element reference
[FACT/REL_NAME/Dim] (exercises the migrated relationship). POST to
/v2/workbooks/spec. Defers chart/layout/theming idioms to sigma-workbooks.
python3 scripts/build_workbook.py --workspace gd_workspace.json \
--data-model-id <dm-uuid> --fact-element <elId> --fact-name <TABLE> \
--rel-name <REL_NAME> --fact-dataset <ds-id> --folder-id <folder> --out wb_spec.json
Apply the dashboard grid layout as the LAST write (after all elements exist;
a bare spec PUT wipes layout) โ match GoodData's section/widget arrangement.
Phase 4 โ Parity. Query the migrated DM/workbook elements vs the same
warehouse truth. NOTE: sigma-mcp-v2 metric('<id>', t) returns "Missing
Metric" (a known MCP bug) โ parity-query the columns/formulas directly instead.
Phase 5 โ Repoint. Finalize workbook element sources onto the built DM โ
never skip.
Phase 6 โ RLS + enhance. Port user data filters โ Sigma user attributes via
the consolidated RLS gate; apply theme via the theme registry; final visual-QA.
Contract: flag, never fake
Surface โ never silently mis-convert โ these (log to gap-scout / learned-rules,
opt-in escalate):
- MAQL with no clean warehouse equivalent (FlexQuery / compute-only).
BY / BY ALL / WITHIN context that can't be reconstructed from insight grain.
- Exotic visualizations (funnel / sankey / waterfall / treemap โฆ) โ flagged table.
sql-backed datasets and anything the MAQL parser tags UNHANDLED.
Scope
GoodData Cloud / .CN (/api/v1 declarative API). Legacy Platform
(/gdc/md/{project}, classic MAQL, MUF) is a documented fast-follow โ see
design-notes.md โ not built.