[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-explore-omni-omni-content-builder":3,"mdc--2wmgpi-key":40,"related-org-explore-omni-omni-content-builder":6588,"related-repo-explore-omni-omni-content-builder":6731},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":38,"mdContent":39},"omni-content-builder","manage Omni Analytics documents and dashboards","Create, update, and manage Omni Analytics documents and dashboards programmatically — document lifecycle, drafts, tiles, visualizations, filters, controls, and layouts — using the Omni CLI. Use this skill whenever someone wants to build a dashboard, create a workbook, add tiles or charts, configure dashboard filters or controls, update an existing dashboard's model, set up a KPI view, create visualizations, lay out a dashboard, arrange tiles or pages, create a document, edit a dashboard as a draft, publish a draft, change dashboard settings, rename a workbook, delete a dashboard, move a document to a folder, duplicate a dashboard, or any variant of \"build a dashboard for\", \"create a report showing\", \"add a chart to\", \"make a dashboard\", \"update the dashboard layout\", \"rename this document\", \"publish this draft\", \"move to folder\", or \"delete this dashboard\". Also use when modifying dashboard-level model customizations like workbook-specific joins or fields.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"explore-omni","Explore Omni","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fexplore-omni.png","exploreomni",[13,17,20,23,26],{"name":14,"slug":15,"type":16},"Dashboards","dashboards","tag",{"name":18,"slug":19,"type":16},"Data Visualization","data-visualization",{"name":21,"slug":22,"type":16},"Omni","omni",{"name":24,"slug":25,"type":16},"CLI","cli",{"name":27,"slug":28,"type":16},"Analytics","analytics",27,"https:\u002F\u002Fgithub.com\u002Fexploreomni\u002Fomni-agent-skills","2026-04-06T18:11:02.007785",null,3,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":37},[],"A collection of skill for working with Omni. These skills help AI agents understand and execute Omni workflows more effectively.","https:\u002F\u002Fgithub.com\u002Fexploreomni\u002Fomni-agent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fomni-content-builder","---\nname: omni-content-builder\ndescription: Create, update, and manage Omni Analytics documents and dashboards programmatically — document lifecycle, drafts, tiles, visualizations, filters, controls, and layouts — using the Omni CLI. Use this skill whenever someone wants to build a dashboard, create a workbook, add tiles or charts, configure dashboard filters or controls, update an existing dashboard's model, set up a KPI view, create visualizations, lay out a dashboard, arrange tiles or pages, create a document, edit a dashboard as a draft, publish a draft, change dashboard settings, rename a workbook, delete a dashboard, move a document to a folder, duplicate a dashboard, or any variant of \"build a dashboard for\", \"create a report showing\", \"add a chart to\", \"make a dashboard\", \"update the dashboard layout\", \"rename this document\", \"publish this draft\", \"move to folder\", or \"delete this dashboard\". Also use when modifying dashboard-level model customizations like workbook-specific joins or fields.\n---\n\n# Omni Content Builder\n\nCreate, update, and manage Omni documents and dashboards programmatically via the Omni CLI — document lifecycle, drafts, workbook models, filters, controls, and dashboard content.\n\n> **Tip**: Use `omni-model-explorer` to understand available fields and `omni-content-explorer` to find existing dashboards to modify or learn from.\n\nDocuments are created and edited through the **v2 documents API** (`omni documents v2-*`) — an explicit envelope of `queryPresentations`, `controls`, `containers`, and `settings`, edited through a **draft → publish** flow. This is the only path for building, reading, or changing a document — never fall back to the v1 `documents create`\u002F`get`\u002F`put`\u002F`update` commands. A few document-management operations (list, delete, move, duplicate, downloads) have no v2 form; see [Commands](#commands) below.\n\n## Known Issues & Safe Defaults\n\n- **Always run the full validation loop** — see [Validation Loops](#validation-loops) below. At minimum: validate the model, test every query via `omni query run`, check viz spec consistency, and verify the dashboard by reading the draft back and executing its queries **before publishing**.\n- **Never round-trip a `v2-get` tile back into a patch unchanged** — a GET returns the inner vis config *flat*, but a patch only persists it *nested under `config`*. Re-sending the flat shape — even for an unrelated edit like a rename — silently drops the vis config (KPI loses its number, charts lose `mark`\u002F`series`, markdown goes blank). Always re-author the inner `visConfig` nested under `config`. See [references\u002Fdocuments-v2.md](references\u002Fdocuments-v2.md).\n  - **This applies to *any* write whose tile JSON came from a GET payload — not just edits.** Restoring, reverting, duplicating, or moving a tile by copying it out of a `v2-get`\u002Fsnapshot and patching it back is *also* a round-trip: the inner config is flat and will be dropped (renders \"No chart available\"). A \"restore to how it was\" still needs the config re-nested. And **verify the specific tile you wrote** — re-read it (`v2-get`) and run its query to confirm the config persisted; if a visual\u002Fpreview tool is available, you can also request a screenshot to confirm the render — *including reverts*; don't assume a restore is safe.\n- **Patches merge by key; only `containers` (and the `order` arrays) are full replacements.** To change one tile, send just that key. To delete a tile, set its key to `null` AND remove it from `order`. When you send `containers`, send the complete layout tree with your edit applied.\n- **A multi-tile `v2-create` only lays out the first tile** — the rest are stored but render nowhere until you author the full `containers` tree. See [references\u002Fcontainers.md](references\u002Fcontainers.md).\n- **Tile `\"1\"` on create merges over a server seed tile** — some seed properties (e.g. `automaticVis: true`) can win over what you sent. Read the document back and re-patch tile `\"1\"` if its exact fields matter.\n- **Every tile `query` must include the full collection-field set** — `sorts`, `filters`, `calculations`, `column_totals`, `row_totals`, `fill_fields`, `pivots`, `userEditedSQL` (empty values are fine) alongside `table`, `fields`, `limit`, `join_paths_from_topic_name`. Omitting the schema-required ones is a 400 with per-field errors. Do **not** include `modelId` or `model_extension_id` — the server anchors tiles to the document's workbook model and silently rewrites any value you send.\n- **HARD RULE — never build a non-topic tile from handed-over SQL without an explicit user decision.** When the user hands you SQL (or a metric) and existing topics don't express it, you may **not** silently convert it to a non-topic \u002F `userEditedSQL` tile. First apply the topic-first reflex (see `omni-query`): map each query's intent to a topic. If none fits, **stop and ask** whether to model it — extend a topic or create a new one (on a branch via `omni-model-builder`, validated, merged only with confirmation). Only build a non-topic \u002F raw-SQL tile after the user has **explicitly chosen** that path (declined modeling, or it's a genuine one-off \u002F `userEditedSQL` is required). Non-topic + Access Boost is never the default for handed-over SQL — it requires that explicit decision. This is the easiest thing to get wrong when \"build a dashboard\" starts from raw SQL.\n- **Non-topic \u002F raw-SQL tiles → ask about the audience, then counsel Access Boost.** When a tile's query is non-topic — a populated `userEditedSQL` (raw-SQL tile) or a bare base-view query (no `join_paths_from_topic_name`) — it is **invisible to Viewer \u002F Restricted Querier roles by default**. Before finalizing such content, **ask the user whether the dashboard's audience includes Restricted Queriers or Viewers**. If it does, **advise** (don't silently enable) **Access Boost**: it makes those tiles viewable *on the dashboard* (dashboard-only — not the underlying workbook) for chosen users\u002Fgroups or the whole org — provided the org capability is enabled and the caller has Manager on the document. Because it loosens access controls, treat enabling it as a separate, explicitly-confirmed step: recommend the **narrowest scope** that satisfies the need (specific users\u002Fgroups over org-wide) and get a clear go-ahead before it's applied. See the *Raw-SQL tiles* recipe in [references\u002FqueryPresentations.md](references\u002FqueryPresentations.md) and **`omni-admin`** → *Document Permissions* (which carries the full confirmation checklist and the commands\u002Fprerequisite).\n- **`--body` silently wins over shorthand flags** — if you pass `--body`, every promoted flag (`--name`, `--summary`, `--branch-id`, …) is ignored without warning. Put those fields inside the JSON body instead, or use flags alone with no `--body`.\n- **Draft commands take the document identifier first, then the draft identifier**: `v2-get-draft \u003Cidentifier> \u003CdraftIdentifier>` and `v2-patch-draft-by-identifier \u003Cidentifier> \u003CdraftIdentifier>`.\n- **Classic-layout dashboards return 422 from every v2 endpoint** — \"Upgrade the dashboard to the advanced layout before editing it through the API.\" There is no API fallback; ask the user to upgrade the layout in the Omni UI, then retry.\n- **The workbook model ID rotates on every draft → publish cycle** — each draft clones the workbook model (carrying extensions along), and publishing swaps the document to the clone. Never cache a workbook model ID; read it fresh from the draft's `workbookModelId` (`omni documents list-drafts \u003Cidentifier>`) each time you need it.\n- **Interactive controls scope per-tile via `map`** — a field\u002Ftimeframe switcher's `{\"\u003CtileKey>\": false}` excludes that tile, exactly like a filter's. See [references\u002Fcontrols.md](references\u002Fcontrols.md).\n- **Markdown tiles need `automaticVis: false`** — otherwise the renderer auto-derives a chart and the tile is blank. See [references\u002FvisConfig.md](references\u002FvisConfig.md).\n- **Mustache: reference a *filter* under `filters`, not `controls`.** To caption a tile with a filter's current value (e.g. a date window), use **`{{filters.…summary}}`** — *not* `{{controls.\u003Cid>.…}}` (a filter is configured as a control but mustache routes it to `filters`; the `controls` namespace is for `FIELD_SELECTION`\u002Fpicker\u002FTop-N controls and renders **empty** for a filter). The `filters` key is **context-dependent**: `view.field` in a markdown-viz tile (resolved against the tile's own query, so one token works per-tile), the control `id` in a dashboard text tile. Full namespace\u002Ftoken map + scenarios in [references\u002Fmustache.md](references\u002Fmustache.md).\n- **`query.filters` needs the object form** — the relative-date shorthand (`\"last 6 months\"`) throws a 500; send `{type:\"date\", kind:\"TIME_FOR_INTERVAL_DURATION\", ui_type:\"PAST\", left_side, right_side}`. See [references\u002Fdocuments-v2.md](references\u002Fdocuments-v2.md).\n- **A tile with no real `visConfig` renders as \"Item missing\"** — the server seeds new tiles with `visConfig.visType: null` + `automaticVis: false`, which draws nothing. Every tile needs either an explicit `visConfig` (e.g. the table recipe in [references\u002FvisConfig.md](references\u002FvisConfig.md)) or `automaticVis: true` to auto-derive one. Layout is separate: a multi-tile `v2-create` lays out all tiles you pass in `order`, so \"Item missing\" is a vis-config gap, not a `containers` gap.\n- **Chart rendering**: Complex chart types may show \"No chart available\" if the inner config, `visType`, or `prefersChart` are misconfigured. If the user asks for a specific chart, include the complete chart-specific config from [references\u002FvisConfig.md](references\u002FvisConfig.md) nested under `visConfig.visConfig.config`. Use `chartType: \"table\"` only as a deliberate table fallback, not for requested charts.\n- **Every query must include at least one measure** — a query with only dimensions produces empty\u002Fnonsense tiles (e.g., just months with no data).\n- **Boolean filters may be silently dropped** when a `pivots` array is present (reported Omni bug). If boolean filters aren't applying, remove the pivot and test again.\n- **Use `identifier` not `id`** — get a document's `identifier` from the `v2-create`\u002Fpatch responses or `omni documents list` records.\n- **Do not use `omni unstable documents-import` to update an existing dashboard** — import creates a new document and may drop newly-added tiles. Use the draft flow on the existing document.\n- **Do not persist invalid query-level filters** — if `omni query run` returns a server-side parsing error for a tile query filter, validate the unfiltered base query once. Do not save that broken filter into the tile. If a dashboard-level control can satisfy the request, use that path and verify by readback; otherwise leave the dashboard unchanged and report the blocker.\n- **Bound failed updates** — if a patch returns a validation error, stop after one corrected retry at most. Do not try repeated filter syntaxes or endpoint loops. Because edits happen on a draft, recovery is clean: **discard the draft** (`omni documents discard-draft \u003Cidentifier>`) and report what was preserved — the published document was never touched.\n\n## Prerequisites\n\n```bash\n# Verify the Omni CLI is installed — if not, ask the user to install it\n# See: https:\u002F\u002Fgithub.com\u002Fexploreomni\u002Fcli#readme\ncommand -v omni >\u002Fdev\u002Fnull || echo \"ERROR: Omni CLI is not installed.\"\n\n# Verify the CLI has the v2 documents commands — if not, ask the user to upgrade it\nomni documents v2-get --help >\u002Fdev\u002Fnull 2>&1 || echo \"ERROR: CLI is too old for the v2 documents API — upgrade it.\"\n```\n\n```bash\n# Show available profiles and select the appropriate one\nomni config show\n# If multiple profiles exist, ask the user which to use, then switch:\nomni config use \u003Cprofile-name>\n\n# Confirm the active profile is authenticated and inspect your permissions:\nomni whoami whoami\n```\n\n> **Auth**: a profile authenticates with an **API key** or **OAuth**. If `whoami` (or any call) returns **401**, hand off — ask the user to run `! omni config login \u003Cprofile>` (OAuth 2.1 browser flow; it blocks ~2 min on the browser). Don't run `config login` yourself in a headless\u002FCI session (no browser → timeout); on a local interactive machine you *may*. See the **`omni-api-conventions`** rule for profile setup (`omni config init --auth oauth`) and discovering request-body shapes with `--schema`.\n\n## Discovering Commands\n\n```bash\nomni documents --help              # Document operations (v2-* + lifecycle)\nomni dashboards --help             # Dashboard downloads\nomni models yaml-create --help     # Writing model YAML\nomni documents v2-create --schema  # Body schema + example (add --depth 1 for an overview, --field PATH to drill in)\n```\n\n> **Tip**: Use `-o json` to force structured output for programmatic parsing, or `-o human` for readable tables. The default is `auto` (human in a TTY, JSON when piped). `--compact` strips indentation for piping.\n\n## Commands\n\n**Build and edit documents with the `documents v2-*` commands — always.** There is no situation where you reach back to the v1 `documents create`\u002F`get`\u002F`put`\u002F`update` path to build, read, or change a document; the v2 draft flow covers all of it.\n\n| Operation | Command |\n|---|---|\n| Create document | `documents v2-create` |\n| Read document \u002F draft state | `documents v2-get` \u002F `v2-get-draft` |\n| Edit document (tiles, controls, layout, settings, rename) | `documents v2-patch-draft` (+ `v2-patch-draft-by-identifier`) |\n| Get the workbook model ID | `documents list-drafts` → `workbookModelId` (open a draft first) |\n| Publish a draft | `documents v2-publish-draft` |\n\nA handful of **document-management** operations have no v2 form — they aren't alternatives to the v2 build path, just the only command for that job: `documents list` \u002F `list-drafts` (find documents and drafts), `documents discard-draft` (abandon a draft), `documents delete` \u002F `move` \u002F `duplicate` (lifecycle), `documents get-queries` (extract a tile's runnable query for validation), `dashboards download` \u002F `download-status`, and `models yaml-create` \u002F `validate` (model writes).\n\n## Dashboard Architecture\n\nOmni dashboards are built from **documents**. A document's v2 state is an envelope of four slices:\n\n```jsonc\n{\n  \"name\": \"…\", \"description\": \"…\",\n  \"queryPresentations\": { \"data\": { \"\u003CtileKey>\": { \u002F* tile: query + vis *\u002F } }, \"order\": [\"1\", \"2\"] },\n  \"controls\":           { \"data\": { \"\u003CcontrolId>\": { \"config\": {…}, \"map\": {…} } }, \"order\": [\"…\"] },\n  \"containers\":         [ \u002F* layout tree: filter bar, pages, grids, tile stacks *\u002F ],\n  \"settings\":           { \"crossfilterEnabled\": …, \"facetFilters\": …, \"refreshInterval\": …, \"runQueriesOn\": …, \"customText\": … }\n}\n```\n\n- **Tiles** live in `queryPresentations.data`, keyed by record key (`\"1\"`, `\"2\"`, …); `order` is the tab order.\n- **Filters and interactive controls** are one map: `controls` (see [references\u002Fcontrols.md](references\u002Fcontrols.md)).\n- **Layout** is the `containers` tree — a tile renders only where a container references it (see [references\u002Fcontainers.md](references\u002Fcontainers.md)).\n- Each document also has a **workbook model** (per-dashboard model customizations) — its ID is the `workbookModelId` on the document's draft record from `documents list-drafts`.\n\nA document is edited through **drafts**: `v2-patch-draft` creates a draft and applies your patch; the published document is untouched until `v2-publish-draft`. `v2-get` returns the current draft state if a draft exists, else the published state. Drafts can also be bound to a **model branch** (see [references\u002Fbranch-bound-drafts.md](references\u002Fbranch-bound-drafts.md)).\n\n## Build queries on a topic\n\nBuild every tile's query **on a topic** whenever possible: set the query `table` to the topic's **base view** and pass `join_paths_from_topic_name: \u003Ctopic>`, plus `topicName: \u003Ctopic>` on the **presentation** (the presentation-level `topicName` is tile-specific — a standalone query has no equivalent). Joined-view fields then resolve through the topic's join map from the base view. For the full shape — how the join map reaches joined-view fields, the worked example, and verifying with `omni models get-topic` (`base_view_name`\u002F`join_via_map`) — see **`omni-query`**'s *Build queries on a topic*.\n\n**Access matters:** a tile **not** built on a topic is **not accessible to restricted queriers\u002Fviewers**. A bare base-view query (or a raw-SQL `userEditedSQL` tile) still works — it traverses the global `relationships` file — but is restricted-access-invisible in a dashboard. Use it only when no topic fits *and* the audience isn't restricted, **or** enable **Access Boost** on the document so Viewer\u002FRestricted Querier roles can see it (dashboard-only — not the underlying workbook). To author a raw-SQL tile and boost it end-to-end, see [references\u002FqueryPresentations.md](references\u002FqueryPresentations.md) → *Raw-SQL tiles*; for the boost commands and the org-level prerequisite, see **`omni-admin`** → *Document Permissions* (`add-permits` with `accessBoost`, or `update-permission-settings`).\n\n**If no existing topic fits the request**, don't just fall back to a base view (or raw SQL) — **ask the user** whether to *extend* an existing topic or *create* a new one, and build it on a branch only with their go-ahead. Don't silently convert un-modeled SQL into non-topic tiles. Use **`omni-query`** to choose\u002Fdecide the topic and **`omni-model-builder`** to create or modify one (branch → validate → merge only on confirmation).\n\n## Document Management\n\n### Create Document (Name Only)\n\n```bash\nomni documents v2-create \u003Cmodel-id> \"Q1 Revenue Report\"\n# optional flags: --identifier, --description, --folder-id\n```\n\n- `\u003Cmodel-id>` is the **shared** model; the server mints a per-document workbook model.\n- The document is **created and published immediately**. The response returns only `{identifier, name, description}` — when you need the workbook model ID, open a draft and read its `workbookModelId` from `omni documents list-drafts \u003Cidentifier>`.\n- `--folder-id` omitted → the document lands in the creator's personal \"My documents\" (requires personal-content permission). Pass a folder ID to place it in a shared folder.\n\n### Create Document with Queries and Visualizations\n\nPass the full envelope via `--body`. Tiles are keyed — write tile `\"1\"` explicitly to replace the server's seed tile:\n\n```bash\nomni documents v2-create --body '{\n  \"modelId\": \"your-shared-model-id\",\n  \"name\": \"Q1 Revenue Report\",\n  \"queryPresentations\": {\n    \"data\": {\n      \"1\": {\n        \"name\": \"Monthly Revenue Trend\",\n        \"type\": \"query\",\n        \"topicName\": \"order_items\",\n        \"prefersChart\": true,\n        \"automaticVis\": false,\n        \"query\": {\n          \"table\": \"order_items\",\n          \"fields\": [\"order_items.created_at[month]\", \"order_items.total_revenue\"],\n          \"sorts\": [{ \"column_name\": \"order_items.created_at[month]\", \"sort_descending\": false }],\n          \"filters\": { \"order_items.created_at\": \"this quarter\" },\n          \"limit\": 100,\n          \"join_paths_from_topic_name\": \"order_items\",\n          \"calculations\": [], \"column_totals\": {}, \"row_totals\": {},\n          \"fill_fields\": [], \"pivots\": [], \"userEditedSQL\": \"\"\n        },\n        \"visConfig\": {\n          \"chartType\": \"lineColor\",\n          \"fields\": [\"order_items.created_at[month]\", \"order_items.total_revenue\"],\n          \"version\": 0,\n          \"visConfig\": {\n            \"visType\": \"basic\",\n            \"config\": {\n              \"x\": { \"field\": { \"name\": \"order_items.created_at[month]\" } },\n              \"mark\": { \"type\": \"line\" },\n              \"color\": {},\n              \"series\": [{ \"field\": { \"name\": \"order_items.total_revenue\" }, \"yAxis\": \"y\" }],\n              \"tooltip\": [\n                { \"field\": { \"name\": \"order_items.created_at[month]\" } },\n                { \"field\": { \"name\": \"order_items.total_revenue\" } }\n              ],\n              \"configType\": \"cartesian\",\n              \"_dependentAxis\": \"y\"\n            }\n          }\n        }\n      }\n    },\n    \"order\": [\"1\"]\n  }\n}'\n```\n\n> **The rendering spec goes in `visConfig.visConfig.config`** (visType beside it, spec nested under `config`). `chartType` and `fields` sit at the outer `visConfig` level. Misplaced spec keys are silently dropped on write — see the round-trip warning in Known Issues. See [references\u002FqueryPresentations.md](references\u002FqueryPresentations.md) and [references\u002FvisConfig.md](references\u002FvisConfig.md) for the structures and per-chart-type configs.\n\n**Key points:**\n- Tile keys are strings `\"1\"`, `\"2\"`, … and must appear in `order` to be tabs; tiles also need a `containers` entry to **render** on the dashboard. A multi-tile create auto-lays-out only tile `\"1\"` — author `containers` for the rest ([references\u002Fcontainers.md](references\u002Fcontainers.md)).\n- `prefersChart` must be `true` to render a chart; set `automaticVis: false` when you author an explicit vis config.\n- The `query` needs the full collection-field set (see Known Issues) and **no `modelId`**.\n- `controls` and `settings` slices can be included in the same create body — see [Dashboard Filters & Controls](#dashboard-filters--controls).\n\n**To learn the exact structure for a chart type**, build a reference dashboard in the Omni UI and read it back with `omni documents v2-get \u003Cidentifier>` — remembering that the inner config reads back *flat* and must be re-nested under `config` before reuse.\n\n### Rename Document\n\n```bash\nomni documents v2-patch-draft \u003Cidentifier> --name \"Q1 Revenue Report (Updated)\" --summary \"rename\"\nomni documents v2-publish-draft \u003Cidentifier>\n```\n\n`--summary` is written to the document's history audit trail. (There is no `clearExistingDraft` in the v2 flow — if a draft already exists, patch it directly with `v2-patch-draft-by-identifier`, or discard it first.)\n\n### Delete Document\n\n```bash\nomni documents delete \u003Cidentifier>\n```\n\nSoft-deletes the document (moves to Trash).\n\n### Move Document\n\n```bash\nomni documents move \u003Cidentifier> \"\u002FMarketing\u002FReports\" --scope organization\n```\n\nUse `\"null\"` as the folder path to move to root. `--scope` is optional — auto-computed from the destination folder.\n\n### Duplicate Document\n\n```bash\nomni documents duplicate \u003Cidentifier> \"Copy of Q1 Revenue Report\" --folder-path \"\u002FMarketing\u002FReports\"\n```\n\nOnly published documents can be duplicated. Draft documents return 404.\n\n## Update Existing Dashboard\n\nEdits go through the **draft flow** — the published dashboard is untouched until you publish, so validation happens before anything goes live:\n\n1. **Read** the current state: `omni documents v2-get \u003Cidentifier> > doc.json`.\n2. **Author the patch** — patches **merge by key**, so send only the slices you're changing:\n   - **Add a tile**: new key in `queryPresentations.data` + append it to `order` (+ a `containers` tile stack so it renders).\n   - **Edit a tile**: send just that key — and **re-author its inner vis config nested under `config`** (never echo the flat GET shape back).\n   - **Delete a tile**: set its key to `null` and remove it from `order` (and its stack from `containers`).\n   - **Layout**: `containers` is a full replacement — send the whole tree with your edit applied.\n3. **Create the draft + apply**: `omni documents v2-patch-draft \u003Cidentifier> --body - \u003C patch.json` — capture `draftIdentifier` from the response. Include a `summary` in the body for the audit trail.\n4. **Validate the draft** — `omni documents v2-get-draft \u003Cidentifier> \u003CdraftIdentifier>`, run the affected queries (see [Validation Loops](#validation-loops)). Iterate with `omni documents v2-patch-draft-by-identifier \u003Cidentifier> \u003CdraftIdentifier> --body …`.\n5. **Publish**: `omni documents v2-publish-draft \u003Cidentifier>`. On failure or abandonment, `omni documents discard-draft \u003Cidentifier>` cleans up without touching the published doc.\n\nError map, merge-semantics details, and recipes are in **[references\u002Fupdating-dashboards.md](references\u002Fupdating-dashboards.md)**.\n\n## Updating a Dashboard's Model\n\n> **First decide where a new field belongs.** Skill users are almost always **modelers or admins** who *can* write to the shared model — so choose the field's right home, not the lowest-friction path. In order:\n> 1. **Can it be a calculation?** A table calculation is scoped to a **single query\u002Ftile** (computed on the result set). Prefer one for logic local to one query — but lean to a model field (→ #2\u002F#3) when (a) the **query shape rules a calc out**, or (b) you're building **multiple queries at once** and the same logic spans them and can be expressed as a dimension\u002Fmeasure. **Window-shaped logic** (running total, moving average, % change) should almost always stay a calc — it runs post-query on the result set, not in-warehouse; only reach for an in-warehouse field when the window must span rows *outside* the result set. (See `omni-query`'s table-calculation guidance.)\n> 2. **Reusable elsewhere?** If the field is likely to be used beyond this one dashboard, prefer adding it to a **branch on the shared model** and follow **`omni-model-builder`** to create, validate, and ship it.\n> 3. **One-off for this dashboard (and not a calculation)?** Add it to the **workbook model** — see [Building a tile that queries a workbook-model field](#building-a-tile-that-queries-a-workbook-model-field) below.\n> 4. **Unsure?** Ask the creator where the field should live.\n> 5. **Never write to the schema model** — it's auto-generated and read-only.\n>\n> **If the field isn't in the *published* shared model yet** — it lives only on a model **branch** that hasn't merged — put the tile on a **branch-bound draft**. See **[references\u002Fbranch-bound-drafts.md](references\u002Fbranch-bound-drafts.md)**.\n\nPush custom dimensions and measures to a specific dashboard by writing to its workbook model. Each workbook has its own model that **extends** the shared model — so the ID you write YAML to is a model ID, not a separate \"workbook ID\". Because every edit goes through a draft, and the field has to exist before a tile can reference it, the whole flow stays in the v2 draft path:\n\n**Step 1 — open a draft and read its workbook model ID:**\n\n```bash\nomni documents v2-patch-draft \u003Cidentifier> --summary \"add workbook field\"   # creates the draft\nomni documents list-drafts \u003Cidentifier>\n# → use the draft record's \"workbookModelId\" — that IS the model you write YAML to\n```\n\n> **Note**: The workbook model (which extends the shared model) is what you pass to `omni models yaml-create`. Each draft has its **own** clone of it, and the ID **changes on every draft → publish cycle** — always read it fresh from `list-drafts`; never reuse a cached value.\n\n**Step 2 — POST YAML to the draft's workbook model with `mode: \"extension\"`:**\n\n```bash\nomni models yaml-create \u003CdraftWorkbookModelId> --body '{\n  \"fileName\": \"order_items.view\",\n  \"yaml\": \"dimensions:\\n  is_high_value:\\n    sql: \\\"${sale_price} > 100\\\"\\n    label: High Value Order\\nmeasures:\\n  high_value_count:\\n    sql: \\\"${order_items.id}\\\"\\n    aggregate_type: count_distinct\\n    label: High Value Orders\",\n  \"mode\": \"extension\"\n}'\n```\n\n> **Critical**: Always pass `\"mode\": \"extension\"` when editing an existing view in a workbook model. The default is `\"combined\"`, which treats your YAML body as the *complete* view definition and marks every field you didn't include as `ignored: true` — silently breaking queries that depend on fields from the shared base view. Extension mode layers your new dimensions and measures on top of the inherited view.\n\n`fileName` must be `\"model\"`, `\"relationships\"`, or end with `.view` or `.topic`. The `yaml` value is a YAML string (not a JSON object) containing the view's *contents* — no `views:` wrapper. Writing to a workbook model skips git sync entirely — authorization is still checked against the underlying shared model's permissions.\n\n### Building a tile that *queries* a workbook-model field\n\nv2 tile queries carry **no `modelId`** — the server anchors each tile to the draft's workbook model, so the field just has to exist in that model before the tile references it. The order is fixed:\n\n1. **`documents v2-create`** (or use the existing document) — provisions the workbook model.\n2. **`documents v2-patch-draft \u003Cidentifier>`** — open the draft (a `--summary`-only patch is enough to create it).\n3. **`documents list-drafts \u003Cidentifier>`** → the draft's `workbookModelId`.\n4. **`models yaml-create \u003CdraftWorkbookModelId>` with `mode: \"extension\"`** → add the field (above).\n5. **`documents v2-patch-draft-by-identifier \u003Cidentifier> \u003CdraftIdentifier>`** adding the tile that references the field — no `modelId` anywhere in the tile query.\n6. **`documents v2-publish-draft \u003Cidentifier>`** — the field and tile go live together.\n\nAfter publishing, the workbook model ID has **changed** — open a new draft and re-read `workbookModelId` from `list-drafts` before any further `yaml-create`.\n\n### Verify the Extension Worked\n\nAfter writing, confirm the base view's fields are still available by querying one against the draft's workbook model:\n\n```bash\nomni query run --body '{\n  \"query\": {\n    \"modelId\": \"\u003CdraftWorkbookModelId>\",\n    \"table\": \"order_items\",\n    \"fields\": [\"order_items.id\", \"order_items.high_value_count\"],\n    \"limit\": 1,\n    \"join_paths_from_topic_name\": \"order_items\"\n  }\n}'\n```\n\n(Standalone `query run` bodies still take a `modelId` — only **tile** queries inside v2 documents omit it.) If the response errors on a field that exists in the shared model (e.g. `order_items.id`), your write likely used combined mode and ignored the inherited fields. Re-run Step 2 with `\"mode\": \"extension\"`.\n\n## Dashboard Filters & Controls\n\nFilters and interactive controls share one envelope slice: `controls: {data, order}`. Each entry is `{config, map}` — `config` holds the filter\u002Fcontrol definition, `map` optionally scopes it per tile. Include them at create time or patch them in later (controls merge by key like tiles):\n\n```bash\nomni documents v2-create --body '{\n  \"modelId\": \"your-shared-model-id\",\n  \"name\": \"Filtered Dashboard\",\n  \"controls\": {\n    \"data\": {\n      \"date_filter\": {\n        \"config\": {\n          \"type\": \"date\", \"kind\": \"TIME_FOR_INTERVAL_DURATION\", \"ui_type\": \"PAST\",\n          \"left_side\": \"6 months ago\", \"right_side\": \"6 months\",\n          \"fieldName\": \"order_items.created_at\",\n          \"topic\": \"order_items\", \"base_view\": \"order_items\",\n          \"label\": \"Date Range\"\n        },\n        \"map\": {}\n      },\n      \"state_filter\": {\n        \"config\": {\n          \"type\": \"string\", \"kind\": \"EQUALS\",\n          \"fieldName\": \"users.state\",\n          \"topic\": \"order_items\", \"base_view\": \"order_items\",\n          \"label\": \"State\", \"values\": []\n        },\n        \"map\": {}\n      }\n    },\n    \"order\": [\"date_filter\", \"state_filter\"]\n  },\n  \"queryPresentations\": { … }\n}'\n```\n\n- The keys in `controls.data` are arbitrary IDs and must match `order`.\n- **Filter shapes** (date \u002F string \u002F number \u002F boolean, hidden, required) and **interactive controls** (field\u002Ftimeframe switchers) are documented with examples in [references\u002Fcontrols.md](references\u002Fcontrols.md).\n- `map` scopes a control per tile: `{\"\u003CtileKey>\": false}` excludes a tile, `{\"\u003CtileKey>\": \"\u003CfieldName>\"}` remaps it — for both filters and interactive switchers.\n- A control renders only where a container places it (filter bar, sidebar, or in-tile) — otherwise it lands in the HIDDEN CONTROLS tray. See [references\u002Fcontainers.md](references\u002Fcontainers.md).\n- **Every filter MUST include `fieldName`** with the fully qualified field name (no timeframe bracket for date filters), or it won't bind to any column.\n- To learn exact shapes, build filters in the Omni UI and read them back with `omni documents v2-get` — the `controls` slice is directly reusable in a patch.\n\n## Document Settings\n\n`settings` is a shallow-merged object: `crossfilterEnabled` (click a value in one tile to filter the others), `facetFilters`, `refreshInterval` (seconds, `null` disables), `runQueriesOn` (`\"current-page\"` \u002F `\"all-pages\"` \u002F `null`), and `customText` (`{queryError, queryNoResults}` overrides). Patch only the keys you're changing.\n\n## Layout (containers)\n\nThe `containers` tree decides where tiles and controls render: a reserved `\"filter-bar\"` stack, then one `page` container per page, each holding a 24-column `grid` of tile stacks with `gridPosition {x,y,w,h}`. **Safe default on create: omit `containers`** and let the server lay out tile `\"1\"`, then author the full tree when you add more tiles. When editing, `containers` is a **full replacement** — round-trip the existing array with your change applied. Multi-page dashboards, page switchers, grouped bands, in-tile controls, and sizing rules: [references\u002Fcontainers.md](references\u002Fcontainers.md).\n\n## URL Patterns\n\nAfter creating or finding content, always provide the user a direct link:\n\n```\nDashboard: {OMNI_BASE_URL}\u002Fdashboards\u002F{identifier}\nWorkbook:  {OMNI_BASE_URL}\u002Fw\u002F{identifier}\nDraft:     {OMNI_BASE_URL}\u002Fdashboards\u002F{draftIdentifier}\n```\n\nThe `identifier` comes from the `v2-create`\u002Fpatch responses or `omni documents list`; the `draftIdentifier` comes from the `v2-patch-draft` response or `omni documents list-drafts`.\nReplace `{OMNI_BASE_URL}` with the actual base URL from the active profile or\nenvironment, normalized without a trailing slash. Do not return the literal\nplaceholder string unless credentials are unavailable and you explicitly say the\nURL is a template.\n\n## Validation Loops\n\nEvery dashboard build or update must be validated **before publishing** — broken tiles, bad field references, and misconfigured viz specs fail **silently** (\"Chart unavailable\" \u002F \"No data\") with no API-level error. The full methodology — commands, the viz-spec consistency table, and the post-creation checklist — is in **[references\u002Fvalidation-and-testing.md](references\u002Fvalidation-and-testing.md)**. In brief:\n\n1. **Validate the model** — `omni models validate \u003CmodelId>`; treat any `is_warning: false` issue as an error.\n2. **Test every query first** — run each tile's query via `omni query run` before building (the single most important step). Check for no `error`, `summary.row_count > 0`, and include the same filters you'll use on the dashboard.\n3. **Check viz-spec consistency** — `prefersChart: true`; spec nested in `visConfig.visConfig.config`; a valid `chartType` with matching `visType`\u002F`configType`; correct `_dependentAxis`; the stack\u002Fcolor dimension in `query.pivots`. See [references\u002FvisConfig.md](references\u002FvisConfig.md).\n4. **Verify the draft before publishing** — read it back with `v2-get-draft`, confirm `queryPresentations.data` keys match `order`, run `omni documents get-queries` + `omni query run` per tile, and report each tile's status + row count. After one failed corrected patch, discard the draft and report the blocker.\n\n## Recommended Build Workflows\n\n### API-First (Full Programmatic Creation)\n\n1. **Discover fields** — use `omni-model-explorer` to find topic + fields\n2. **Validate model** — run `omni models validate \u003CmodelId>` and check for errors\n3. **Test each query** — run every query you plan to include via `omni query run` (using `omni-query`) before building the dashboard. Include the same filters you plan to use as controls to confirm they parse correctly. This catches field name typos, missing join paths, bad filter expressions, and permission errors before they become broken tiles.\n4. **Validate viz specs** — check each tile's `chartType`\u002F`visType`\u002Finner `config`\u002F`prefersChart` against the consistency rules before assembling the payload\n5. **Create document** — single `omni documents v2-create` with `queryPresentations` + `controls` + `settings` (and `containers` if multi-tile) in one body\n6. **Verify the dashboard** — read it back with `omni documents v2-get`, confirm all tiles are present and placed, then run each tile's query via `omni documents get-queries` + `omni query run` to verify no broken tiles\n7. **Share the link** — return `{OMNI_BASE_URL}\u002Fdashboards\u002F{identifier}` to the user (only after verification passes)\n8. **Refine in UI** — fine chart styling and pixel-level layout tweaks are still easiest in the Omni UI\n\n### Update Existing Dashboard\n\n1. **Find the dashboard** — use `omni-content-explorer` or `omni documents list` to locate it\n2. **Read its current state** — `omni documents v2-get \u003Cidentifier>`\n3. **Author the patch** — merge-by-key edits to `queryPresentations`\u002F`controls`\u002F`settings`; full `containers` tree if layout changes; re-author inner vis configs nested under `config`\n4. **Validate changes** — run new\u002Fmodified queries via `omni query run`; check viz specs against the consistency rules\n5. **Patch the draft** — `omni documents v2-patch-draft \u003Cidentifier> --body …` (with a `summary`)\n6. **Verify the draft** — `v2-get-draft`, then `get-queries` + `query run` on modified tiles\n7. **Publish** — `omni documents v2-publish-draft \u003Cidentifier>`; on failure, `discard-draft` and report\n8. **Share the link** — return `{OMNI_BASE_URL}\u002Fdashboards\u002F{identifier}` to the user (only after verification passes)\n\n### UI-First (Hybrid Approach)\n\n1. **Prepare the Model** — use `omni-model-builder` for shared fields, or the workbook-model flow above for dashboard-specific fields\n2. **Build in UI** — add tiles, choose viz types, arrange the grid, set filters\n3. **Iterate via API** — read the structure back with `v2-get`, update model fields, extract queries for reuse\n\n## Dashboard Downloads\n\n```bash\n# Start async download\nomni dashboards download \u003CdashboardId> --body '{ \"format\": \"pdf\" }'\n\n# Poll job\nomni dashboards download-status \u003CdashboardId> \u003CjobId>\n```\n\n## Docs Reference\n\n- [Documents API](https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fdocuments.md) · [Dashboard Downloads](https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fdashboard-downloads.md) · [Query API](https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fqueries.md) · [Schedules API](https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fschedules.md) · [Visualization Types](https:\u002F\u002Fdocs.omni.co\u002Fvisualize-present\u002Fvisualizations.md)\n- **Skill references**: [documents-v2.md](references\u002Fdocuments-v2.md) · [containers.md](references\u002Fcontainers.md) · [controls.md](references\u002Fcontrols.md) · [queryPresentations.md](references\u002FqueryPresentations.md) · [visConfig.md](references\u002FvisConfig.md) · [markdown-tiles.md](references\u002Fmarkdown-tiles.md) · [mustache.md](references\u002Fmustache.md) · [updating-dashboards.md](references\u002Fupdating-dashboards.md) · [branch-bound-drafts.md](references\u002Fbranch-bound-drafts.md) · [validation-and-testing.md](references\u002Fvalidation-and-testing.md)\n\n## Related Skills\n\n- **omni-model-explorer** — understand available fields\n- **omni-model-builder** — create shared model fields\n- **omni-query** — test queries before adding to dashboards\n- **omni-content-explorer** — find existing dashboards to learn from\n- **omni-embed** — embed dashboards you've built in external apps\n",{"data":41,"body":42},{"name":4,"description":6},{"type":43,"children":44},"root",[45,53,59,91,188,195,1327,1333,1498,1608,1698,1704,1804,1847,1852,1895,2033,2127,2133,2145,2210,2322,2368,2374,2468,2573,2624,2629,2636,2698,2762,2768,2787,3225,3282,3290,3422,3453,3459,3569,3594,3600,3639,3644,3650,3712,3732,3738,3807,3812,3818,3830,4056,4070,4076,4265,4277,4285,4385,4427,4443,4529,4573,4636,4649,4665,4777,4809,4815,4820,4922,4963,4968,5002,5254,5369,5375,5458,5464,5544,5550,5555,5565,5617,5622,5650,5820,5826,5832,6028,6033,6219,6225,6271,6277,6406,6412,6527,6533,6582],{"type":46,"tag":47,"props":48,"children":49},"element","h1",{"id":4},[50],{"type":51,"value":52},"text","Omni Content Builder",{"type":46,"tag":54,"props":55,"children":56},"p",{},[57],{"type":51,"value":58},"Create, update, and manage Omni documents and dashboards programmatically via the Omni CLI — document lifecycle, drafts, workbook models, filters, controls, and dashboard content.",{"type":46,"tag":60,"props":61,"children":62},"blockquote",{},[63],{"type":46,"tag":54,"props":64,"children":65},{},[66,72,74,81,83,89],{"type":46,"tag":67,"props":68,"children":69},"strong",{},[70],{"type":51,"value":71},"Tip",{"type":51,"value":73},": Use ",{"type":46,"tag":75,"props":76,"children":78},"code",{"className":77},[],[79],{"type":51,"value":80},"omni-model-explorer",{"type":51,"value":82}," to understand available fields and ",{"type":46,"tag":75,"props":84,"children":86},{"className":85},[],[87],{"type":51,"value":88},"omni-content-explorer",{"type":51,"value":90}," to find existing dashboards to modify or learn from.",{"type":46,"tag":54,"props":92,"children":93},{},[94,96,101,103,109,111,117,119,125,126,132,134,140,142,147,149,155,157,163,164,170,171,177,179,186],{"type":51,"value":95},"Documents are created and edited through the ",{"type":46,"tag":67,"props":97,"children":98},{},[99],{"type":51,"value":100},"v2 documents API",{"type":51,"value":102}," (",{"type":46,"tag":75,"props":104,"children":106},{"className":105},[],[107],{"type":51,"value":108},"omni documents v2-*",{"type":51,"value":110},") — an explicit envelope of ",{"type":46,"tag":75,"props":112,"children":114},{"className":113},[],[115],{"type":51,"value":116},"queryPresentations",{"type":51,"value":118},", ",{"type":46,"tag":75,"props":120,"children":122},{"className":121},[],[123],{"type":51,"value":124},"controls",{"type":51,"value":118},{"type":46,"tag":75,"props":127,"children":129},{"className":128},[],[130],{"type":51,"value":131},"containers",{"type":51,"value":133},", and ",{"type":46,"tag":75,"props":135,"children":137},{"className":136},[],[138],{"type":51,"value":139},"settings",{"type":51,"value":141},", edited through a ",{"type":46,"tag":67,"props":143,"children":144},{},[145],{"type":51,"value":146},"draft → publish",{"type":51,"value":148}," flow. This is the only path for building, reading, or changing a document — never fall back to the v1 ",{"type":46,"tag":75,"props":150,"children":152},{"className":151},[],[153],{"type":51,"value":154},"documents create",{"type":51,"value":156},"\u002F",{"type":46,"tag":75,"props":158,"children":160},{"className":159},[],[161],{"type":51,"value":162},"get",{"type":51,"value":156},{"type":46,"tag":75,"props":165,"children":167},{"className":166},[],[168],{"type":51,"value":169},"put",{"type":51,"value":156},{"type":46,"tag":75,"props":172,"children":174},{"className":173},[],[175],{"type":51,"value":176},"update",{"type":51,"value":178}," commands. A few document-management operations (list, delete, move, duplicate, downloads) have no v2 form; see ",{"type":46,"tag":180,"props":181,"children":183},"a",{"href":182},"#commands",[184],{"type":51,"value":185},"Commands",{"type":51,"value":187}," below.",{"type":46,"tag":189,"props":190,"children":192},"h2",{"id":191},"known-issues-safe-defaults",[193],{"type":51,"value":194},"Known Issues & Safe Defaults",{"type":46,"tag":196,"props":197,"children":198},"ul",{},[199,233,364,411,442,475,602,662,760,811,835,845,870,900,922,1040,1076,1149,1196,1206,1223,1268,1286,1303],{"type":46,"tag":200,"props":201,"children":202},"li",{},[203,208,210,216,218,224,226,231],{"type":46,"tag":67,"props":204,"children":205},{},[206],{"type":51,"value":207},"Always run the full validation loop",{"type":51,"value":209}," — see ",{"type":46,"tag":180,"props":211,"children":213},{"href":212},"#validation-loops",[214],{"type":51,"value":215},"Validation Loops",{"type":51,"value":217}," below. At minimum: validate the model, test every query via ",{"type":46,"tag":75,"props":219,"children":221},{"className":220},[],[222],{"type":51,"value":223},"omni query run",{"type":51,"value":225},", check viz spec consistency, and verify the dashboard by reading the draft back and executing its queries ",{"type":46,"tag":67,"props":227,"children":228},{},[229],{"type":51,"value":230},"before publishing",{"type":51,"value":232},".",{"type":46,"tag":200,"props":234,"children":235},{},[236,249,251,257,259,270,272,278,279,285,287,293,295,300,302,307,309],{"type":46,"tag":67,"props":237,"children":238},{},[239,241,247],{"type":51,"value":240},"Never round-trip a ",{"type":46,"tag":75,"props":242,"children":244},{"className":243},[],[245],{"type":51,"value":246},"v2-get",{"type":51,"value":248}," tile back into a patch unchanged",{"type":51,"value":250}," — a GET returns the inner vis config ",{"type":46,"tag":252,"props":253,"children":254},"em",{},[255],{"type":51,"value":256},"flat",{"type":51,"value":258},", but a patch only persists it ",{"type":46,"tag":252,"props":260,"children":261},{},[262,264],{"type":51,"value":263},"nested under ",{"type":46,"tag":75,"props":265,"children":267},{"className":266},[],[268],{"type":51,"value":269},"config",{"type":51,"value":271},". Re-sending the flat shape — even for an unrelated edit like a rename — silently drops the vis config (KPI loses its number, charts lose ",{"type":46,"tag":75,"props":273,"children":275},{"className":274},[],[276],{"type":51,"value":277},"mark",{"type":51,"value":156},{"type":46,"tag":75,"props":280,"children":282},{"className":281},[],[283],{"type":51,"value":284},"series",{"type":51,"value":286},", markdown goes blank). Always re-author the inner ",{"type":46,"tag":75,"props":288,"children":290},{"className":289},[],[291],{"type":51,"value":292},"visConfig",{"type":51,"value":294}," nested under ",{"type":46,"tag":75,"props":296,"children":298},{"className":297},[],[299],{"type":51,"value":269},{"type":51,"value":301},". See ",{"type":46,"tag":180,"props":303,"children":305},{"href":304},"references\u002Fdocuments-v2.md",[306],{"type":51,"value":304},{"type":51,"value":308},".\n",{"type":46,"tag":196,"props":310,"children":311},{},[312],{"type":46,"tag":200,"props":313,"children":314},{},[315,327,329,334,336,341,343,348,350,355,357,362],{"type":46,"tag":67,"props":316,"children":317},{},[318,320,325],{"type":51,"value":319},"This applies to ",{"type":46,"tag":252,"props":321,"children":322},{},[323],{"type":51,"value":324},"any",{"type":51,"value":326}," write whose tile JSON came from a GET payload — not just edits.",{"type":51,"value":328}," Restoring, reverting, duplicating, or moving a tile by copying it out of a ",{"type":46,"tag":75,"props":330,"children":332},{"className":331},[],[333],{"type":51,"value":246},{"type":51,"value":335},"\u002Fsnapshot and patching it back is ",{"type":46,"tag":252,"props":337,"children":338},{},[339],{"type":51,"value":340},"also",{"type":51,"value":342}," a round-trip: the inner config is flat and will be dropped (renders \"No chart available\"). A \"restore to how it was\" still needs the config re-nested. And ",{"type":46,"tag":67,"props":344,"children":345},{},[346],{"type":51,"value":347},"verify the specific tile you wrote",{"type":51,"value":349}," — re-read it (",{"type":46,"tag":75,"props":351,"children":353},{"className":352},[],[354],{"type":51,"value":246},{"type":51,"value":356},") and run its query to confirm the config persisted; if a visual\u002Fpreview tool is available, you can also request a screenshot to confirm the render — ",{"type":46,"tag":252,"props":358,"children":359},{},[360],{"type":51,"value":361},"including reverts",{"type":51,"value":363},"; don't assume a restore is safe.",{"type":46,"tag":200,"props":365,"children":366},{},[367,387,389,395,397,402,404,409],{"type":46,"tag":67,"props":368,"children":369},{},[370,372,377,379,385],{"type":51,"value":371},"Patches merge by key; only ",{"type":46,"tag":75,"props":373,"children":375},{"className":374},[],[376],{"type":51,"value":131},{"type":51,"value":378}," (and the ",{"type":46,"tag":75,"props":380,"children":382},{"className":381},[],[383],{"type":51,"value":384},"order",{"type":51,"value":386}," arrays) are full replacements.",{"type":51,"value":388}," To change one tile, send just that key. To delete a tile, set its key to ",{"type":46,"tag":75,"props":390,"children":392},{"className":391},[],[393],{"type":51,"value":394},"null",{"type":51,"value":396}," AND remove it from ",{"type":46,"tag":75,"props":398,"children":400},{"className":399},[],[401],{"type":51,"value":384},{"type":51,"value":403},". When you send ",{"type":46,"tag":75,"props":405,"children":407},{"className":406},[],[408],{"type":51,"value":131},{"type":51,"value":410},", send the complete layout tree with your edit applied.",{"type":46,"tag":200,"props":412,"children":413},{},[414,427,429,434,436,441],{"type":46,"tag":67,"props":415,"children":416},{},[417,419,425],{"type":51,"value":418},"A multi-tile ",{"type":46,"tag":75,"props":420,"children":422},{"className":421},[],[423],{"type":51,"value":424},"v2-create",{"type":51,"value":426}," only lays out the first tile",{"type":51,"value":428}," — the rest are stored but render nowhere until you author the full ",{"type":46,"tag":75,"props":430,"children":432},{"className":431},[],[433],{"type":51,"value":131},{"type":51,"value":435}," tree. See ",{"type":46,"tag":180,"props":437,"children":439},{"href":438},"references\u002Fcontainers.md",[440],{"type":51,"value":438},{"type":51,"value":232},{"type":46,"tag":200,"props":443,"children":444},{},[445,458,460,466,468,473],{"type":46,"tag":67,"props":446,"children":447},{},[448,450,456],{"type":51,"value":449},"Tile ",{"type":46,"tag":75,"props":451,"children":453},{"className":452},[],[454],{"type":51,"value":455},"\"1\"",{"type":51,"value":457}," on create merges over a server seed tile",{"type":51,"value":459}," — some seed properties (e.g. ",{"type":46,"tag":75,"props":461,"children":463},{"className":462},[],[464],{"type":51,"value":465},"automaticVis: true",{"type":51,"value":467},") can win over what you sent. Read the document back and re-patch tile ",{"type":46,"tag":75,"props":469,"children":471},{"className":470},[],[472],{"type":51,"value":455},{"type":51,"value":474}," if its exact fields matter.",{"type":46,"tag":200,"props":476,"children":477},{},[478,491,493,499,500,506,507,513,514,520,521,527,528,534,535,541,542,548,550,556,557,563,564,570,571,577,579,584,586,592,594,600],{"type":46,"tag":67,"props":479,"children":480},{},[481,483,489],{"type":51,"value":482},"Every tile ",{"type":46,"tag":75,"props":484,"children":486},{"className":485},[],[487],{"type":51,"value":488},"query",{"type":51,"value":490}," must include the full collection-field set",{"type":51,"value":492}," — ",{"type":46,"tag":75,"props":494,"children":496},{"className":495},[],[497],{"type":51,"value":498},"sorts",{"type":51,"value":118},{"type":46,"tag":75,"props":501,"children":503},{"className":502},[],[504],{"type":51,"value":505},"filters",{"type":51,"value":118},{"type":46,"tag":75,"props":508,"children":510},{"className":509},[],[511],{"type":51,"value":512},"calculations",{"type":51,"value":118},{"type":46,"tag":75,"props":515,"children":517},{"className":516},[],[518],{"type":51,"value":519},"column_totals",{"type":51,"value":118},{"type":46,"tag":75,"props":522,"children":524},{"className":523},[],[525],{"type":51,"value":526},"row_totals",{"type":51,"value":118},{"type":46,"tag":75,"props":529,"children":531},{"className":530},[],[532],{"type":51,"value":533},"fill_fields",{"type":51,"value":118},{"type":46,"tag":75,"props":536,"children":538},{"className":537},[],[539],{"type":51,"value":540},"pivots",{"type":51,"value":118},{"type":46,"tag":75,"props":543,"children":545},{"className":544},[],[546],{"type":51,"value":547},"userEditedSQL",{"type":51,"value":549}," (empty values are fine) alongside ",{"type":46,"tag":75,"props":551,"children":553},{"className":552},[],[554],{"type":51,"value":555},"table",{"type":51,"value":118},{"type":46,"tag":75,"props":558,"children":560},{"className":559},[],[561],{"type":51,"value":562},"fields",{"type":51,"value":118},{"type":46,"tag":75,"props":565,"children":567},{"className":566},[],[568],{"type":51,"value":569},"limit",{"type":51,"value":118},{"type":46,"tag":75,"props":572,"children":574},{"className":573},[],[575],{"type":51,"value":576},"join_paths_from_topic_name",{"type":51,"value":578},". Omitting the schema-required ones is a 400 with per-field errors. Do ",{"type":46,"tag":67,"props":580,"children":581},{},[582],{"type":51,"value":583},"not",{"type":51,"value":585}," include ",{"type":46,"tag":75,"props":587,"children":589},{"className":588},[],[590],{"type":51,"value":591},"modelId",{"type":51,"value":593}," or ",{"type":46,"tag":75,"props":595,"children":597},{"className":596},[],[598],{"type":51,"value":599},"model_extension_id",{"type":51,"value":601}," — the server anchors tiles to the document's workbook model and silently rewrites any value you send.",{"type":46,"tag":200,"props":603,"children":604},{},[605,610,612,616,618,623,625,631,633,638,640,646,648,653,655,660],{"type":46,"tag":67,"props":606,"children":607},{},[608],{"type":51,"value":609},"HARD RULE — never build a non-topic tile from handed-over SQL without an explicit user decision.",{"type":51,"value":611}," When the user hands you SQL (or a metric) and existing topics don't express it, you may ",{"type":46,"tag":67,"props":613,"children":614},{},[615],{"type":51,"value":583},{"type":51,"value":617}," silently convert it to a non-topic \u002F ",{"type":46,"tag":75,"props":619,"children":621},{"className":620},[],[622],{"type":51,"value":547},{"type":51,"value":624}," tile. First apply the topic-first reflex (see ",{"type":46,"tag":75,"props":626,"children":628},{"className":627},[],[629],{"type":51,"value":630},"omni-query",{"type":51,"value":632},"): map each query's intent to a topic. If none fits, ",{"type":46,"tag":67,"props":634,"children":635},{},[636],{"type":51,"value":637},"stop and ask",{"type":51,"value":639}," whether to model it — extend a topic or create a new one (on a branch via ",{"type":46,"tag":75,"props":641,"children":643},{"className":642},[],[644],{"type":51,"value":645},"omni-model-builder",{"type":51,"value":647},", validated, merged only with confirmation). Only build a non-topic \u002F raw-SQL tile after the user has ",{"type":46,"tag":67,"props":649,"children":650},{},[651],{"type":51,"value":652},"explicitly chosen",{"type":51,"value":654}," that path (declined modeling, or it's a genuine one-off \u002F ",{"type":46,"tag":75,"props":656,"children":658},{"className":657},[],[659],{"type":51,"value":547},{"type":51,"value":661}," is required). Non-topic + Access Boost is never the default for handed-over SQL — it requires that explicit decision. This is the easiest thing to get wrong when \"build a dashboard\" starts from raw SQL.",{"type":46,"tag":200,"props":663,"children":664},{},[665,670,672,677,679,684,686,691,693,698,700,705,707,712,714,719,721,726,728,733,735,740,742,751,753,758],{"type":46,"tag":67,"props":666,"children":667},{},[668],{"type":51,"value":669},"Non-topic \u002F raw-SQL tiles → ask about the audience, then counsel Access Boost.",{"type":51,"value":671}," When a tile's query is non-topic — a populated ",{"type":46,"tag":75,"props":673,"children":675},{"className":674},[],[676],{"type":51,"value":547},{"type":51,"value":678}," (raw-SQL tile) or a bare base-view query (no ",{"type":46,"tag":75,"props":680,"children":682},{"className":681},[],[683],{"type":51,"value":576},{"type":51,"value":685},") — it is ",{"type":46,"tag":67,"props":687,"children":688},{},[689],{"type":51,"value":690},"invisible to Viewer \u002F Restricted Querier roles by default",{"type":51,"value":692},". Before finalizing such content, ",{"type":46,"tag":67,"props":694,"children":695},{},[696],{"type":51,"value":697},"ask the user whether the dashboard's audience includes Restricted Queriers or Viewers",{"type":51,"value":699},". If it does, ",{"type":46,"tag":67,"props":701,"children":702},{},[703],{"type":51,"value":704},"advise",{"type":51,"value":706}," (don't silently enable) ",{"type":46,"tag":67,"props":708,"children":709},{},[710],{"type":51,"value":711},"Access Boost",{"type":51,"value":713},": it makes those tiles viewable ",{"type":46,"tag":252,"props":715,"children":716},{},[717],{"type":51,"value":718},"on the dashboard",{"type":51,"value":720}," (dashboard-only — not the underlying workbook) for chosen users\u002Fgroups or the whole org — provided the org capability is enabled and the caller has Manager on the document. Because it loosens access controls, treat enabling it as a separate, explicitly-confirmed step: recommend the ",{"type":46,"tag":67,"props":722,"children":723},{},[724],{"type":51,"value":725},"narrowest scope",{"type":51,"value":727}," that satisfies the need (specific users\u002Fgroups over org-wide) and get a clear go-ahead before it's applied. See the ",{"type":46,"tag":252,"props":729,"children":730},{},[731],{"type":51,"value":732},"Raw-SQL tiles",{"type":51,"value":734}," recipe in ",{"type":46,"tag":180,"props":736,"children":738},{"href":737},"references\u002FqueryPresentations.md",[739],{"type":51,"value":737},{"type":51,"value":741}," and ",{"type":46,"tag":67,"props":743,"children":744},{},[745],{"type":46,"tag":75,"props":746,"children":748},{"className":747},[],[749],{"type":51,"value":750},"omni-admin",{"type":51,"value":752}," → ",{"type":46,"tag":252,"props":754,"children":755},{},[756],{"type":51,"value":757},"Document Permissions",{"type":51,"value":759}," (which carries the full confirmation checklist and the commands\u002Fprerequisite).",{"type":46,"tag":200,"props":761,"children":762},{},[763,774,776,781,783,789,790,796,797,803,805,810],{"type":46,"tag":67,"props":764,"children":765},{},[766,772],{"type":46,"tag":75,"props":767,"children":769},{"className":768},[],[770],{"type":51,"value":771},"--body",{"type":51,"value":773}," silently wins over shorthand flags",{"type":51,"value":775}," — if you pass ",{"type":46,"tag":75,"props":777,"children":779},{"className":778},[],[780],{"type":51,"value":771},{"type":51,"value":782},", every promoted flag (",{"type":46,"tag":75,"props":784,"children":786},{"className":785},[],[787],{"type":51,"value":788},"--name",{"type":51,"value":118},{"type":46,"tag":75,"props":791,"children":793},{"className":792},[],[794],{"type":51,"value":795},"--summary",{"type":51,"value":118},{"type":46,"tag":75,"props":798,"children":800},{"className":799},[],[801],{"type":51,"value":802},"--branch-id",{"type":51,"value":804},", …) is ignored without warning. Put those fields inside the JSON body instead, or use flags alone with no ",{"type":46,"tag":75,"props":806,"children":808},{"className":807},[],[809],{"type":51,"value":771},{"type":51,"value":232},{"type":46,"tag":200,"props":812,"children":813},{},[814,819,821,827,828,834],{"type":46,"tag":67,"props":815,"children":816},{},[817],{"type":51,"value":818},"Draft commands take the document identifier first, then the draft identifier",{"type":51,"value":820},": ",{"type":46,"tag":75,"props":822,"children":824},{"className":823},[],[825],{"type":51,"value":826},"v2-get-draft \u003Cidentifier> \u003CdraftIdentifier>",{"type":51,"value":741},{"type":46,"tag":75,"props":829,"children":831},{"className":830},[],[832],{"type":51,"value":833},"v2-patch-draft-by-identifier \u003Cidentifier> \u003CdraftIdentifier>",{"type":51,"value":232},{"type":46,"tag":200,"props":836,"children":837},{},[838,843],{"type":46,"tag":67,"props":839,"children":840},{},[841],{"type":51,"value":842},"Classic-layout dashboards return 422 from every v2 endpoint",{"type":51,"value":844}," — \"Upgrade the dashboard to the advanced layout before editing it through the API.\" There is no API fallback; ask the user to upgrade the layout in the Omni UI, then retry.",{"type":46,"tag":200,"props":846,"children":847},{},[848,853,855,861,862,868],{"type":46,"tag":67,"props":849,"children":850},{},[851],{"type":51,"value":852},"The workbook model ID rotates on every draft → publish cycle",{"type":51,"value":854}," — each draft clones the workbook model (carrying extensions along), and publishing swaps the document to the clone. Never cache a workbook model ID; read it fresh from the draft's ",{"type":46,"tag":75,"props":856,"children":858},{"className":857},[],[859],{"type":51,"value":860},"workbookModelId",{"type":51,"value":102},{"type":46,"tag":75,"props":863,"children":865},{"className":864},[],[866],{"type":51,"value":867},"omni documents list-drafts \u003Cidentifier>",{"type":51,"value":869},") each time you need it.",{"type":46,"tag":200,"props":871,"children":872},{},[873,884,886,892,894,899],{"type":46,"tag":67,"props":874,"children":875},{},[876,878],{"type":51,"value":877},"Interactive controls scope per-tile via ",{"type":46,"tag":75,"props":879,"children":881},{"className":880},[],[882],{"type":51,"value":883},"map",{"type":51,"value":885}," — a field\u002Ftimeframe switcher's ",{"type":46,"tag":75,"props":887,"children":889},{"className":888},[],[890],{"type":51,"value":891},"{\"\u003CtileKey>\": false}",{"type":51,"value":893}," excludes that tile, exactly like a filter's. See ",{"type":46,"tag":180,"props":895,"children":897},{"href":896},"references\u002Fcontrols.md",[898],{"type":51,"value":896},{"type":51,"value":232},{"type":46,"tag":200,"props":901,"children":902},{},[903,914,916,921],{"type":46,"tag":67,"props":904,"children":905},{},[906,908],{"type":51,"value":907},"Markdown tiles need ",{"type":46,"tag":75,"props":909,"children":911},{"className":910},[],[912],{"type":51,"value":913},"automaticVis: false",{"type":51,"value":915}," — otherwise the renderer auto-derives a chart and the tile is blank. See ",{"type":46,"tag":180,"props":917,"children":919},{"href":918},"references\u002FvisConfig.md",[920],{"type":51,"value":918},{"type":51,"value":232},{"type":46,"tag":200,"props":923,"children":924},{},[925,950,952,961,962,966,968,974,976,981,983,988,990,996,998,1003,1005,1010,1012,1017,1018,1024,1026,1032,1034,1039],{"type":46,"tag":67,"props":926,"children":927},{},[928,930,935,937,942,944,949],{"type":51,"value":929},"Mustache: reference a ",{"type":46,"tag":252,"props":931,"children":932},{},[933],{"type":51,"value":934},"filter",{"type":51,"value":936}," under ",{"type":46,"tag":75,"props":938,"children":940},{"className":939},[],[941],{"type":51,"value":505},{"type":51,"value":943},", not ",{"type":46,"tag":75,"props":945,"children":947},{"className":946},[],[948],{"type":51,"value":124},{"type":51,"value":232},{"type":51,"value":951}," To caption a tile with a filter's current value (e.g. a date window), use ",{"type":46,"tag":67,"props":953,"children":954},{},[955],{"type":46,"tag":75,"props":956,"children":958},{"className":957},[],[959],{"type":51,"value":960},"{{filters.…summary}}",{"type":51,"value":492},{"type":46,"tag":252,"props":963,"children":964},{},[965],{"type":51,"value":583},{"type":51,"value":967}," ",{"type":46,"tag":75,"props":969,"children":971},{"className":970},[],[972],{"type":51,"value":973},"{{controls.\u003Cid>.…}}",{"type":51,"value":975}," (a filter is configured as a control but mustache routes it to ",{"type":46,"tag":75,"props":977,"children":979},{"className":978},[],[980],{"type":51,"value":505},{"type":51,"value":982},"; the ",{"type":46,"tag":75,"props":984,"children":986},{"className":985},[],[987],{"type":51,"value":124},{"type":51,"value":989}," namespace is for ",{"type":46,"tag":75,"props":991,"children":993},{"className":992},[],[994],{"type":51,"value":995},"FIELD_SELECTION",{"type":51,"value":997},"\u002Fpicker\u002FTop-N controls and renders ",{"type":46,"tag":67,"props":999,"children":1000},{},[1001],{"type":51,"value":1002},"empty",{"type":51,"value":1004}," for a filter). The ",{"type":46,"tag":75,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":51,"value":505},{"type":51,"value":1011}," key is ",{"type":46,"tag":67,"props":1013,"children":1014},{},[1015],{"type":51,"value":1016},"context-dependent",{"type":51,"value":820},{"type":46,"tag":75,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":51,"value":1023},"view.field",{"type":51,"value":1025}," in a markdown-viz tile (resolved against the tile's own query, so one token works per-tile), the control ",{"type":46,"tag":75,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":51,"value":1031},"id",{"type":51,"value":1033}," in a dashboard text tile. Full namespace\u002Ftoken map + scenarios in ",{"type":46,"tag":180,"props":1035,"children":1037},{"href":1036},"references\u002Fmustache.md",[1038],{"type":51,"value":1036},{"type":51,"value":232},{"type":46,"tag":200,"props":1041,"children":1042},{},[1043,1054,1056,1062,1064,1070,1071,1075],{"type":46,"tag":67,"props":1044,"children":1045},{},[1046,1052],{"type":46,"tag":75,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":51,"value":1051},"query.filters",{"type":51,"value":1053}," needs the object form",{"type":51,"value":1055}," — the relative-date shorthand (",{"type":46,"tag":75,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":51,"value":1061},"\"last 6 months\"",{"type":51,"value":1063},") throws a 500; send ",{"type":46,"tag":75,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":51,"value":1069},"{type:\"date\", kind:\"TIME_FOR_INTERVAL_DURATION\", ui_type:\"PAST\", left_side, right_side}",{"type":51,"value":301},{"type":46,"tag":180,"props":1072,"children":1073},{"href":304},[1074],{"type":51,"value":304},{"type":51,"value":232},{"type":46,"tag":200,"props":1077,"children":1078},{},[1079,1091,1093,1099,1101,1106,1108,1113,1115,1119,1121,1126,1128,1133,1135,1140,1142,1147],{"type":46,"tag":67,"props":1080,"children":1081},{},[1082,1084,1089],{"type":51,"value":1083},"A tile with no real ",{"type":46,"tag":75,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":51,"value":292},{"type":51,"value":1090}," renders as \"Item missing\"",{"type":51,"value":1092}," — the server seeds new tiles with ",{"type":46,"tag":75,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":51,"value":1098},"visConfig.visType: null",{"type":51,"value":1100}," + ",{"type":46,"tag":75,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":51,"value":913},{"type":51,"value":1107},", which draws nothing. Every tile needs either an explicit ",{"type":46,"tag":75,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":51,"value":292},{"type":51,"value":1114}," (e.g. the table recipe in ",{"type":46,"tag":180,"props":1116,"children":1117},{"href":918},[1118],{"type":51,"value":918},{"type":51,"value":1120},") or ",{"type":46,"tag":75,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":51,"value":465},{"type":51,"value":1127}," to auto-derive one. Layout is separate: a multi-tile ",{"type":46,"tag":75,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":51,"value":424},{"type":51,"value":1134}," lays out all tiles you pass in ",{"type":46,"tag":75,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":51,"value":384},{"type":51,"value":1141},", so \"Item missing\" is a vis-config gap, not a ",{"type":46,"tag":75,"props":1143,"children":1145},{"className":1144},[],[1146],{"type":51,"value":131},{"type":51,"value":1148}," gap.",{"type":46,"tag":200,"props":1150,"children":1151},{},[1152,1157,1159,1165,1167,1173,1175,1179,1180,1186,1188,1194],{"type":46,"tag":67,"props":1153,"children":1154},{},[1155],{"type":51,"value":1156},"Chart rendering",{"type":51,"value":1158},": Complex chart types may show \"No chart available\" if the inner config, ",{"type":46,"tag":75,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":51,"value":1164},"visType",{"type":51,"value":1166},", or ",{"type":46,"tag":75,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":51,"value":1172},"prefersChart",{"type":51,"value":1174}," are misconfigured. If the user asks for a specific chart, include the complete chart-specific config from ",{"type":46,"tag":180,"props":1176,"children":1177},{"href":918},[1178],{"type":51,"value":918},{"type":51,"value":294},{"type":46,"tag":75,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":51,"value":1185},"visConfig.visConfig.config",{"type":51,"value":1187},". Use ",{"type":46,"tag":75,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":51,"value":1193},"chartType: \"table\"",{"type":51,"value":1195}," only as a deliberate table fallback, not for requested charts.",{"type":46,"tag":200,"props":1197,"children":1198},{},[1199,1204],{"type":46,"tag":67,"props":1200,"children":1201},{},[1202],{"type":51,"value":1203},"Every query must include at least one measure",{"type":51,"value":1205}," — a query with only dimensions produces empty\u002Fnonsense tiles (e.g., just months with no data).",{"type":46,"tag":200,"props":1207,"children":1208},{},[1209,1214,1216,1221],{"type":46,"tag":67,"props":1210,"children":1211},{},[1212],{"type":51,"value":1213},"Boolean filters may be silently dropped",{"type":51,"value":1215}," when a ",{"type":46,"tag":75,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":51,"value":540},{"type":51,"value":1222}," array is present (reported Omni bug). If boolean filters aren't applying, remove the pivot and test again.",{"type":46,"tag":200,"props":1224,"children":1225},{},[1226,1244,1246,1251,1253,1258,1260,1266],{"type":46,"tag":67,"props":1227,"children":1228},{},[1229,1231,1237,1239],{"type":51,"value":1230},"Use ",{"type":46,"tag":75,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":51,"value":1236},"identifier",{"type":51,"value":1238}," not ",{"type":46,"tag":75,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":51,"value":1031},{"type":51,"value":1245}," — get a document's ",{"type":46,"tag":75,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":51,"value":1236},{"type":51,"value":1252}," from the ",{"type":46,"tag":75,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":51,"value":424},{"type":51,"value":1259},"\u002Fpatch responses or ",{"type":46,"tag":75,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":51,"value":1265},"omni documents list",{"type":51,"value":1267}," records.",{"type":46,"tag":200,"props":1269,"children":1270},{},[1271,1284],{"type":46,"tag":67,"props":1272,"children":1273},{},[1274,1276,1282],{"type":51,"value":1275},"Do not use ",{"type":46,"tag":75,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":51,"value":1281},"omni unstable documents-import",{"type":51,"value":1283}," to update an existing dashboard",{"type":51,"value":1285}," — import creates a new document and may drop newly-added tiles. Use the draft flow on the existing document.",{"type":46,"tag":200,"props":1287,"children":1288},{},[1289,1294,1296,1301],{"type":46,"tag":67,"props":1290,"children":1291},{},[1292],{"type":51,"value":1293},"Do not persist invalid query-level filters",{"type":51,"value":1295}," — if ",{"type":46,"tag":75,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":51,"value":223},{"type":51,"value":1302}," returns a server-side parsing error for a tile query filter, validate the unfiltered base query once. Do not save that broken filter into the tile. If a dashboard-level control can satisfy the request, use that path and verify by readback; otherwise leave the dashboard unchanged and report the blocker.",{"type":46,"tag":200,"props":1304,"children":1305},{},[1306,1311,1313,1318,1319,1325],{"type":46,"tag":67,"props":1307,"children":1308},{},[1309],{"type":51,"value":1310},"Bound failed updates",{"type":51,"value":1312}," — if a patch returns a validation error, stop after one corrected retry at most. Do not try repeated filter syntaxes or endpoint loops. Because edits happen on a draft, recovery is clean: ",{"type":46,"tag":67,"props":1314,"children":1315},{},[1316],{"type":51,"value":1317},"discard the draft",{"type":51,"value":102},{"type":46,"tag":75,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":51,"value":1324},"omni documents discard-draft \u003Cidentifier>",{"type":51,"value":1326},") and report what was preserved — the published document was never touched.",{"type":46,"tag":189,"props":1328,"children":1330},{"id":1329},"prerequisites",[1331],{"type":51,"value":1332},"Prerequisites",{"type":46,"tag":1334,"props":1335,"children":1340},"pre",{"className":1336,"code":1337,"language":1338,"meta":1339,"style":1339},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Verify the Omni CLI is installed — if not, ask the user to install it\n# See: https:\u002F\u002Fgithub.com\u002Fexploreomni\u002Fcli#readme\ncommand -v omni >\u002Fdev\u002Fnull || echo \"ERROR: Omni CLI is not installed.\"\n\n# Verify the CLI has the v2 documents commands — if not, ask the user to upgrade it\nomni documents v2-get --help >\u002Fdev\u002Fnull 2>&1 || echo \"ERROR: CLI is too old for the v2 documents API — upgrade it.\"\n","bash","",[1341],{"type":46,"tag":75,"props":1342,"children":1343},{"__ignoreMap":1339},[1344,1356,1365,1421,1431,1440],{"type":46,"tag":1345,"props":1346,"children":1349},"span",{"class":1347,"line":1348},"line",1,[1350],{"type":46,"tag":1345,"props":1351,"children":1353},{"style":1352},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1354],{"type":51,"value":1355},"# Verify the Omni CLI is installed — if not, ask the user to install it\n",{"type":46,"tag":1345,"props":1357,"children":1359},{"class":1347,"line":1358},2,[1360],{"type":46,"tag":1345,"props":1361,"children":1362},{"style":1352},[1363],{"type":51,"value":1364},"# See: https:\u002F\u002Fgithub.com\u002Fexploreomni\u002Fcli#readme\n",{"type":46,"tag":1345,"props":1366,"children":1367},{"class":1347,"line":33},[1368,1374,1380,1385,1391,1396,1401,1406,1411,1416],{"type":46,"tag":1345,"props":1369,"children":1371},{"style":1370},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1372],{"type":51,"value":1373},"command",{"type":46,"tag":1345,"props":1375,"children":1377},{"style":1376},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1378],{"type":51,"value":1379}," -v",{"type":46,"tag":1345,"props":1381,"children":1382},{"style":1376},[1383],{"type":51,"value":1384}," omni",{"type":46,"tag":1345,"props":1386,"children":1388},{"style":1387},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1389],{"type":51,"value":1390}," >",{"type":46,"tag":1345,"props":1392,"children":1393},{"style":1376},[1394],{"type":51,"value":1395},"\u002Fdev\u002Fnull",{"type":46,"tag":1345,"props":1397,"children":1398},{"style":1387},[1399],{"type":51,"value":1400}," ||",{"type":46,"tag":1345,"props":1402,"children":1403},{"style":1370},[1404],{"type":51,"value":1405}," echo",{"type":46,"tag":1345,"props":1407,"children":1408},{"style":1387},[1409],{"type":51,"value":1410}," \"",{"type":46,"tag":1345,"props":1412,"children":1413},{"style":1376},[1414],{"type":51,"value":1415},"ERROR: Omni CLI is not installed.",{"type":46,"tag":1345,"props":1417,"children":1418},{"style":1387},[1419],{"type":51,"value":1420},"\"\n",{"type":46,"tag":1345,"props":1422,"children":1424},{"class":1347,"line":1423},4,[1425],{"type":46,"tag":1345,"props":1426,"children":1428},{"emptyLinePlaceholder":1427},true,[1429],{"type":51,"value":1430},"\n",{"type":46,"tag":1345,"props":1432,"children":1434},{"class":1347,"line":1433},5,[1435],{"type":46,"tag":1345,"props":1436,"children":1437},{"style":1352},[1438],{"type":51,"value":1439},"# Verify the CLI has the v2 documents commands — if not, ask the user to upgrade it\n",{"type":46,"tag":1345,"props":1441,"children":1443},{"class":1347,"line":1442},6,[1444,1449,1454,1459,1464,1468,1472,1477,1481,1485,1489,1494],{"type":46,"tag":1345,"props":1445,"children":1447},{"style":1446},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1448],{"type":51,"value":22},{"type":46,"tag":1345,"props":1450,"children":1451},{"style":1376},[1452],{"type":51,"value":1453}," documents",{"type":46,"tag":1345,"props":1455,"children":1456},{"style":1376},[1457],{"type":51,"value":1458}," v2-get",{"type":46,"tag":1345,"props":1460,"children":1461},{"style":1376},[1462],{"type":51,"value":1463}," --help",{"type":46,"tag":1345,"props":1465,"children":1466},{"style":1387},[1467],{"type":51,"value":1390},{"type":46,"tag":1345,"props":1469,"children":1470},{"style":1376},[1471],{"type":51,"value":1395},{"type":46,"tag":1345,"props":1473,"children":1474},{"style":1387},[1475],{"type":51,"value":1476}," 2>&1",{"type":46,"tag":1345,"props":1478,"children":1479},{"style":1387},[1480],{"type":51,"value":1400},{"type":46,"tag":1345,"props":1482,"children":1483},{"style":1370},[1484],{"type":51,"value":1405},{"type":46,"tag":1345,"props":1486,"children":1487},{"style":1387},[1488],{"type":51,"value":1410},{"type":46,"tag":1345,"props":1490,"children":1491},{"style":1376},[1492],{"type":51,"value":1493},"ERROR: CLI is too old for the v2 documents API — upgrade it.",{"type":46,"tag":1345,"props":1495,"children":1496},{"style":1387},[1497],{"type":51,"value":1420},{"type":46,"tag":1334,"props":1499,"children":1501},{"className":1336,"code":1500,"language":1338,"meta":1339,"style":1339},"# Show available profiles and select the appropriate one\nomni config show\n# If multiple profiles exist, ask the user which to use, then switch:\nomni config use \u003Cprofile-name>\n\n# Confirm the active profile is authenticated and inspect your permissions:\nomni whoami whoami\n",[1502],{"type":46,"tag":75,"props":1503,"children":1504},{"__ignoreMap":1339},[1505,1513,1530,1538,1575,1582,1590],{"type":46,"tag":1345,"props":1506,"children":1507},{"class":1347,"line":1348},[1508],{"type":46,"tag":1345,"props":1509,"children":1510},{"style":1352},[1511],{"type":51,"value":1512},"# Show available profiles and select the appropriate one\n",{"type":46,"tag":1345,"props":1514,"children":1515},{"class":1347,"line":1358},[1516,1520,1525],{"type":46,"tag":1345,"props":1517,"children":1518},{"style":1446},[1519],{"type":51,"value":22},{"type":46,"tag":1345,"props":1521,"children":1522},{"style":1376},[1523],{"type":51,"value":1524}," config",{"type":46,"tag":1345,"props":1526,"children":1527},{"style":1376},[1528],{"type":51,"value":1529}," show\n",{"type":46,"tag":1345,"props":1531,"children":1532},{"class":1347,"line":33},[1533],{"type":46,"tag":1345,"props":1534,"children":1535},{"style":1352},[1536],{"type":51,"value":1537},"# If multiple profiles exist, ask the user which to use, then switch:\n",{"type":46,"tag":1345,"props":1539,"children":1540},{"class":1347,"line":1423},[1541,1545,1549,1554,1559,1564,1570],{"type":46,"tag":1345,"props":1542,"children":1543},{"style":1446},[1544],{"type":51,"value":22},{"type":46,"tag":1345,"props":1546,"children":1547},{"style":1376},[1548],{"type":51,"value":1524},{"type":46,"tag":1345,"props":1550,"children":1551},{"style":1376},[1552],{"type":51,"value":1553}," use",{"type":46,"tag":1345,"props":1555,"children":1556},{"style":1387},[1557],{"type":51,"value":1558}," \u003C",{"type":46,"tag":1345,"props":1560,"children":1561},{"style":1376},[1562],{"type":51,"value":1563},"profile-nam",{"type":46,"tag":1345,"props":1565,"children":1567},{"style":1566},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1568],{"type":51,"value":1569},"e",{"type":46,"tag":1345,"props":1571,"children":1572},{"style":1387},[1573],{"type":51,"value":1574},">\n",{"type":46,"tag":1345,"props":1576,"children":1577},{"class":1347,"line":1433},[1578],{"type":46,"tag":1345,"props":1579,"children":1580},{"emptyLinePlaceholder":1427},[1581],{"type":51,"value":1430},{"type":46,"tag":1345,"props":1583,"children":1584},{"class":1347,"line":1442},[1585],{"type":46,"tag":1345,"props":1586,"children":1587},{"style":1352},[1588],{"type":51,"value":1589},"# Confirm the active profile is authenticated and inspect your permissions:\n",{"type":46,"tag":1345,"props":1591,"children":1593},{"class":1347,"line":1592},7,[1594,1598,1603],{"type":46,"tag":1345,"props":1595,"children":1596},{"style":1446},[1597],{"type":51,"value":22},{"type":46,"tag":1345,"props":1599,"children":1600},{"style":1376},[1601],{"type":51,"value":1602}," whoami",{"type":46,"tag":1345,"props":1604,"children":1605},{"style":1376},[1606],{"type":51,"value":1607}," whoami\n",{"type":46,"tag":60,"props":1609,"children":1610},{},[1611],{"type":46,"tag":54,"props":1612,"children":1613},{},[1614,1619,1621,1626,1627,1632,1634,1640,1642,1647,1649,1655,1657,1663,1665,1670,1672,1681,1683,1689,1691,1697],{"type":46,"tag":67,"props":1615,"children":1616},{},[1617],{"type":51,"value":1618},"Auth",{"type":51,"value":1620},": a profile authenticates with an ",{"type":46,"tag":67,"props":1622,"children":1623},{},[1624],{"type":51,"value":1625},"API key",{"type":51,"value":593},{"type":46,"tag":67,"props":1628,"children":1629},{},[1630],{"type":51,"value":1631},"OAuth",{"type":51,"value":1633},". If ",{"type":46,"tag":75,"props":1635,"children":1637},{"className":1636},[],[1638],{"type":51,"value":1639},"whoami",{"type":51,"value":1641}," (or any call) returns ",{"type":46,"tag":67,"props":1643,"children":1644},{},[1645],{"type":51,"value":1646},"401",{"type":51,"value":1648},", hand off — ask the user to run ",{"type":46,"tag":75,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":51,"value":1654},"! omni config login \u003Cprofile>",{"type":51,"value":1656}," (OAuth 2.1 browser flow; it blocks ~2 min on the browser). Don't run ",{"type":46,"tag":75,"props":1658,"children":1660},{"className":1659},[],[1661],{"type":51,"value":1662},"config login",{"type":51,"value":1664}," yourself in a headless\u002FCI session (no browser → timeout); on a local interactive machine you ",{"type":46,"tag":252,"props":1666,"children":1667},{},[1668],{"type":51,"value":1669},"may",{"type":51,"value":1671},". See the ",{"type":46,"tag":67,"props":1673,"children":1674},{},[1675],{"type":46,"tag":75,"props":1676,"children":1678},{"className":1677},[],[1679],{"type":51,"value":1680},"omni-api-conventions",{"type":51,"value":1682}," rule for profile setup (",{"type":46,"tag":75,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":51,"value":1688},"omni config init --auth oauth",{"type":51,"value":1690},") and discovering request-body shapes with ",{"type":46,"tag":75,"props":1692,"children":1694},{"className":1693},[],[1695],{"type":51,"value":1696},"--schema",{"type":51,"value":232},{"type":46,"tag":189,"props":1699,"children":1701},{"id":1700},"discovering-commands",[1702],{"type":51,"value":1703},"Discovering Commands",{"type":46,"tag":1334,"props":1705,"children":1707},{"className":1336,"code":1706,"language":1338,"meta":1339,"style":1339},"omni documents --help              # Document operations (v2-* + lifecycle)\nomni dashboards --help             # Dashboard downloads\nomni models yaml-create --help     # Writing model YAML\nomni documents v2-create --schema  # Body schema + example (add --depth 1 for an overview, --field PATH to drill in)\n",[1708],{"type":46,"tag":75,"props":1709,"children":1710},{"__ignoreMap":1339},[1711,1731,1752,1778],{"type":46,"tag":1345,"props":1712,"children":1713},{"class":1347,"line":1348},[1714,1718,1722,1726],{"type":46,"tag":1345,"props":1715,"children":1716},{"style":1446},[1717],{"type":51,"value":22},{"type":46,"tag":1345,"props":1719,"children":1720},{"style":1376},[1721],{"type":51,"value":1453},{"type":46,"tag":1345,"props":1723,"children":1724},{"style":1376},[1725],{"type":51,"value":1463},{"type":46,"tag":1345,"props":1727,"children":1728},{"style":1352},[1729],{"type":51,"value":1730},"              # Document operations (v2-* + lifecycle)\n",{"type":46,"tag":1345,"props":1732,"children":1733},{"class":1347,"line":1358},[1734,1738,1743,1747],{"type":46,"tag":1345,"props":1735,"children":1736},{"style":1446},[1737],{"type":51,"value":22},{"type":46,"tag":1345,"props":1739,"children":1740},{"style":1376},[1741],{"type":51,"value":1742}," dashboards",{"type":46,"tag":1345,"props":1744,"children":1745},{"style":1376},[1746],{"type":51,"value":1463},{"type":46,"tag":1345,"props":1748,"children":1749},{"style":1352},[1750],{"type":51,"value":1751},"             # Dashboard downloads\n",{"type":46,"tag":1345,"props":1753,"children":1754},{"class":1347,"line":33},[1755,1759,1764,1769,1773],{"type":46,"tag":1345,"props":1756,"children":1757},{"style":1446},[1758],{"type":51,"value":22},{"type":46,"tag":1345,"props":1760,"children":1761},{"style":1376},[1762],{"type":51,"value":1763}," models",{"type":46,"tag":1345,"props":1765,"children":1766},{"style":1376},[1767],{"type":51,"value":1768}," yaml-create",{"type":46,"tag":1345,"props":1770,"children":1771},{"style":1376},[1772],{"type":51,"value":1463},{"type":46,"tag":1345,"props":1774,"children":1775},{"style":1352},[1776],{"type":51,"value":1777},"     # Writing model YAML\n",{"type":46,"tag":1345,"props":1779,"children":1780},{"class":1347,"line":1423},[1781,1785,1789,1794,1799],{"type":46,"tag":1345,"props":1782,"children":1783},{"style":1446},[1784],{"type":51,"value":22},{"type":46,"tag":1345,"props":1786,"children":1787},{"style":1376},[1788],{"type":51,"value":1453},{"type":46,"tag":1345,"props":1790,"children":1791},{"style":1376},[1792],{"type":51,"value":1793}," v2-create",{"type":46,"tag":1345,"props":1795,"children":1796},{"style":1376},[1797],{"type":51,"value":1798}," --schema",{"type":46,"tag":1345,"props":1800,"children":1801},{"style":1352},[1802],{"type":51,"value":1803},"  # Body schema + example (add --depth 1 for an overview, --field PATH to drill in)\n",{"type":46,"tag":60,"props":1805,"children":1806},{},[1807],{"type":46,"tag":54,"props":1808,"children":1809},{},[1810,1814,1815,1821,1823,1829,1831,1837,1839,1845],{"type":46,"tag":67,"props":1811,"children":1812},{},[1813],{"type":51,"value":71},{"type":51,"value":73},{"type":46,"tag":75,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":51,"value":1820},"-o json",{"type":51,"value":1822}," to force structured output for programmatic parsing, or ",{"type":46,"tag":75,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":51,"value":1828},"-o human",{"type":51,"value":1830}," for readable tables. The default is ",{"type":46,"tag":75,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":51,"value":1836},"auto",{"type":51,"value":1838}," (human in a TTY, JSON when piped). ",{"type":46,"tag":75,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":51,"value":1844},"--compact",{"type":51,"value":1846}," strips indentation for piping.",{"type":46,"tag":189,"props":1848,"children":1850},{"id":1849},"commands",[1851],{"type":51,"value":185},{"type":46,"tag":54,"props":1853,"children":1854},{},[1855,1868,1870,1875,1876,1881,1882,1887,1888,1893],{"type":46,"tag":67,"props":1856,"children":1857},{},[1858,1860,1866],{"type":51,"value":1859},"Build and edit documents with the ",{"type":46,"tag":75,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":51,"value":1865},"documents v2-*",{"type":51,"value":1867}," commands — always.",{"type":51,"value":1869}," There is no situation where you reach back to the v1 ",{"type":46,"tag":75,"props":1871,"children":1873},{"className":1872},[],[1874],{"type":51,"value":154},{"type":51,"value":156},{"type":46,"tag":75,"props":1877,"children":1879},{"className":1878},[],[1880],{"type":51,"value":162},{"type":51,"value":156},{"type":46,"tag":75,"props":1883,"children":1885},{"className":1884},[],[1886],{"type":51,"value":169},{"type":51,"value":156},{"type":46,"tag":75,"props":1889,"children":1891},{"className":1890},[],[1892],{"type":51,"value":176},{"type":51,"value":1894}," path to build, read, or change a document; the v2 draft flow covers all of it.",{"type":46,"tag":555,"props":1896,"children":1897},{},[1898,1917],{"type":46,"tag":1899,"props":1900,"children":1901},"thead",{},[1902],{"type":46,"tag":1903,"props":1904,"children":1905},"tr",{},[1906,1912],{"type":46,"tag":1907,"props":1908,"children":1909},"th",{},[1910],{"type":51,"value":1911},"Operation",{"type":46,"tag":1907,"props":1913,"children":1914},{},[1915],{"type":51,"value":1916},"Command",{"type":46,"tag":1918,"props":1919,"children":1920},"tbody",{},[1921,1939,1964,1991,2016],{"type":46,"tag":1903,"props":1922,"children":1923},{},[1924,1930],{"type":46,"tag":1925,"props":1926,"children":1927},"td",{},[1928],{"type":51,"value":1929},"Create document",{"type":46,"tag":1925,"props":1931,"children":1932},{},[1933],{"type":46,"tag":75,"props":1934,"children":1936},{"className":1935},[],[1937],{"type":51,"value":1938},"documents v2-create",{"type":46,"tag":1903,"props":1940,"children":1941},{},[1942,1947],{"type":46,"tag":1925,"props":1943,"children":1944},{},[1945],{"type":51,"value":1946},"Read document \u002F draft state",{"type":46,"tag":1925,"props":1948,"children":1949},{},[1950,1956,1958],{"type":46,"tag":75,"props":1951,"children":1953},{"className":1952},[],[1954],{"type":51,"value":1955},"documents v2-get",{"type":51,"value":1957}," \u002F ",{"type":46,"tag":75,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":51,"value":1963},"v2-get-draft",{"type":46,"tag":1903,"props":1965,"children":1966},{},[1967,1972],{"type":46,"tag":1925,"props":1968,"children":1969},{},[1970],{"type":51,"value":1971},"Edit document (tiles, controls, layout, settings, rename)",{"type":46,"tag":1925,"props":1973,"children":1974},{},[1975,1981,1983,1989],{"type":46,"tag":75,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":51,"value":1980},"documents v2-patch-draft",{"type":51,"value":1982}," (+ ",{"type":46,"tag":75,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":51,"value":1988},"v2-patch-draft-by-identifier",{"type":51,"value":1990},")",{"type":46,"tag":1903,"props":1992,"children":1993},{},[1994,1999],{"type":46,"tag":1925,"props":1995,"children":1996},{},[1997],{"type":51,"value":1998},"Get the workbook model ID",{"type":46,"tag":1925,"props":2000,"children":2001},{},[2002,2008,2009,2014],{"type":46,"tag":75,"props":2003,"children":2005},{"className":2004},[],[2006],{"type":51,"value":2007},"documents list-drafts",{"type":51,"value":752},{"type":46,"tag":75,"props":2010,"children":2012},{"className":2011},[],[2013],{"type":51,"value":860},{"type":51,"value":2015}," (open a draft first)",{"type":46,"tag":1903,"props":2017,"children":2018},{},[2019,2024],{"type":46,"tag":1925,"props":2020,"children":2021},{},[2022],{"type":51,"value":2023},"Publish a draft",{"type":46,"tag":1925,"props":2025,"children":2026},{},[2027],{"type":46,"tag":75,"props":2028,"children":2030},{"className":2029},[],[2031],{"type":51,"value":2032},"documents v2-publish-draft",{"type":46,"tag":54,"props":2034,"children":2035},{},[2036,2038,2043,2045,2051,2052,2058,2060,2066,2068,2074,2075,2081,2082,2088,2090,2096,2098,2104,2105,2111,2112,2118,2119,2125],{"type":51,"value":2037},"A handful of ",{"type":46,"tag":67,"props":2039,"children":2040},{},[2041],{"type":51,"value":2042},"document-management",{"type":51,"value":2044}," operations have no v2 form — they aren't alternatives to the v2 build path, just the only command for that job: ",{"type":46,"tag":75,"props":2046,"children":2048},{"className":2047},[],[2049],{"type":51,"value":2050},"documents list",{"type":51,"value":1957},{"type":46,"tag":75,"props":2053,"children":2055},{"className":2054},[],[2056],{"type":51,"value":2057},"list-drafts",{"type":51,"value":2059}," (find documents and drafts), ",{"type":46,"tag":75,"props":2061,"children":2063},{"className":2062},[],[2064],{"type":51,"value":2065},"documents discard-draft",{"type":51,"value":2067}," (abandon a draft), ",{"type":46,"tag":75,"props":2069,"children":2071},{"className":2070},[],[2072],{"type":51,"value":2073},"documents delete",{"type":51,"value":1957},{"type":46,"tag":75,"props":2076,"children":2078},{"className":2077},[],[2079],{"type":51,"value":2080},"move",{"type":51,"value":1957},{"type":46,"tag":75,"props":2083,"children":2085},{"className":2084},[],[2086],{"type":51,"value":2087},"duplicate",{"type":51,"value":2089}," (lifecycle), ",{"type":46,"tag":75,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":51,"value":2095},"documents get-queries",{"type":51,"value":2097}," (extract a tile's runnable query for validation), ",{"type":46,"tag":75,"props":2099,"children":2101},{"className":2100},[],[2102],{"type":51,"value":2103},"dashboards download",{"type":51,"value":1957},{"type":46,"tag":75,"props":2106,"children":2108},{"className":2107},[],[2109],{"type":51,"value":2110},"download-status",{"type":51,"value":133},{"type":46,"tag":75,"props":2113,"children":2115},{"className":2114},[],[2116],{"type":51,"value":2117},"models yaml-create",{"type":51,"value":1957},{"type":46,"tag":75,"props":2120,"children":2122},{"className":2121},[],[2123],{"type":51,"value":2124},"validate",{"type":51,"value":2126}," (model writes).",{"type":46,"tag":189,"props":2128,"children":2130},{"id":2129},"dashboard-architecture",[2131],{"type":51,"value":2132},"Dashboard Architecture",{"type":46,"tag":54,"props":2134,"children":2135},{},[2136,2138,2143],{"type":51,"value":2137},"Omni dashboards are built from ",{"type":46,"tag":67,"props":2139,"children":2140},{},[2141],{"type":51,"value":2142},"documents",{"type":51,"value":2144},". A document's v2 state is an envelope of four slices:",{"type":46,"tag":1334,"props":2146,"children":2150},{"className":2147,"code":2148,"language":2149,"meta":1339,"style":1339},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"…\", \"description\": \"…\",\n  \"queryPresentations\": { \"data\": { \"\u003CtileKey>\": { \u002F* tile: query + vis *\u002F } }, \"order\": [\"1\", \"2\"] },\n  \"controls\":           { \"data\": { \"\u003CcontrolId>\": { \"config\": {…}, \"map\": {…} } }, \"order\": [\"…\"] },\n  \"containers\":         [ \u002F* layout tree: filter bar, pages, grids, tile stacks *\u002F ],\n  \"settings\":           { \"crossfilterEnabled\": …, \"facetFilters\": …, \"refreshInterval\": …, \"runQueriesOn\": …, \"customText\": … }\n}\n","jsonc",[2151],{"type":46,"tag":75,"props":2152,"children":2153},{"__ignoreMap":1339},[2154,2162,2170,2178,2186,2194,2202],{"type":46,"tag":1345,"props":2155,"children":2156},{"class":1347,"line":1348},[2157],{"type":46,"tag":1345,"props":2158,"children":2159},{},[2160],{"type":51,"value":2161},"{\n",{"type":46,"tag":1345,"props":2163,"children":2164},{"class":1347,"line":1358},[2165],{"type":46,"tag":1345,"props":2166,"children":2167},{},[2168],{"type":51,"value":2169},"  \"name\": \"…\", \"description\": \"…\",\n",{"type":46,"tag":1345,"props":2171,"children":2172},{"class":1347,"line":33},[2173],{"type":46,"tag":1345,"props":2174,"children":2175},{},[2176],{"type":51,"value":2177},"  \"queryPresentations\": { \"data\": { \"\u003CtileKey>\": { \u002F* tile: query + vis *\u002F } }, \"order\": [\"1\", \"2\"] },\n",{"type":46,"tag":1345,"props":2179,"children":2180},{"class":1347,"line":1423},[2181],{"type":46,"tag":1345,"props":2182,"children":2183},{},[2184],{"type":51,"value":2185},"  \"controls\":           { \"data\": { \"\u003CcontrolId>\": { \"config\": {…}, \"map\": {…} } }, \"order\": [\"…\"] },\n",{"type":46,"tag":1345,"props":2187,"children":2188},{"class":1347,"line":1433},[2189],{"type":46,"tag":1345,"props":2190,"children":2191},{},[2192],{"type":51,"value":2193},"  \"containers\":         [ \u002F* layout tree: filter bar, pages, grids, tile stacks *\u002F ],\n",{"type":46,"tag":1345,"props":2195,"children":2196},{"class":1347,"line":1442},[2197],{"type":46,"tag":1345,"props":2198,"children":2199},{},[2200],{"type":51,"value":2201},"  \"settings\":           { \"crossfilterEnabled\": …, \"facetFilters\": …, \"refreshInterval\": …, \"runQueriesOn\": …, \"customText\": … }\n",{"type":46,"tag":1345,"props":2203,"children":2204},{"class":1347,"line":1592},[2205],{"type":46,"tag":1345,"props":2206,"children":2207},{},[2208],{"type":51,"value":2209},"}\n",{"type":46,"tag":196,"props":2211,"children":2212},{},[2213,2252,2275,2297],{"type":46,"tag":200,"props":2214,"children":2215},{},[2216,2221,2223,2229,2231,2236,2237,2243,2245,2250],{"type":46,"tag":67,"props":2217,"children":2218},{},[2219],{"type":51,"value":2220},"Tiles",{"type":51,"value":2222}," live in ",{"type":46,"tag":75,"props":2224,"children":2226},{"className":2225},[],[2227],{"type":51,"value":2228},"queryPresentations.data",{"type":51,"value":2230},", keyed by record key (",{"type":46,"tag":75,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":51,"value":455},{"type":51,"value":118},{"type":46,"tag":75,"props":2238,"children":2240},{"className":2239},[],[2241],{"type":51,"value":2242},"\"2\"",{"type":51,"value":2244},", …); ",{"type":46,"tag":75,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":51,"value":384},{"type":51,"value":2251}," is the tab order.",{"type":46,"tag":200,"props":2253,"children":2254},{},[2255,2260,2262,2267,2269,2273],{"type":46,"tag":67,"props":2256,"children":2257},{},[2258],{"type":51,"value":2259},"Filters and interactive controls",{"type":51,"value":2261}," are one map: ",{"type":46,"tag":75,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":51,"value":124},{"type":51,"value":2268}," (see ",{"type":46,"tag":180,"props":2270,"children":2271},{"href":896},[2272],{"type":51,"value":896},{"type":51,"value":2274},").",{"type":46,"tag":200,"props":2276,"children":2277},{},[2278,2283,2285,2290,2292,2296],{"type":46,"tag":67,"props":2279,"children":2280},{},[2281],{"type":51,"value":2282},"Layout",{"type":51,"value":2284}," is the ",{"type":46,"tag":75,"props":2286,"children":2288},{"className":2287},[],[2289],{"type":51,"value":131},{"type":51,"value":2291}," tree — a tile renders only where a container references it (see ",{"type":46,"tag":180,"props":2293,"children":2294},{"href":438},[2295],{"type":51,"value":438},{"type":51,"value":2274},{"type":46,"tag":200,"props":2298,"children":2299},{},[2300,2302,2307,2309,2314,2316,2321],{"type":51,"value":2301},"Each document also has a ",{"type":46,"tag":67,"props":2303,"children":2304},{},[2305],{"type":51,"value":2306},"workbook model",{"type":51,"value":2308}," (per-dashboard model customizations) — its ID is the ",{"type":46,"tag":75,"props":2310,"children":2312},{"className":2311},[],[2313],{"type":51,"value":860},{"type":51,"value":2315}," on the document's draft record from ",{"type":46,"tag":75,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":51,"value":2007},{"type":51,"value":232},{"type":46,"tag":54,"props":2323,"children":2324},{},[2325,2327,2332,2333,2339,2341,2347,2349,2354,2356,2361,2362,2367],{"type":51,"value":2326},"A document is edited through ",{"type":46,"tag":67,"props":2328,"children":2329},{},[2330],{"type":51,"value":2331},"drafts",{"type":51,"value":820},{"type":46,"tag":75,"props":2334,"children":2336},{"className":2335},[],[2337],{"type":51,"value":2338},"v2-patch-draft",{"type":51,"value":2340}," creates a draft and applies your patch; the published document is untouched until ",{"type":46,"tag":75,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":51,"value":2346},"v2-publish-draft",{"type":51,"value":2348},". ",{"type":46,"tag":75,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":51,"value":246},{"type":51,"value":2355}," returns the current draft state if a draft exists, else the published state. Drafts can also be bound to a ",{"type":46,"tag":67,"props":2357,"children":2358},{},[2359],{"type":51,"value":2360},"model branch",{"type":51,"value":2268},{"type":46,"tag":180,"props":2363,"children":2365},{"href":2364},"references\u002Fbranch-bound-drafts.md",[2366],{"type":51,"value":2364},{"type":51,"value":2274},{"type":46,"tag":189,"props":2369,"children":2371},{"id":2370},"build-queries-on-a-topic",[2372],{"type":51,"value":2373},"Build queries on a topic",{"type":46,"tag":54,"props":2375,"children":2376},{},[2377,2379,2384,2386,2391,2393,2398,2400,2406,2408,2414,2416,2421,2423,2429,2431,2437,2438,2444,2445,2451,2453,2461,2463,2467],{"type":51,"value":2378},"Build every tile's query ",{"type":46,"tag":67,"props":2380,"children":2381},{},[2382],{"type":51,"value":2383},"on a topic",{"type":51,"value":2385}," whenever possible: set the query ",{"type":46,"tag":75,"props":2387,"children":2389},{"className":2388},[],[2390],{"type":51,"value":555},{"type":51,"value":2392}," to the topic's ",{"type":46,"tag":67,"props":2394,"children":2395},{},[2396],{"type":51,"value":2397},"base view",{"type":51,"value":2399}," and pass ",{"type":46,"tag":75,"props":2401,"children":2403},{"className":2402},[],[2404],{"type":51,"value":2405},"join_paths_from_topic_name: \u003Ctopic>",{"type":51,"value":2407},", plus ",{"type":46,"tag":75,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":51,"value":2413},"topicName: \u003Ctopic>",{"type":51,"value":2415}," on the ",{"type":46,"tag":67,"props":2417,"children":2418},{},[2419],{"type":51,"value":2420},"presentation",{"type":51,"value":2422}," (the presentation-level ",{"type":46,"tag":75,"props":2424,"children":2426},{"className":2425},[],[2427],{"type":51,"value":2428},"topicName",{"type":51,"value":2430}," is tile-specific — a standalone query has no equivalent). Joined-view fields then resolve through the topic's join map from the base view. For the full shape — how the join map reaches joined-view fields, the worked example, and verifying with ",{"type":46,"tag":75,"props":2432,"children":2434},{"className":2433},[],[2435],{"type":51,"value":2436},"omni models get-topic",{"type":51,"value":102},{"type":46,"tag":75,"props":2439,"children":2441},{"className":2440},[],[2442],{"type":51,"value":2443},"base_view_name",{"type":51,"value":156},{"type":46,"tag":75,"props":2446,"children":2448},{"className":2447},[],[2449],{"type":51,"value":2450},"join_via_map",{"type":51,"value":2452},") — see ",{"type":46,"tag":67,"props":2454,"children":2455},{},[2456],{"type":46,"tag":75,"props":2457,"children":2459},{"className":2458},[],[2460],{"type":51,"value":630},{"type":51,"value":2462},"'s ",{"type":46,"tag":252,"props":2464,"children":2465},{},[2466],{"type":51,"value":2373},{"type":51,"value":232},{"type":46,"tag":54,"props":2469,"children":2470},{},[2471,2476,2478,2482,2484,2489,2491,2496,2498,2504,2506,2511,2513,2518,2520,2524,2526,2530,2531,2535,2537,2545,2546,2550,2551,2557,2559,2565,2566,2572],{"type":46,"tag":67,"props":2472,"children":2473},{},[2474],{"type":51,"value":2475},"Access matters:",{"type":51,"value":2477}," a tile ",{"type":46,"tag":67,"props":2479,"children":2480},{},[2481],{"type":51,"value":583},{"type":51,"value":2483}," built on a topic is ",{"type":46,"tag":67,"props":2485,"children":2486},{},[2487],{"type":51,"value":2488},"not accessible to restricted queriers\u002Fviewers",{"type":51,"value":2490},". A bare base-view query (or a raw-SQL ",{"type":46,"tag":75,"props":2492,"children":2494},{"className":2493},[],[2495],{"type":51,"value":547},{"type":51,"value":2497}," tile) still works — it traverses the global ",{"type":46,"tag":75,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":51,"value":2503},"relationships",{"type":51,"value":2505}," file — but is restricted-access-invisible in a dashboard. Use it only when no topic fits ",{"type":46,"tag":252,"props":2507,"children":2508},{},[2509],{"type":51,"value":2510},"and",{"type":51,"value":2512}," the audience isn't restricted, ",{"type":46,"tag":67,"props":2514,"children":2515},{},[2516],{"type":51,"value":2517},"or",{"type":51,"value":2519}," enable ",{"type":46,"tag":67,"props":2521,"children":2522},{},[2523],{"type":51,"value":711},{"type":51,"value":2525}," on the document so Viewer\u002FRestricted Querier roles can see it (dashboard-only — not the underlying workbook). To author a raw-SQL tile and boost it end-to-end, see ",{"type":46,"tag":180,"props":2527,"children":2528},{"href":737},[2529],{"type":51,"value":737},{"type":51,"value":752},{"type":46,"tag":252,"props":2532,"children":2533},{},[2534],{"type":51,"value":732},{"type":51,"value":2536},"; for the boost commands and the org-level prerequisite, see ",{"type":46,"tag":67,"props":2538,"children":2539},{},[2540],{"type":46,"tag":75,"props":2541,"children":2543},{"className":2542},[],[2544],{"type":51,"value":750},{"type":51,"value":752},{"type":46,"tag":252,"props":2547,"children":2548},{},[2549],{"type":51,"value":757},{"type":51,"value":102},{"type":46,"tag":75,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":51,"value":2556},"add-permits",{"type":51,"value":2558}," with ",{"type":46,"tag":75,"props":2560,"children":2562},{"className":2561},[],[2563],{"type":51,"value":2564},"accessBoost",{"type":51,"value":1166},{"type":46,"tag":75,"props":2567,"children":2569},{"className":2568},[],[2570],{"type":51,"value":2571},"update-permission-settings",{"type":51,"value":2274},{"type":46,"tag":54,"props":2574,"children":2575},{},[2576,2581,2583,2588,2590,2595,2597,2602,2604,2612,2614,2622],{"type":46,"tag":67,"props":2577,"children":2578},{},[2579],{"type":51,"value":2580},"If no existing topic fits the request",{"type":51,"value":2582},", don't just fall back to a base view (or raw SQL) — ",{"type":46,"tag":67,"props":2584,"children":2585},{},[2586],{"type":51,"value":2587},"ask the user",{"type":51,"value":2589}," whether to ",{"type":46,"tag":252,"props":2591,"children":2592},{},[2593],{"type":51,"value":2594},"extend",{"type":51,"value":2596}," an existing topic or ",{"type":46,"tag":252,"props":2598,"children":2599},{},[2600],{"type":51,"value":2601},"create",{"type":51,"value":2603}," a new one, and build it on a branch only with their go-ahead. Don't silently convert un-modeled SQL into non-topic tiles. Use ",{"type":46,"tag":67,"props":2605,"children":2606},{},[2607],{"type":46,"tag":75,"props":2608,"children":2610},{"className":2609},[],[2611],{"type":51,"value":630},{"type":51,"value":2613}," to choose\u002Fdecide the topic and ",{"type":46,"tag":67,"props":2615,"children":2616},{},[2617],{"type":46,"tag":75,"props":2618,"children":2620},{"className":2619},[],[2621],{"type":51,"value":645},{"type":51,"value":2623}," to create or modify one (branch → validate → merge only on confirmation).",{"type":46,"tag":189,"props":2625,"children":2626},{"id":2042},[2627],{"type":51,"value":2628},"Document Management",{"type":46,"tag":2630,"props":2631,"children":2633},"h3",{"id":2632},"create-document-name-only",[2634],{"type":51,"value":2635},"Create Document (Name Only)",{"type":46,"tag":1334,"props":2637,"children":2639},{"className":1336,"code":2638,"language":1338,"meta":1339,"style":1339},"omni documents v2-create \u003Cmodel-id> \"Q1 Revenue Report\"\n# optional flags: --identifier, --description, --folder-id\n",[2640],{"type":46,"tag":75,"props":2641,"children":2642},{"__ignoreMap":1339},[2643,2690],{"type":46,"tag":1345,"props":2644,"children":2645},{"class":1347,"line":1348},[2646,2650,2654,2658,2662,2667,2672,2677,2681,2686],{"type":46,"tag":1345,"props":2647,"children":2648},{"style":1446},[2649],{"type":51,"value":22},{"type":46,"tag":1345,"props":2651,"children":2652},{"style":1376},[2653],{"type":51,"value":1453},{"type":46,"tag":1345,"props":2655,"children":2656},{"style":1376},[2657],{"type":51,"value":1793},{"type":46,"tag":1345,"props":2659,"children":2660},{"style":1387},[2661],{"type":51,"value":1558},{"type":46,"tag":1345,"props":2663,"children":2664},{"style":1376},[2665],{"type":51,"value":2666},"model-i",{"type":46,"tag":1345,"props":2668,"children":2669},{"style":1566},[2670],{"type":51,"value":2671},"d",{"type":46,"tag":1345,"props":2673,"children":2674},{"style":1387},[2675],{"type":51,"value":2676},">",{"type":46,"tag":1345,"props":2678,"children":2679},{"style":1387},[2680],{"type":51,"value":1410},{"type":46,"tag":1345,"props":2682,"children":2683},{"style":1376},[2684],{"type":51,"value":2685},"Q1 Revenue Report",{"type":46,"tag":1345,"props":2687,"children":2688},{"style":1387},[2689],{"type":51,"value":1420},{"type":46,"tag":1345,"props":2691,"children":2692},{"class":1347,"line":1358},[2693],{"type":46,"tag":1345,"props":2694,"children":2695},{"style":1352},[2696],{"type":51,"value":2697},"# optional flags: --identifier, --description, --folder-id\n",{"type":46,"tag":196,"props":2699,"children":2700},{},[2701,2718,2751],{"type":46,"tag":200,"props":2702,"children":2703},{},[2704,2710,2711,2716],{"type":46,"tag":75,"props":2705,"children":2707},{"className":2706},[],[2708],{"type":51,"value":2709},"\u003Cmodel-id>",{"type":51,"value":2284},{"type":46,"tag":67,"props":2712,"children":2713},{},[2714],{"type":51,"value":2715},"shared",{"type":51,"value":2717}," model; the server mints a per-document workbook model.",{"type":46,"tag":200,"props":2719,"children":2720},{},[2721,2723,2728,2730,2736,2738,2743,2745,2750],{"type":51,"value":2722},"The document is ",{"type":46,"tag":67,"props":2724,"children":2725},{},[2726],{"type":51,"value":2727},"created and published immediately",{"type":51,"value":2729},". The response returns only ",{"type":46,"tag":75,"props":2731,"children":2733},{"className":2732},[],[2734],{"type":51,"value":2735},"{identifier, name, description}",{"type":51,"value":2737}," — when you need the workbook model ID, open a draft and read its ",{"type":46,"tag":75,"props":2739,"children":2741},{"className":2740},[],[2742],{"type":51,"value":860},{"type":51,"value":2744}," from ",{"type":46,"tag":75,"props":2746,"children":2748},{"className":2747},[],[2749],{"type":51,"value":867},{"type":51,"value":232},{"type":46,"tag":200,"props":2752,"children":2753},{},[2754,2760],{"type":46,"tag":75,"props":2755,"children":2757},{"className":2756},[],[2758],{"type":51,"value":2759},"--folder-id",{"type":51,"value":2761}," omitted → the document lands in the creator's personal \"My documents\" (requires personal-content permission). Pass a folder ID to place it in a shared folder.",{"type":46,"tag":2630,"props":2763,"children":2765},{"id":2764},"create-document-with-queries-and-visualizations",[2766],{"type":51,"value":2767},"Create Document with Queries and Visualizations",{"type":46,"tag":54,"props":2769,"children":2770},{},[2771,2773,2778,2780,2785],{"type":51,"value":2772},"Pass the full envelope via ",{"type":46,"tag":75,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":51,"value":771},{"type":51,"value":2779},". Tiles are keyed — write tile ",{"type":46,"tag":75,"props":2781,"children":2783},{"className":2782},[],[2784],{"type":51,"value":455},{"type":51,"value":2786}," explicitly to replace the server's seed tile:",{"type":46,"tag":1334,"props":2788,"children":2790},{"className":1336,"code":2789,"language":1338,"meta":1339,"style":1339},"omni documents v2-create --body '{\n  \"modelId\": \"your-shared-model-id\",\n  \"name\": \"Q1 Revenue Report\",\n  \"queryPresentations\": {\n    \"data\": {\n      \"1\": {\n        \"name\": \"Monthly Revenue Trend\",\n        \"type\": \"query\",\n        \"topicName\": \"order_items\",\n        \"prefersChart\": true,\n        \"automaticVis\": false,\n        \"query\": {\n          \"table\": \"order_items\",\n          \"fields\": [\"order_items.created_at[month]\", \"order_items.total_revenue\"],\n          \"sorts\": [{ \"column_name\": \"order_items.created_at[month]\", \"sort_descending\": false }],\n          \"filters\": { \"order_items.created_at\": \"this quarter\" },\n          \"limit\": 100,\n          \"join_paths_from_topic_name\": \"order_items\",\n          \"calculations\": [], \"column_totals\": {}, \"row_totals\": {},\n          \"fill_fields\": [], \"pivots\": [], \"userEditedSQL\": \"\"\n        },\n        \"visConfig\": {\n          \"chartType\": \"lineColor\",\n          \"fields\": [\"order_items.created_at[month]\", \"order_items.total_revenue\"],\n          \"version\": 0,\n          \"visConfig\": {\n            \"visType\": \"basic\",\n            \"config\": {\n              \"x\": { \"field\": { \"name\": \"order_items.created_at[month]\" } },\n              \"mark\": { \"type\": \"line\" },\n              \"color\": {},\n              \"series\": [{ \"field\": { \"name\": \"order_items.total_revenue\" }, \"yAxis\": \"y\" }],\n              \"tooltip\": [\n                { \"field\": { \"name\": \"order_items.created_at[month]\" } },\n                { \"field\": { \"name\": \"order_items.total_revenue\" } }\n              ],\n              \"configType\": \"cartesian\",\n              \"_dependentAxis\": \"y\"\n            }\n          }\n        }\n      }\n    },\n    \"order\": [\"1\"]\n  }\n}'\n",[2791],{"type":46,"tag":75,"props":2792,"children":2793},{"__ignoreMap":1339},[2794,2823,2831,2839,2847,2855,2863,2871,2880,2889,2898,2907,2916,2925,2934,2943,2952,2961,2970,2979,2988,2997,3006,3015,3023,3032,3041,3049,3058,3067,3076,3085,3094,3103,3112,3121,3130,3139,3148,3157,3166,3175,3184,3193,3202,3211],{"type":46,"tag":1345,"props":2795,"children":2796},{"class":1347,"line":1348},[2797,2801,2805,2809,2814,2819],{"type":46,"tag":1345,"props":2798,"children":2799},{"style":1446},[2800],{"type":51,"value":22},{"type":46,"tag":1345,"props":2802,"children":2803},{"style":1376},[2804],{"type":51,"value":1453},{"type":46,"tag":1345,"props":2806,"children":2807},{"style":1376},[2808],{"type":51,"value":1793},{"type":46,"tag":1345,"props":2810,"children":2811},{"style":1376},[2812],{"type":51,"value":2813}," --body",{"type":46,"tag":1345,"props":2815,"children":2816},{"style":1387},[2817],{"type":51,"value":2818}," '",{"type":46,"tag":1345,"props":2820,"children":2821},{"style":1376},[2822],{"type":51,"value":2161},{"type":46,"tag":1345,"props":2824,"children":2825},{"class":1347,"line":1358},[2826],{"type":46,"tag":1345,"props":2827,"children":2828},{"style":1376},[2829],{"type":51,"value":2830},"  \"modelId\": \"your-shared-model-id\",\n",{"type":46,"tag":1345,"props":2832,"children":2833},{"class":1347,"line":33},[2834],{"type":46,"tag":1345,"props":2835,"children":2836},{"style":1376},[2837],{"type":51,"value":2838},"  \"name\": \"Q1 Revenue Report\",\n",{"type":46,"tag":1345,"props":2840,"children":2841},{"class":1347,"line":1423},[2842],{"type":46,"tag":1345,"props":2843,"children":2844},{"style":1376},[2845],{"type":51,"value":2846},"  \"queryPresentations\": {\n",{"type":46,"tag":1345,"props":2848,"children":2849},{"class":1347,"line":1433},[2850],{"type":46,"tag":1345,"props":2851,"children":2852},{"style":1376},[2853],{"type":51,"value":2854},"    \"data\": {\n",{"type":46,"tag":1345,"props":2856,"children":2857},{"class":1347,"line":1442},[2858],{"type":46,"tag":1345,"props":2859,"children":2860},{"style":1376},[2861],{"type":51,"value":2862},"      \"1\": {\n",{"type":46,"tag":1345,"props":2864,"children":2865},{"class":1347,"line":1592},[2866],{"type":46,"tag":1345,"props":2867,"children":2868},{"style":1376},[2869],{"type":51,"value":2870},"        \"name\": \"Monthly Revenue Trend\",\n",{"type":46,"tag":1345,"props":2872,"children":2874},{"class":1347,"line":2873},8,[2875],{"type":46,"tag":1345,"props":2876,"children":2877},{"style":1376},[2878],{"type":51,"value":2879},"        \"type\": \"query\",\n",{"type":46,"tag":1345,"props":2881,"children":2883},{"class":1347,"line":2882},9,[2884],{"type":46,"tag":1345,"props":2885,"children":2886},{"style":1376},[2887],{"type":51,"value":2888},"        \"topicName\": \"order_items\",\n",{"type":46,"tag":1345,"props":2890,"children":2892},{"class":1347,"line":2891},10,[2893],{"type":46,"tag":1345,"props":2894,"children":2895},{"style":1376},[2896],{"type":51,"value":2897},"        \"prefersChart\": true,\n",{"type":46,"tag":1345,"props":2899,"children":2901},{"class":1347,"line":2900},11,[2902],{"type":46,"tag":1345,"props":2903,"children":2904},{"style":1376},[2905],{"type":51,"value":2906},"        \"automaticVis\": false,\n",{"type":46,"tag":1345,"props":2908,"children":2910},{"class":1347,"line":2909},12,[2911],{"type":46,"tag":1345,"props":2912,"children":2913},{"style":1376},[2914],{"type":51,"value":2915},"        \"query\": {\n",{"type":46,"tag":1345,"props":2917,"children":2919},{"class":1347,"line":2918},13,[2920],{"type":46,"tag":1345,"props":2921,"children":2922},{"style":1376},[2923],{"type":51,"value":2924},"          \"table\": \"order_items\",\n",{"type":46,"tag":1345,"props":2926,"children":2928},{"class":1347,"line":2927},14,[2929],{"type":46,"tag":1345,"props":2930,"children":2931},{"style":1376},[2932],{"type":51,"value":2933},"          \"fields\": [\"order_items.created_at[month]\", \"order_items.total_revenue\"],\n",{"type":46,"tag":1345,"props":2935,"children":2937},{"class":1347,"line":2936},15,[2938],{"type":46,"tag":1345,"props":2939,"children":2940},{"style":1376},[2941],{"type":51,"value":2942},"          \"sorts\": [{ \"column_name\": \"order_items.created_at[month]\", \"sort_descending\": false }],\n",{"type":46,"tag":1345,"props":2944,"children":2946},{"class":1347,"line":2945},16,[2947],{"type":46,"tag":1345,"props":2948,"children":2949},{"style":1376},[2950],{"type":51,"value":2951},"          \"filters\": { \"order_items.created_at\": \"this quarter\" },\n",{"type":46,"tag":1345,"props":2953,"children":2955},{"class":1347,"line":2954},17,[2956],{"type":46,"tag":1345,"props":2957,"children":2958},{"style":1376},[2959],{"type":51,"value":2960},"          \"limit\": 100,\n",{"type":46,"tag":1345,"props":2962,"children":2964},{"class":1347,"line":2963},18,[2965],{"type":46,"tag":1345,"props":2966,"children":2967},{"style":1376},[2968],{"type":51,"value":2969},"          \"join_paths_from_topic_name\": \"order_items\",\n",{"type":46,"tag":1345,"props":2971,"children":2973},{"class":1347,"line":2972},19,[2974],{"type":46,"tag":1345,"props":2975,"children":2976},{"style":1376},[2977],{"type":51,"value":2978},"          \"calculations\": [], \"column_totals\": {}, \"row_totals\": {},\n",{"type":46,"tag":1345,"props":2980,"children":2982},{"class":1347,"line":2981},20,[2983],{"type":46,"tag":1345,"props":2984,"children":2985},{"style":1376},[2986],{"type":51,"value":2987},"          \"fill_fields\": [], \"pivots\": [], \"userEditedSQL\": \"\"\n",{"type":46,"tag":1345,"props":2989,"children":2991},{"class":1347,"line":2990},21,[2992],{"type":46,"tag":1345,"props":2993,"children":2994},{"style":1376},[2995],{"type":51,"value":2996},"        },\n",{"type":46,"tag":1345,"props":2998,"children":3000},{"class":1347,"line":2999},22,[3001],{"type":46,"tag":1345,"props":3002,"children":3003},{"style":1376},[3004],{"type":51,"value":3005},"        \"visConfig\": {\n",{"type":46,"tag":1345,"props":3007,"children":3009},{"class":1347,"line":3008},23,[3010],{"type":46,"tag":1345,"props":3011,"children":3012},{"style":1376},[3013],{"type":51,"value":3014},"          \"chartType\": \"lineColor\",\n",{"type":46,"tag":1345,"props":3016,"children":3018},{"class":1347,"line":3017},24,[3019],{"type":46,"tag":1345,"props":3020,"children":3021},{"style":1376},[3022],{"type":51,"value":2933},{"type":46,"tag":1345,"props":3024,"children":3026},{"class":1347,"line":3025},25,[3027],{"type":46,"tag":1345,"props":3028,"children":3029},{"style":1376},[3030],{"type":51,"value":3031},"          \"version\": 0,\n",{"type":46,"tag":1345,"props":3033,"children":3035},{"class":1347,"line":3034},26,[3036],{"type":46,"tag":1345,"props":3037,"children":3038},{"style":1376},[3039],{"type":51,"value":3040},"          \"visConfig\": {\n",{"type":46,"tag":1345,"props":3042,"children":3043},{"class":1347,"line":29},[3044],{"type":46,"tag":1345,"props":3045,"children":3046},{"style":1376},[3047],{"type":51,"value":3048},"            \"visType\": \"basic\",\n",{"type":46,"tag":1345,"props":3050,"children":3052},{"class":1347,"line":3051},28,[3053],{"type":46,"tag":1345,"props":3054,"children":3055},{"style":1376},[3056],{"type":51,"value":3057},"            \"config\": {\n",{"type":46,"tag":1345,"props":3059,"children":3061},{"class":1347,"line":3060},29,[3062],{"type":46,"tag":1345,"props":3063,"children":3064},{"style":1376},[3065],{"type":51,"value":3066},"              \"x\": { \"field\": { \"name\": \"order_items.created_at[month]\" } },\n",{"type":46,"tag":1345,"props":3068,"children":3070},{"class":1347,"line":3069},30,[3071],{"type":46,"tag":1345,"props":3072,"children":3073},{"style":1376},[3074],{"type":51,"value":3075},"              \"mark\": { \"type\": \"line\" },\n",{"type":46,"tag":1345,"props":3077,"children":3079},{"class":1347,"line":3078},31,[3080],{"type":46,"tag":1345,"props":3081,"children":3082},{"style":1376},[3083],{"type":51,"value":3084},"              \"color\": {},\n",{"type":46,"tag":1345,"props":3086,"children":3088},{"class":1347,"line":3087},32,[3089],{"type":46,"tag":1345,"props":3090,"children":3091},{"style":1376},[3092],{"type":51,"value":3093},"              \"series\": [{ \"field\": { \"name\": \"order_items.total_revenue\" }, \"yAxis\": \"y\" }],\n",{"type":46,"tag":1345,"props":3095,"children":3097},{"class":1347,"line":3096},33,[3098],{"type":46,"tag":1345,"props":3099,"children":3100},{"style":1376},[3101],{"type":51,"value":3102},"              \"tooltip\": [\n",{"type":46,"tag":1345,"props":3104,"children":3106},{"class":1347,"line":3105},34,[3107],{"type":46,"tag":1345,"props":3108,"children":3109},{"style":1376},[3110],{"type":51,"value":3111},"                { \"field\": { \"name\": \"order_items.created_at[month]\" } },\n",{"type":46,"tag":1345,"props":3113,"children":3115},{"class":1347,"line":3114},35,[3116],{"type":46,"tag":1345,"props":3117,"children":3118},{"style":1376},[3119],{"type":51,"value":3120},"                { \"field\": { \"name\": \"order_items.total_revenue\" } }\n",{"type":46,"tag":1345,"props":3122,"children":3124},{"class":1347,"line":3123},36,[3125],{"type":46,"tag":1345,"props":3126,"children":3127},{"style":1376},[3128],{"type":51,"value":3129},"              ],\n",{"type":46,"tag":1345,"props":3131,"children":3133},{"class":1347,"line":3132},37,[3134],{"type":46,"tag":1345,"props":3135,"children":3136},{"style":1376},[3137],{"type":51,"value":3138},"              \"configType\": \"cartesian\",\n",{"type":46,"tag":1345,"props":3140,"children":3142},{"class":1347,"line":3141},38,[3143],{"type":46,"tag":1345,"props":3144,"children":3145},{"style":1376},[3146],{"type":51,"value":3147},"              \"_dependentAxis\": \"y\"\n",{"type":46,"tag":1345,"props":3149,"children":3151},{"class":1347,"line":3150},39,[3152],{"type":46,"tag":1345,"props":3153,"children":3154},{"style":1376},[3155],{"type":51,"value":3156},"            }\n",{"type":46,"tag":1345,"props":3158,"children":3160},{"class":1347,"line":3159},40,[3161],{"type":46,"tag":1345,"props":3162,"children":3163},{"style":1376},[3164],{"type":51,"value":3165},"          }\n",{"type":46,"tag":1345,"props":3167,"children":3169},{"class":1347,"line":3168},41,[3170],{"type":46,"tag":1345,"props":3171,"children":3172},{"style":1376},[3173],{"type":51,"value":3174},"        }\n",{"type":46,"tag":1345,"props":3176,"children":3178},{"class":1347,"line":3177},42,[3179],{"type":46,"tag":1345,"props":3180,"children":3181},{"style":1376},[3182],{"type":51,"value":3183},"      }\n",{"type":46,"tag":1345,"props":3185,"children":3187},{"class":1347,"line":3186},43,[3188],{"type":46,"tag":1345,"props":3189,"children":3190},{"style":1376},[3191],{"type":51,"value":3192},"    },\n",{"type":46,"tag":1345,"props":3194,"children":3196},{"class":1347,"line":3195},44,[3197],{"type":46,"tag":1345,"props":3198,"children":3199},{"style":1376},[3200],{"type":51,"value":3201},"    \"order\": [\"1\"]\n",{"type":46,"tag":1345,"props":3203,"children":3205},{"class":1347,"line":3204},45,[3206],{"type":46,"tag":1345,"props":3207,"children":3208},{"style":1376},[3209],{"type":51,"value":3210},"  }\n",{"type":46,"tag":1345,"props":3212,"children":3214},{"class":1347,"line":3213},46,[3215,3220],{"type":46,"tag":1345,"props":3216,"children":3217},{"style":1376},[3218],{"type":51,"value":3219},"}",{"type":46,"tag":1345,"props":3221,"children":3222},{"style":1387},[3223],{"type":51,"value":3224},"'\n",{"type":46,"tag":60,"props":3226,"children":3227},{},[3228],{"type":46,"tag":54,"props":3229,"children":3230},{},[3231,3241,3243,3248,3250,3256,3257,3262,3264,3269,3271,3275,3276,3280],{"type":46,"tag":67,"props":3232,"children":3233},{},[3234,3236],{"type":51,"value":3235},"The rendering spec goes in ",{"type":46,"tag":75,"props":3237,"children":3239},{"className":3238},[],[3240],{"type":51,"value":1185},{"type":51,"value":3242}," (visType beside it, spec nested under ",{"type":46,"tag":75,"props":3244,"children":3246},{"className":3245},[],[3247],{"type":51,"value":269},{"type":51,"value":3249},"). ",{"type":46,"tag":75,"props":3251,"children":3253},{"className":3252},[],[3254],{"type":51,"value":3255},"chartType",{"type":51,"value":741},{"type":46,"tag":75,"props":3258,"children":3260},{"className":3259},[],[3261],{"type":51,"value":562},{"type":51,"value":3263}," sit at the outer ",{"type":46,"tag":75,"props":3265,"children":3267},{"className":3266},[],[3268],{"type":51,"value":292},{"type":51,"value":3270}," level. Misplaced spec keys are silently dropped on write — see the round-trip warning in Known Issues. See ",{"type":46,"tag":180,"props":3272,"children":3273},{"href":737},[3274],{"type":51,"value":737},{"type":51,"value":741},{"type":46,"tag":180,"props":3277,"children":3278},{"href":918},[3279],{"type":51,"value":918},{"type":51,"value":3281}," for the structures and per-chart-type configs.",{"type":46,"tag":54,"props":3283,"children":3284},{},[3285],{"type":46,"tag":67,"props":3286,"children":3287},{},[3288],{"type":51,"value":3289},"Key points:",{"type":46,"tag":196,"props":3291,"children":3292},{},[3293,3351,3376,3399],{"type":46,"tag":200,"props":3294,"children":3295},{},[3296,3298,3303,3304,3309,3311,3316,3318,3323,3325,3330,3332,3337,3339,3344,3346,3350],{"type":51,"value":3297},"Tile keys are strings ",{"type":46,"tag":75,"props":3299,"children":3301},{"className":3300},[],[3302],{"type":51,"value":455},{"type":51,"value":118},{"type":46,"tag":75,"props":3305,"children":3307},{"className":3306},[],[3308],{"type":51,"value":2242},{"type":51,"value":3310},", … and must appear in ",{"type":46,"tag":75,"props":3312,"children":3314},{"className":3313},[],[3315],{"type":51,"value":384},{"type":51,"value":3317}," to be tabs; tiles also need a ",{"type":46,"tag":75,"props":3319,"children":3321},{"className":3320},[],[3322],{"type":51,"value":131},{"type":51,"value":3324}," entry to ",{"type":46,"tag":67,"props":3326,"children":3327},{},[3328],{"type":51,"value":3329},"render",{"type":51,"value":3331}," on the dashboard. A multi-tile create auto-lays-out only tile ",{"type":46,"tag":75,"props":3333,"children":3335},{"className":3334},[],[3336],{"type":51,"value":455},{"type":51,"value":3338}," — author ",{"type":46,"tag":75,"props":3340,"children":3342},{"className":3341},[],[3343],{"type":51,"value":131},{"type":51,"value":3345}," for the rest (",{"type":46,"tag":180,"props":3347,"children":3348},{"href":438},[3349],{"type":51,"value":438},{"type":51,"value":2274},{"type":46,"tag":200,"props":3352,"children":3353},{},[3354,3359,3361,3367,3369,3374],{"type":46,"tag":75,"props":3355,"children":3357},{"className":3356},[],[3358],{"type":51,"value":1172},{"type":51,"value":3360}," must be ",{"type":46,"tag":75,"props":3362,"children":3364},{"className":3363},[],[3365],{"type":51,"value":3366},"true",{"type":51,"value":3368}," to render a chart; set ",{"type":46,"tag":75,"props":3370,"children":3372},{"className":3371},[],[3373],{"type":51,"value":913},{"type":51,"value":3375}," when you author an explicit vis config.",{"type":46,"tag":200,"props":3377,"children":3378},{},[3379,3381,3386,3388,3398],{"type":51,"value":3380},"The ",{"type":46,"tag":75,"props":3382,"children":3384},{"className":3383},[],[3385],{"type":51,"value":488},{"type":51,"value":3387}," needs the full collection-field set (see Known Issues) and ",{"type":46,"tag":67,"props":3389,"children":3390},{},[3391,3393],{"type":51,"value":3392},"no ",{"type":46,"tag":75,"props":3394,"children":3396},{"className":3395},[],[3397],{"type":51,"value":591},{"type":51,"value":232},{"type":46,"tag":200,"props":3400,"children":3401},{},[3402,3407,3408,3413,3415,3421],{"type":46,"tag":75,"props":3403,"children":3405},{"className":3404},[],[3406],{"type":51,"value":124},{"type":51,"value":741},{"type":46,"tag":75,"props":3409,"children":3411},{"className":3410},[],[3412],{"type":51,"value":139},{"type":51,"value":3414}," slices can be included in the same create body — see ",{"type":46,"tag":180,"props":3416,"children":3418},{"href":3417},"#dashboard-filters--controls",[3419],{"type":51,"value":3420},"Dashboard Filters & Controls",{"type":51,"value":232},{"type":46,"tag":54,"props":3423,"children":3424},{},[3425,3430,3432,3438,3440,3444,3446,3451],{"type":46,"tag":67,"props":3426,"children":3427},{},[3428],{"type":51,"value":3429},"To learn the exact structure for a chart type",{"type":51,"value":3431},", build a reference dashboard in the Omni UI and read it back with ",{"type":46,"tag":75,"props":3433,"children":3435},{"className":3434},[],[3436],{"type":51,"value":3437},"omni documents v2-get \u003Cidentifier>",{"type":51,"value":3439}," — remembering that the inner config reads back ",{"type":46,"tag":252,"props":3441,"children":3442},{},[3443],{"type":51,"value":256},{"type":51,"value":3445}," and must be re-nested under ",{"type":46,"tag":75,"props":3447,"children":3449},{"className":3448},[],[3450],{"type":51,"value":269},{"type":51,"value":3452}," before reuse.",{"type":46,"tag":2630,"props":3454,"children":3456},{"id":3455},"rename-document",[3457],{"type":51,"value":3458},"Rename Document",{"type":46,"tag":1334,"props":3460,"children":3462},{"className":1336,"code":3461,"language":1338,"meta":1339,"style":1339},"omni documents v2-patch-draft \u003Cidentifier> --name \"Q1 Revenue Report (Updated)\" --summary \"rename\"\nomni documents v2-publish-draft \u003Cidentifier>\n",[3463],{"type":46,"tag":75,"props":3464,"children":3465},{"__ignoreMap":1339},[3466,3537],{"type":46,"tag":1345,"props":3467,"children":3468},{"class":1347,"line":1348},[3469,3473,3477,3482,3486,3491,3496,3500,3505,3509,3514,3519,3524,3528,3533],{"type":46,"tag":1345,"props":3470,"children":3471},{"style":1446},[3472],{"type":51,"value":22},{"type":46,"tag":1345,"props":3474,"children":3475},{"style":1376},[3476],{"type":51,"value":1453},{"type":46,"tag":1345,"props":3478,"children":3479},{"style":1376},[3480],{"type":51,"value":3481}," v2-patch-draft",{"type":46,"tag":1345,"props":3483,"children":3484},{"style":1387},[3485],{"type":51,"value":1558},{"type":46,"tag":1345,"props":3487,"children":3488},{"style":1376},[3489],{"type":51,"value":3490},"identifie",{"type":46,"tag":1345,"props":3492,"children":3493},{"style":1566},[3494],{"type":51,"value":3495},"r",{"type":46,"tag":1345,"props":3497,"children":3498},{"style":1387},[3499],{"type":51,"value":2676},{"type":46,"tag":1345,"props":3501,"children":3502},{"style":1376},[3503],{"type":51,"value":3504}," --name",{"type":46,"tag":1345,"props":3506,"children":3507},{"style":1387},[3508],{"type":51,"value":1410},{"type":46,"tag":1345,"props":3510,"children":3511},{"style":1376},[3512],{"type":51,"value":3513},"Q1 Revenue Report (Updated)",{"type":46,"tag":1345,"props":3515,"children":3516},{"style":1387},[3517],{"type":51,"value":3518},"\"",{"type":46,"tag":1345,"props":3520,"children":3521},{"style":1376},[3522],{"type":51,"value":3523}," --summary",{"type":46,"tag":1345,"props":3525,"children":3526},{"style":1387},[3527],{"type":51,"value":1410},{"type":46,"tag":1345,"props":3529,"children":3530},{"style":1376},[3531],{"type":51,"value":3532},"rename",{"type":46,"tag":1345,"props":3534,"children":3535},{"style":1387},[3536],{"type":51,"value":1420},{"type":46,"tag":1345,"props":3538,"children":3539},{"class":1347,"line":1358},[3540,3544,3548,3553,3557,3561,3565],{"type":46,"tag":1345,"props":3541,"children":3542},{"style":1446},[3543],{"type":51,"value":22},{"type":46,"tag":1345,"props":3545,"children":3546},{"style":1376},[3547],{"type":51,"value":1453},{"type":46,"tag":1345,"props":3549,"children":3550},{"style":1376},[3551],{"type":51,"value":3552}," v2-publish-draft",{"type":46,"tag":1345,"props":3554,"children":3555},{"style":1387},[3556],{"type":51,"value":1558},{"type":46,"tag":1345,"props":3558,"children":3559},{"style":1376},[3560],{"type":51,"value":3490},{"type":46,"tag":1345,"props":3562,"children":3563},{"style":1566},[3564],{"type":51,"value":3495},{"type":46,"tag":1345,"props":3566,"children":3567},{"style":1387},[3568],{"type":51,"value":1574},{"type":46,"tag":54,"props":3570,"children":3571},{},[3572,3577,3579,3585,3587,3592],{"type":46,"tag":75,"props":3573,"children":3575},{"className":3574},[],[3576],{"type":51,"value":795},{"type":51,"value":3578}," is written to the document's history audit trail. (There is no ",{"type":46,"tag":75,"props":3580,"children":3582},{"className":3581},[],[3583],{"type":51,"value":3584},"clearExistingDraft",{"type":51,"value":3586}," in the v2 flow — if a draft already exists, patch it directly with ",{"type":46,"tag":75,"props":3588,"children":3590},{"className":3589},[],[3591],{"type":51,"value":1988},{"type":51,"value":3593},", or discard it first.)",{"type":46,"tag":2630,"props":3595,"children":3597},{"id":3596},"delete-document",[3598],{"type":51,"value":3599},"Delete Document",{"type":46,"tag":1334,"props":3601,"children":3603},{"className":1336,"code":3602,"language":1338,"meta":1339,"style":1339},"omni documents delete \u003Cidentifier>\n",[3604],{"type":46,"tag":75,"props":3605,"children":3606},{"__ignoreMap":1339},[3607],{"type":46,"tag":1345,"props":3608,"children":3609},{"class":1347,"line":1348},[3610,3614,3618,3623,3627,3631,3635],{"type":46,"tag":1345,"props":3611,"children":3612},{"style":1446},[3613],{"type":51,"value":22},{"type":46,"tag":1345,"props":3615,"children":3616},{"style":1376},[3617],{"type":51,"value":1453},{"type":46,"tag":1345,"props":3619,"children":3620},{"style":1376},[3621],{"type":51,"value":3622}," delete",{"type":46,"tag":1345,"props":3624,"children":3625},{"style":1387},[3626],{"type":51,"value":1558},{"type":46,"tag":1345,"props":3628,"children":3629},{"style":1376},[3630],{"type":51,"value":3490},{"type":46,"tag":1345,"props":3632,"children":3633},{"style":1566},[3634],{"type":51,"value":3495},{"type":46,"tag":1345,"props":3636,"children":3637},{"style":1387},[3638],{"type":51,"value":1574},{"type":46,"tag":54,"props":3640,"children":3641},{},[3642],{"type":51,"value":3643},"Soft-deletes the document (moves to Trash).",{"type":46,"tag":2630,"props":3645,"children":3647},{"id":3646},"move-document",[3648],{"type":51,"value":3649},"Move Document",{"type":46,"tag":1334,"props":3651,"children":3653},{"className":1336,"code":3652,"language":1338,"meta":1339,"style":1339},"omni documents move \u003Cidentifier> \"\u002FMarketing\u002FReports\" --scope organization\n",[3654],{"type":46,"tag":75,"props":3655,"children":3656},{"__ignoreMap":1339},[3657],{"type":46,"tag":1345,"props":3658,"children":3659},{"class":1347,"line":1348},[3660,3664,3668,3673,3677,3681,3685,3689,3693,3698,3702,3707],{"type":46,"tag":1345,"props":3661,"children":3662},{"style":1446},[3663],{"type":51,"value":22},{"type":46,"tag":1345,"props":3665,"children":3666},{"style":1376},[3667],{"type":51,"value":1453},{"type":46,"tag":1345,"props":3669,"children":3670},{"style":1376},[3671],{"type":51,"value":3672}," move",{"type":46,"tag":1345,"props":3674,"children":3675},{"style":1387},[3676],{"type":51,"value":1558},{"type":46,"tag":1345,"props":3678,"children":3679},{"style":1376},[3680],{"type":51,"value":3490},{"type":46,"tag":1345,"props":3682,"children":3683},{"style":1566},[3684],{"type":51,"value":3495},{"type":46,"tag":1345,"props":3686,"children":3687},{"style":1387},[3688],{"type":51,"value":2676},{"type":46,"tag":1345,"props":3690,"children":3691},{"style":1387},[3692],{"type":51,"value":1410},{"type":46,"tag":1345,"props":3694,"children":3695},{"style":1376},[3696],{"type":51,"value":3697},"\u002FMarketing\u002FReports",{"type":46,"tag":1345,"props":3699,"children":3700},{"style":1387},[3701],{"type":51,"value":3518},{"type":46,"tag":1345,"props":3703,"children":3704},{"style":1376},[3705],{"type":51,"value":3706}," --scope",{"type":46,"tag":1345,"props":3708,"children":3709},{"style":1376},[3710],{"type":51,"value":3711}," organization\n",{"type":46,"tag":54,"props":3713,"children":3714},{},[3715,3716,3722,3724,3730],{"type":51,"value":1230},{"type":46,"tag":75,"props":3717,"children":3719},{"className":3718},[],[3720],{"type":51,"value":3721},"\"null\"",{"type":51,"value":3723}," as the folder path to move to root. ",{"type":46,"tag":75,"props":3725,"children":3727},{"className":3726},[],[3728],{"type":51,"value":3729},"--scope",{"type":51,"value":3731}," is optional — auto-computed from the destination folder.",{"type":46,"tag":2630,"props":3733,"children":3735},{"id":3734},"duplicate-document",[3736],{"type":51,"value":3737},"Duplicate Document",{"type":46,"tag":1334,"props":3739,"children":3741},{"className":1336,"code":3740,"language":1338,"meta":1339,"style":1339},"omni documents duplicate \u003Cidentifier> \"Copy of Q1 Revenue Report\" --folder-path \"\u002FMarketing\u002FReports\"\n",[3742],{"type":46,"tag":75,"props":3743,"children":3744},{"__ignoreMap":1339},[3745],{"type":46,"tag":1345,"props":3746,"children":3747},{"class":1347,"line":1348},[3748,3752,3756,3761,3765,3769,3773,3777,3781,3786,3790,3795,3799,3803],{"type":46,"tag":1345,"props":3749,"children":3750},{"style":1446},[3751],{"type":51,"value":22},{"type":46,"tag":1345,"props":3753,"children":3754},{"style":1376},[3755],{"type":51,"value":1453},{"type":46,"tag":1345,"props":3757,"children":3758},{"style":1376},[3759],{"type":51,"value":3760}," duplicate",{"type":46,"tag":1345,"props":3762,"children":3763},{"style":1387},[3764],{"type":51,"value":1558},{"type":46,"tag":1345,"props":3766,"children":3767},{"style":1376},[3768],{"type":51,"value":3490},{"type":46,"tag":1345,"props":3770,"children":3771},{"style":1566},[3772],{"type":51,"value":3495},{"type":46,"tag":1345,"props":3774,"children":3775},{"style":1387},[3776],{"type":51,"value":2676},{"type":46,"tag":1345,"props":3778,"children":3779},{"style":1387},[3780],{"type":51,"value":1410},{"type":46,"tag":1345,"props":3782,"children":3783},{"style":1376},[3784],{"type":51,"value":3785},"Copy of Q1 Revenue Report",{"type":46,"tag":1345,"props":3787,"children":3788},{"style":1387},[3789],{"type":51,"value":3518},{"type":46,"tag":1345,"props":3791,"children":3792},{"style":1376},[3793],{"type":51,"value":3794}," --folder-path",{"type":46,"tag":1345,"props":3796,"children":3797},{"style":1387},[3798],{"type":51,"value":1410},{"type":46,"tag":1345,"props":3800,"children":3801},{"style":1376},[3802],{"type":51,"value":3697},{"type":46,"tag":1345,"props":3804,"children":3805},{"style":1387},[3806],{"type":51,"value":1420},{"type":46,"tag":54,"props":3808,"children":3809},{},[3810],{"type":51,"value":3811},"Only published documents can be duplicated. Draft documents return 404.",{"type":46,"tag":189,"props":3813,"children":3815},{"id":3814},"update-existing-dashboard",[3816],{"type":51,"value":3817},"Update Existing Dashboard",{"type":46,"tag":54,"props":3819,"children":3820},{},[3821,3823,3828],{"type":51,"value":3822},"Edits go through the ",{"type":46,"tag":67,"props":3824,"children":3825},{},[3826],{"type":51,"value":3827},"draft flow",{"type":51,"value":3829}," — the published dashboard is untouched until you publish, so validation happens before anything goes live:",{"type":46,"tag":3831,"props":3832,"children":3833},"ol",{},[3834,3851,3969,4002,4032],{"type":46,"tag":200,"props":3835,"children":3836},{},[3837,3842,3844,3850],{"type":46,"tag":67,"props":3838,"children":3839},{},[3840],{"type":51,"value":3841},"Read",{"type":51,"value":3843}," the current state: ",{"type":46,"tag":75,"props":3845,"children":3847},{"className":3846},[],[3848],{"type":51,"value":3849},"omni documents v2-get \u003Cidentifier> > doc.json",{"type":51,"value":232},{"type":46,"tag":200,"props":3852,"children":3853},{},[3854,3859,3861,3866,3868],{"type":46,"tag":67,"props":3855,"children":3856},{},[3857],{"type":51,"value":3858},"Author the patch",{"type":51,"value":3860}," — patches ",{"type":46,"tag":67,"props":3862,"children":3863},{},[3864],{"type":51,"value":3865},"merge by key",{"type":51,"value":3867},", so send only the slices you're changing:\n",{"type":46,"tag":196,"props":3869,"children":3870},{},[3871,3902,3924,3954],{"type":46,"tag":200,"props":3872,"children":3873},{},[3874,3879,3881,3886,3888,3893,3895,3900],{"type":46,"tag":67,"props":3875,"children":3876},{},[3877],{"type":51,"value":3878},"Add a tile",{"type":51,"value":3880},": new key in ",{"type":46,"tag":75,"props":3882,"children":3884},{"className":3883},[],[3885],{"type":51,"value":2228},{"type":51,"value":3887}," + append it to ",{"type":46,"tag":75,"props":3889,"children":3891},{"className":3890},[],[3892],{"type":51,"value":384},{"type":51,"value":3894}," (+ a ",{"type":46,"tag":75,"props":3896,"children":3898},{"className":3897},[],[3899],{"type":51,"value":131},{"type":51,"value":3901}," tile stack so it renders).",{"type":46,"tag":200,"props":3903,"children":3904},{},[3905,3910,3912,3922],{"type":46,"tag":67,"props":3906,"children":3907},{},[3908],{"type":51,"value":3909},"Edit a tile",{"type":51,"value":3911},": send just that key — and ",{"type":46,"tag":67,"props":3913,"children":3914},{},[3915,3917],{"type":51,"value":3916},"re-author its inner vis config nested under ",{"type":46,"tag":75,"props":3918,"children":3920},{"className":3919},[],[3921],{"type":51,"value":269},{"type":51,"value":3923}," (never echo the flat GET shape back).",{"type":46,"tag":200,"props":3925,"children":3926},{},[3927,3932,3934,3939,3941,3946,3948,3953],{"type":46,"tag":67,"props":3928,"children":3929},{},[3930],{"type":51,"value":3931},"Delete a tile",{"type":51,"value":3933},": set its key to ",{"type":46,"tag":75,"props":3935,"children":3937},{"className":3936},[],[3938],{"type":51,"value":394},{"type":51,"value":3940}," and remove it from ",{"type":46,"tag":75,"props":3942,"children":3944},{"className":3943},[],[3945],{"type":51,"value":384},{"type":51,"value":3947}," (and its stack from ",{"type":46,"tag":75,"props":3949,"children":3951},{"className":3950},[],[3952],{"type":51,"value":131},{"type":51,"value":2274},{"type":46,"tag":200,"props":3955,"children":3956},{},[3957,3961,3962,3967],{"type":46,"tag":67,"props":3958,"children":3959},{},[3960],{"type":51,"value":2282},{"type":51,"value":820},{"type":46,"tag":75,"props":3963,"children":3965},{"className":3964},[],[3966],{"type":51,"value":131},{"type":51,"value":3968}," is a full replacement — send the whole tree with your edit applied.",{"type":46,"tag":200,"props":3970,"children":3971},{},[3972,3977,3978,3984,3986,3992,3994,4000],{"type":46,"tag":67,"props":3973,"children":3974},{},[3975],{"type":51,"value":3976},"Create the draft + apply",{"type":51,"value":820},{"type":46,"tag":75,"props":3979,"children":3981},{"className":3980},[],[3982],{"type":51,"value":3983},"omni documents v2-patch-draft \u003Cidentifier> --body - \u003C patch.json",{"type":51,"value":3985}," — capture ",{"type":46,"tag":75,"props":3987,"children":3989},{"className":3988},[],[3990],{"type":51,"value":3991},"draftIdentifier",{"type":51,"value":3993}," from the response. Include a ",{"type":46,"tag":75,"props":3995,"children":3997},{"className":3996},[],[3998],{"type":51,"value":3999},"summary",{"type":51,"value":4001}," in the body for the audit trail.",{"type":46,"tag":200,"props":4003,"children":4004},{},[4005,4010,4011,4017,4019,4023,4025,4031],{"type":46,"tag":67,"props":4006,"children":4007},{},[4008],{"type":51,"value":4009},"Validate the draft",{"type":51,"value":492},{"type":46,"tag":75,"props":4012,"children":4014},{"className":4013},[],[4015],{"type":51,"value":4016},"omni documents v2-get-draft \u003Cidentifier> \u003CdraftIdentifier>",{"type":51,"value":4018},", run the affected queries (see ",{"type":46,"tag":180,"props":4020,"children":4021},{"href":212},[4022],{"type":51,"value":215},{"type":51,"value":4024},"). Iterate with ",{"type":46,"tag":75,"props":4026,"children":4028},{"className":4027},[],[4029],{"type":51,"value":4030},"omni documents v2-patch-draft-by-identifier \u003Cidentifier> \u003CdraftIdentifier> --body …",{"type":51,"value":232},{"type":46,"tag":200,"props":4033,"children":4034},{},[4035,4040,4041,4047,4049,4054],{"type":46,"tag":67,"props":4036,"children":4037},{},[4038],{"type":51,"value":4039},"Publish",{"type":51,"value":820},{"type":46,"tag":75,"props":4042,"children":4044},{"className":4043},[],[4045],{"type":51,"value":4046},"omni documents v2-publish-draft \u003Cidentifier>",{"type":51,"value":4048},". On failure or abandonment, ",{"type":46,"tag":75,"props":4050,"children":4052},{"className":4051},[],[4053],{"type":51,"value":1324},{"type":51,"value":4055}," cleans up without touching the published doc.",{"type":46,"tag":54,"props":4057,"children":4058},{},[4059,4061,4069],{"type":51,"value":4060},"Error map, merge-semantics details, and recipes are in ",{"type":46,"tag":67,"props":4062,"children":4063},{},[4064],{"type":46,"tag":180,"props":4065,"children":4067},{"href":4066},"references\u002Fupdating-dashboards.md",[4068],{"type":51,"value":4066},{"type":51,"value":232},{"type":46,"tag":189,"props":4071,"children":4073},{"id":4072},"updating-a-dashboards-model",[4074],{"type":51,"value":4075},"Updating a Dashboard's Model",{"type":46,"tag":60,"props":4077,"children":4078},{},[4079,4103,4227],{"type":46,"tag":54,"props":4080,"children":4081},{},[4082,4087,4089,4094,4096,4101],{"type":46,"tag":67,"props":4083,"children":4084},{},[4085],{"type":51,"value":4086},"First decide where a new field belongs.",{"type":51,"value":4088}," Skill users are almost always ",{"type":46,"tag":67,"props":4090,"children":4091},{},[4092],{"type":51,"value":4093},"modelers or admins",{"type":51,"value":4095}," who ",{"type":46,"tag":252,"props":4097,"children":4098},{},[4099],{"type":51,"value":4100},"can",{"type":51,"value":4102}," write to the shared model — so choose the field's right home, not the lowest-friction path. In order:",{"type":46,"tag":3831,"props":4104,"children":4105},{},[4106,4158,4185,4207,4217],{"type":46,"tag":200,"props":4107,"children":4108},{},[4109,4114,4116,4121,4123,4128,4130,4135,4137,4142,4144,4149,4151,4156],{"type":46,"tag":67,"props":4110,"children":4111},{},[4112],{"type":51,"value":4113},"Can it be a calculation?",{"type":51,"value":4115}," A table calculation is scoped to a ",{"type":46,"tag":67,"props":4117,"children":4118},{},[4119],{"type":51,"value":4120},"single query\u002Ftile",{"type":51,"value":4122}," (computed on the result set). Prefer one for logic local to one query — but lean to a model field (→ #2\u002F#3) when (a) the ",{"type":46,"tag":67,"props":4124,"children":4125},{},[4126],{"type":51,"value":4127},"query shape rules a calc out",{"type":51,"value":4129},", or (b) you're building ",{"type":46,"tag":67,"props":4131,"children":4132},{},[4133],{"type":51,"value":4134},"multiple queries at once",{"type":51,"value":4136}," and the same logic spans them and can be expressed as a dimension\u002Fmeasure. ",{"type":46,"tag":67,"props":4138,"children":4139},{},[4140],{"type":51,"value":4141},"Window-shaped logic",{"type":51,"value":4143}," (running total, moving average, % change) should almost always stay a calc — it runs post-query on the result set, not in-warehouse; only reach for an in-warehouse field when the window must span rows ",{"type":46,"tag":252,"props":4145,"children":4146},{},[4147],{"type":51,"value":4148},"outside",{"type":51,"value":4150}," the result set. (See ",{"type":46,"tag":75,"props":4152,"children":4154},{"className":4153},[],[4155],{"type":51,"value":630},{"type":51,"value":4157},"'s table-calculation guidance.)",{"type":46,"tag":200,"props":4159,"children":4160},{},[4161,4166,4168,4173,4175,4183],{"type":46,"tag":67,"props":4162,"children":4163},{},[4164],{"type":51,"value":4165},"Reusable elsewhere?",{"type":51,"value":4167}," If the field is likely to be used beyond this one dashboard, prefer adding it to a ",{"type":46,"tag":67,"props":4169,"children":4170},{},[4171],{"type":51,"value":4172},"branch on the shared model",{"type":51,"value":4174}," and follow ",{"type":46,"tag":67,"props":4176,"children":4177},{},[4178],{"type":46,"tag":75,"props":4179,"children":4181},{"className":4180},[],[4182],{"type":51,"value":645},{"type":51,"value":4184}," to create, validate, and ship it.",{"type":46,"tag":200,"props":4186,"children":4187},{},[4188,4193,4195,4199,4200,4206],{"type":46,"tag":67,"props":4189,"children":4190},{},[4191],{"type":51,"value":4192},"One-off for this dashboard (and not a calculation)?",{"type":51,"value":4194}," Add it to the ",{"type":46,"tag":67,"props":4196,"children":4197},{},[4198],{"type":51,"value":2306},{"type":51,"value":209},{"type":46,"tag":180,"props":4201,"children":4203},{"href":4202},"#building-a-tile-that-queries-a-workbook-model-field",[4204],{"type":51,"value":4205},"Building a tile that queries a workbook-model field",{"type":51,"value":187},{"type":46,"tag":200,"props":4208,"children":4209},{},[4210,4215],{"type":46,"tag":67,"props":4211,"children":4212},{},[4213],{"type":51,"value":4214},"Unsure?",{"type":51,"value":4216}," Ask the creator where the field should live.",{"type":46,"tag":200,"props":4218,"children":4219},{},[4220,4225],{"type":46,"tag":67,"props":4221,"children":4222},{},[4223],{"type":51,"value":4224},"Never write to the schema model",{"type":51,"value":4226}," — it's auto-generated and read-only.",{"type":46,"tag":54,"props":4228,"children":4229},{},[4230,4242,4244,4249,4251,4256,4257,4264],{"type":46,"tag":67,"props":4231,"children":4232},{},[4233,4235,4240],{"type":51,"value":4234},"If the field isn't in the ",{"type":46,"tag":252,"props":4236,"children":4237},{},[4238],{"type":51,"value":4239},"published",{"type":51,"value":4241}," shared model yet",{"type":51,"value":4243}," — it lives only on a model ",{"type":46,"tag":67,"props":4245,"children":4246},{},[4247],{"type":51,"value":4248},"branch",{"type":51,"value":4250}," that hasn't merged — put the tile on a ",{"type":46,"tag":67,"props":4252,"children":4253},{},[4254],{"type":51,"value":4255},"branch-bound draft",{"type":51,"value":301},{"type":46,"tag":67,"props":4258,"children":4259},{},[4260],{"type":46,"tag":180,"props":4261,"children":4262},{"href":2364},[4263],{"type":51,"value":2364},{"type":51,"value":232},{"type":46,"tag":54,"props":4266,"children":4267},{},[4268,4270,4275],{"type":51,"value":4269},"Push custom dimensions and measures to a specific dashboard by writing to its workbook model. Each workbook has its own model that ",{"type":46,"tag":67,"props":4271,"children":4272},{},[4273],{"type":51,"value":4274},"extends",{"type":51,"value":4276}," the shared model — so the ID you write YAML to is a model ID, not a separate \"workbook ID\". Because every edit goes through a draft, and the field has to exist before a tile can reference it, the whole flow stays in the v2 draft path:",{"type":46,"tag":54,"props":4278,"children":4279},{},[4280],{"type":46,"tag":67,"props":4281,"children":4282},{},[4283],{"type":51,"value":4284},"Step 1 — open a draft and read its workbook model ID:",{"type":46,"tag":1334,"props":4286,"children":4288},{"className":1336,"code":4287,"language":1338,"meta":1339,"style":1339},"omni documents v2-patch-draft \u003Cidentifier> --summary \"add workbook field\"   # creates the draft\nomni documents list-drafts \u003Cidentifier>\n# → use the draft record's \"workbookModelId\" — that IS the model you write YAML to\n",[4289],{"type":46,"tag":75,"props":4290,"children":4291},{"__ignoreMap":1339},[4292,4345,4377],{"type":46,"tag":1345,"props":4293,"children":4294},{"class":1347,"line":1348},[4295,4299,4303,4307,4311,4315,4319,4323,4327,4331,4336,4340],{"type":46,"tag":1345,"props":4296,"children":4297},{"style":1446},[4298],{"type":51,"value":22},{"type":46,"tag":1345,"props":4300,"children":4301},{"style":1376},[4302],{"type":51,"value":1453},{"type":46,"tag":1345,"props":4304,"children":4305},{"style":1376},[4306],{"type":51,"value":3481},{"type":46,"tag":1345,"props":4308,"children":4309},{"style":1387},[4310],{"type":51,"value":1558},{"type":46,"tag":1345,"props":4312,"children":4313},{"style":1376},[4314],{"type":51,"value":3490},{"type":46,"tag":1345,"props":4316,"children":4317},{"style":1566},[4318],{"type":51,"value":3495},{"type":46,"tag":1345,"props":4320,"children":4321},{"style":1387},[4322],{"type":51,"value":2676},{"type":46,"tag":1345,"props":4324,"children":4325},{"style":1376},[4326],{"type":51,"value":3523},{"type":46,"tag":1345,"props":4328,"children":4329},{"style":1387},[4330],{"type":51,"value":1410},{"type":46,"tag":1345,"props":4332,"children":4333},{"style":1376},[4334],{"type":51,"value":4335},"add workbook field",{"type":46,"tag":1345,"props":4337,"children":4338},{"style":1387},[4339],{"type":51,"value":3518},{"type":46,"tag":1345,"props":4341,"children":4342},{"style":1352},[4343],{"type":51,"value":4344},"   # creates the draft\n",{"type":46,"tag":1345,"props":4346,"children":4347},{"class":1347,"line":1358},[4348,4352,4356,4361,4365,4369,4373],{"type":46,"tag":1345,"props":4349,"children":4350},{"style":1446},[4351],{"type":51,"value":22},{"type":46,"tag":1345,"props":4353,"children":4354},{"style":1376},[4355],{"type":51,"value":1453},{"type":46,"tag":1345,"props":4357,"children":4358},{"style":1376},[4359],{"type":51,"value":4360}," list-drafts",{"type":46,"tag":1345,"props":4362,"children":4363},{"style":1387},[4364],{"type":51,"value":1558},{"type":46,"tag":1345,"props":4366,"children":4367},{"style":1376},[4368],{"type":51,"value":3490},{"type":46,"tag":1345,"props":4370,"children":4371},{"style":1566},[4372],{"type":51,"value":3495},{"type":46,"tag":1345,"props":4374,"children":4375},{"style":1387},[4376],{"type":51,"value":1574},{"type":46,"tag":1345,"props":4378,"children":4379},{"class":1347,"line":33},[4380],{"type":46,"tag":1345,"props":4381,"children":4382},{"style":1352},[4383],{"type":51,"value":4384},"# → use the draft record's \"workbookModelId\" — that IS the model you write YAML to\n",{"type":46,"tag":60,"props":4386,"children":4387},{},[4388],{"type":46,"tag":54,"props":4389,"children":4390},{},[4391,4396,4398,4404,4406,4411,4413,4418,4420,4425],{"type":46,"tag":67,"props":4392,"children":4393},{},[4394],{"type":51,"value":4395},"Note",{"type":51,"value":4397},": The workbook model (which extends the shared model) is what you pass to ",{"type":46,"tag":75,"props":4399,"children":4401},{"className":4400},[],[4402],{"type":51,"value":4403},"omni models yaml-create",{"type":51,"value":4405},". Each draft has its ",{"type":46,"tag":67,"props":4407,"children":4408},{},[4409],{"type":51,"value":4410},"own",{"type":51,"value":4412}," clone of it, and the ID ",{"type":46,"tag":67,"props":4414,"children":4415},{},[4416],{"type":51,"value":4417},"changes on every draft → publish cycle",{"type":51,"value":4419}," — always read it fresh from ",{"type":46,"tag":75,"props":4421,"children":4423},{"className":4422},[],[4424],{"type":51,"value":2057},{"type":51,"value":4426},"; never reuse a cached value.",{"type":46,"tag":54,"props":4428,"children":4429},{},[4430],{"type":46,"tag":67,"props":4431,"children":4432},{},[4433,4435,4441],{"type":51,"value":4434},"Step 2 — POST YAML to the draft's workbook model with ",{"type":46,"tag":75,"props":4436,"children":4438},{"className":4437},[],[4439],{"type":51,"value":4440},"mode: \"extension\"",{"type":51,"value":4442},":",{"type":46,"tag":1334,"props":4444,"children":4446},{"className":1336,"code":4445,"language":1338,"meta":1339,"style":1339},"omni models yaml-create \u003CdraftWorkbookModelId> --body '{\n  \"fileName\": \"order_items.view\",\n  \"yaml\": \"dimensions:\\n  is_high_value:\\n    sql: \\\"${sale_price} > 100\\\"\\n    label: High Value Order\\nmeasures:\\n  high_value_count:\\n    sql: \\\"${order_items.id}\\\"\\n    aggregate_type: count_distinct\\n    label: High Value Orders\",\n  \"mode\": \"extension\"\n}'\n",[4447],{"type":46,"tag":75,"props":4448,"children":4449},{"__ignoreMap":1339},[4450,4494,4502,4510,4518],{"type":46,"tag":1345,"props":4451,"children":4452},{"class":1347,"line":1348},[4453,4457,4461,4465,4469,4474,4478,4482,4486,4490],{"type":46,"tag":1345,"props":4454,"children":4455},{"style":1446},[4456],{"type":51,"value":22},{"type":46,"tag":1345,"props":4458,"children":4459},{"style":1376},[4460],{"type":51,"value":1763},{"type":46,"tag":1345,"props":4462,"children":4463},{"style":1376},[4464],{"type":51,"value":1768},{"type":46,"tag":1345,"props":4466,"children":4467},{"style":1387},[4468],{"type":51,"value":1558},{"type":46,"tag":1345,"props":4470,"children":4471},{"style":1376},[4472],{"type":51,"value":4473},"draftWorkbookModelI",{"type":46,"tag":1345,"props":4475,"children":4476},{"style":1566},[4477],{"type":51,"value":2671},{"type":46,"tag":1345,"props":4479,"children":4480},{"style":1387},[4481],{"type":51,"value":2676},{"type":46,"tag":1345,"props":4483,"children":4484},{"style":1376},[4485],{"type":51,"value":2813},{"type":46,"tag":1345,"props":4487,"children":4488},{"style":1387},[4489],{"type":51,"value":2818},{"type":46,"tag":1345,"props":4491,"children":4492},{"style":1376},[4493],{"type":51,"value":2161},{"type":46,"tag":1345,"props":4495,"children":4496},{"class":1347,"line":1358},[4497],{"type":46,"tag":1345,"props":4498,"children":4499},{"style":1376},[4500],{"type":51,"value":4501},"  \"fileName\": \"order_items.view\",\n",{"type":46,"tag":1345,"props":4503,"children":4504},{"class":1347,"line":33},[4505],{"type":46,"tag":1345,"props":4506,"children":4507},{"style":1376},[4508],{"type":51,"value":4509},"  \"yaml\": \"dimensions:\\n  is_high_value:\\n    sql: \\\"${sale_price} > 100\\\"\\n    label: High Value Order\\nmeasures:\\n  high_value_count:\\n    sql: \\\"${order_items.id}\\\"\\n    aggregate_type: count_distinct\\n    label: High Value Orders\",\n",{"type":46,"tag":1345,"props":4511,"children":4512},{"class":1347,"line":1423},[4513],{"type":46,"tag":1345,"props":4514,"children":4515},{"style":1376},[4516],{"type":51,"value":4517},"  \"mode\": \"extension\"\n",{"type":46,"tag":1345,"props":4519,"children":4520},{"class":1347,"line":1433},[4521,4525],{"type":46,"tag":1345,"props":4522,"children":4523},{"style":1376},[4524],{"type":51,"value":3219},{"type":46,"tag":1345,"props":4526,"children":4527},{"style":1387},[4528],{"type":51,"value":3224},{"type":46,"tag":60,"props":4530,"children":4531},{},[4532],{"type":46,"tag":54,"props":4533,"children":4534},{},[4535,4540,4542,4548,4550,4556,4558,4563,4565,4571],{"type":46,"tag":67,"props":4536,"children":4537},{},[4538],{"type":51,"value":4539},"Critical",{"type":51,"value":4541},": Always pass ",{"type":46,"tag":75,"props":4543,"children":4545},{"className":4544},[],[4546],{"type":51,"value":4547},"\"mode\": \"extension\"",{"type":51,"value":4549}," when editing an existing view in a workbook model. The default is ",{"type":46,"tag":75,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":51,"value":4555},"\"combined\"",{"type":51,"value":4557},", which treats your YAML body as the ",{"type":46,"tag":252,"props":4559,"children":4560},{},[4561],{"type":51,"value":4562},"complete",{"type":51,"value":4564}," view definition and marks every field you didn't include as ",{"type":46,"tag":75,"props":4566,"children":4568},{"className":4567},[],[4569],{"type":51,"value":4570},"ignored: true",{"type":51,"value":4572}," — silently breaking queries that depend on fields from the shared base view. Extension mode layers your new dimensions and measures on top of the inherited view.",{"type":46,"tag":54,"props":4574,"children":4575},{},[4576,4582,4583,4589,4590,4596,4598,4604,4605,4611,4613,4619,4621,4626,4628,4634],{"type":46,"tag":75,"props":4577,"children":4579},{"className":4578},[],[4580],{"type":51,"value":4581},"fileName",{"type":51,"value":3360},{"type":46,"tag":75,"props":4584,"children":4586},{"className":4585},[],[4587],{"type":51,"value":4588},"\"model\"",{"type":51,"value":118},{"type":46,"tag":75,"props":4591,"children":4593},{"className":4592},[],[4594],{"type":51,"value":4595},"\"relationships\"",{"type":51,"value":4597},", or end with ",{"type":46,"tag":75,"props":4599,"children":4601},{"className":4600},[],[4602],{"type":51,"value":4603},".view",{"type":51,"value":593},{"type":46,"tag":75,"props":4606,"children":4608},{"className":4607},[],[4609],{"type":51,"value":4610},".topic",{"type":51,"value":4612},". The ",{"type":46,"tag":75,"props":4614,"children":4616},{"className":4615},[],[4617],{"type":51,"value":4618},"yaml",{"type":51,"value":4620}," value is a YAML string (not a JSON object) containing the view's ",{"type":46,"tag":252,"props":4622,"children":4623},{},[4624],{"type":51,"value":4625},"contents",{"type":51,"value":4627}," — no ",{"type":46,"tag":75,"props":4629,"children":4631},{"className":4630},[],[4632],{"type":51,"value":4633},"views:",{"type":51,"value":4635}," wrapper. Writing to a workbook model skips git sync entirely — authorization is still checked against the underlying shared model's permissions.",{"type":46,"tag":2630,"props":4637,"children":4639},{"id":4638},"building-a-tile-that-queries-a-workbook-model-field",[4640,4642,4647],{"type":51,"value":4641},"Building a tile that ",{"type":46,"tag":252,"props":4643,"children":4644},{},[4645],{"type":51,"value":4646},"queries",{"type":51,"value":4648}," a workbook-model field",{"type":46,"tag":54,"props":4650,"children":4651},{},[4652,4654,4663],{"type":51,"value":4653},"v2 tile queries carry ",{"type":46,"tag":67,"props":4655,"children":4656},{},[4657,4658],{"type":51,"value":3392},{"type":46,"tag":75,"props":4659,"children":4661},{"className":4660},[],[4662],{"type":51,"value":591},{"type":51,"value":4664}," — the server anchors each tile to the draft's workbook model, so the field just has to exist in that model before the tile references it. The order is fixed:",{"type":46,"tag":3831,"props":4666,"children":4667},{},[4668,4681,4702,4722,4742,4763],{"type":46,"tag":200,"props":4669,"children":4670},{},[4671,4679],{"type":46,"tag":67,"props":4672,"children":4673},{},[4674],{"type":46,"tag":75,"props":4675,"children":4677},{"className":4676},[],[4678],{"type":51,"value":1938},{"type":51,"value":4680}," (or use the existing document) — provisions the workbook model.",{"type":46,"tag":200,"props":4682,"children":4683},{},[4684,4693,4695,4700],{"type":46,"tag":67,"props":4685,"children":4686},{},[4687],{"type":46,"tag":75,"props":4688,"children":4690},{"className":4689},[],[4691],{"type":51,"value":4692},"documents v2-patch-draft \u003Cidentifier>",{"type":51,"value":4694}," — open the draft (a ",{"type":46,"tag":75,"props":4696,"children":4698},{"className":4697},[],[4699],{"type":51,"value":795},{"type":51,"value":4701},"-only patch is enough to create it).",{"type":46,"tag":200,"props":4703,"children":4704},{},[4705,4714,4716,4721],{"type":46,"tag":67,"props":4706,"children":4707},{},[4708],{"type":46,"tag":75,"props":4709,"children":4711},{"className":4710},[],[4712],{"type":51,"value":4713},"documents list-drafts \u003Cidentifier>",{"type":51,"value":4715}," → the draft's ",{"type":46,"tag":75,"props":4717,"children":4719},{"className":4718},[],[4720],{"type":51,"value":860},{"type":51,"value":232},{"type":46,"tag":200,"props":4723,"children":4724},{},[4725,4740],{"type":46,"tag":67,"props":4726,"children":4727},{},[4728,4734,4735],{"type":46,"tag":75,"props":4729,"children":4731},{"className":4730},[],[4732],{"type":51,"value":4733},"models yaml-create \u003CdraftWorkbookModelId>",{"type":51,"value":2558},{"type":46,"tag":75,"props":4736,"children":4738},{"className":4737},[],[4739],{"type":51,"value":4440},{"type":51,"value":4741}," → add the field (above).",{"type":46,"tag":200,"props":4743,"children":4744},{},[4745,4754,4756,4761],{"type":46,"tag":67,"props":4746,"children":4747},{},[4748],{"type":46,"tag":75,"props":4749,"children":4751},{"className":4750},[],[4752],{"type":51,"value":4753},"documents v2-patch-draft-by-identifier \u003Cidentifier> \u003CdraftIdentifier>",{"type":51,"value":4755}," adding the tile that references the field — no ",{"type":46,"tag":75,"props":4757,"children":4759},{"className":4758},[],[4760],{"type":51,"value":591},{"type":51,"value":4762}," anywhere in the tile query.",{"type":46,"tag":200,"props":4764,"children":4765},{},[4766,4775],{"type":46,"tag":67,"props":4767,"children":4768},{},[4769],{"type":46,"tag":75,"props":4770,"children":4772},{"className":4771},[],[4773],{"type":51,"value":4774},"documents v2-publish-draft \u003Cidentifier>",{"type":51,"value":4776}," — the field and tile go live together.",{"type":46,"tag":54,"props":4778,"children":4779},{},[4780,4782,4787,4789,4794,4795,4800,4802,4808],{"type":51,"value":4781},"After publishing, the workbook model ID has ",{"type":46,"tag":67,"props":4783,"children":4784},{},[4785],{"type":51,"value":4786},"changed",{"type":51,"value":4788}," — open a new draft and re-read ",{"type":46,"tag":75,"props":4790,"children":4792},{"className":4791},[],[4793],{"type":51,"value":860},{"type":51,"value":2744},{"type":46,"tag":75,"props":4796,"children":4798},{"className":4797},[],[4799],{"type":51,"value":2057},{"type":51,"value":4801}," before any further ",{"type":46,"tag":75,"props":4803,"children":4805},{"className":4804},[],[4806],{"type":51,"value":4807},"yaml-create",{"type":51,"value":232},{"type":46,"tag":2630,"props":4810,"children":4812},{"id":4811},"verify-the-extension-worked",[4813],{"type":51,"value":4814},"Verify the Extension Worked",{"type":46,"tag":54,"props":4816,"children":4817},{},[4818],{"type":51,"value":4819},"After writing, confirm the base view's fields are still available by querying one against the draft's workbook model:",{"type":46,"tag":1334,"props":4821,"children":4823},{"className":1336,"code":4822,"language":1338,"meta":1339,"style":1339},"omni query run --body '{\n  \"query\": {\n    \"modelId\": \"\u003CdraftWorkbookModelId>\",\n    \"table\": \"order_items\",\n    \"fields\": [\"order_items.id\", \"order_items.high_value_count\"],\n    \"limit\": 1,\n    \"join_paths_from_topic_name\": \"order_items\"\n  }\n}'\n",[4824],{"type":46,"tag":75,"props":4825,"children":4826},{"__ignoreMap":1339},[4827,4856,4864,4872,4880,4888,4896,4904,4911],{"type":46,"tag":1345,"props":4828,"children":4829},{"class":1347,"line":1348},[4830,4834,4839,4844,4848,4852],{"type":46,"tag":1345,"props":4831,"children":4832},{"style":1446},[4833],{"type":51,"value":22},{"type":46,"tag":1345,"props":4835,"children":4836},{"style":1376},[4837],{"type":51,"value":4838}," query",{"type":46,"tag":1345,"props":4840,"children":4841},{"style":1376},[4842],{"type":51,"value":4843}," run",{"type":46,"tag":1345,"props":4845,"children":4846},{"style":1376},[4847],{"type":51,"value":2813},{"type":46,"tag":1345,"props":4849,"children":4850},{"style":1387},[4851],{"type":51,"value":2818},{"type":46,"tag":1345,"props":4853,"children":4854},{"style":1376},[4855],{"type":51,"value":2161},{"type":46,"tag":1345,"props":4857,"children":4858},{"class":1347,"line":1358},[4859],{"type":46,"tag":1345,"props":4860,"children":4861},{"style":1376},[4862],{"type":51,"value":4863},"  \"query\": {\n",{"type":46,"tag":1345,"props":4865,"children":4866},{"class":1347,"line":33},[4867],{"type":46,"tag":1345,"props":4868,"children":4869},{"style":1376},[4870],{"type":51,"value":4871},"    \"modelId\": \"\u003CdraftWorkbookModelId>\",\n",{"type":46,"tag":1345,"props":4873,"children":4874},{"class":1347,"line":1423},[4875],{"type":46,"tag":1345,"props":4876,"children":4877},{"style":1376},[4878],{"type":51,"value":4879},"    \"table\": \"order_items\",\n",{"type":46,"tag":1345,"props":4881,"children":4882},{"class":1347,"line":1433},[4883],{"type":46,"tag":1345,"props":4884,"children":4885},{"style":1376},[4886],{"type":51,"value":4887},"    \"fields\": [\"order_items.id\", \"order_items.high_value_count\"],\n",{"type":46,"tag":1345,"props":4889,"children":4890},{"class":1347,"line":1442},[4891],{"type":46,"tag":1345,"props":4892,"children":4893},{"style":1376},[4894],{"type":51,"value":4895},"    \"limit\": 1,\n",{"type":46,"tag":1345,"props":4897,"children":4898},{"class":1347,"line":1592},[4899],{"type":46,"tag":1345,"props":4900,"children":4901},{"style":1376},[4902],{"type":51,"value":4903},"    \"join_paths_from_topic_name\": \"order_items\"\n",{"type":46,"tag":1345,"props":4905,"children":4906},{"class":1347,"line":2873},[4907],{"type":46,"tag":1345,"props":4908,"children":4909},{"style":1376},[4910],{"type":51,"value":3210},{"type":46,"tag":1345,"props":4912,"children":4913},{"class":1347,"line":2882},[4914,4918],{"type":46,"tag":1345,"props":4915,"children":4916},{"style":1376},[4917],{"type":51,"value":3219},{"type":46,"tag":1345,"props":4919,"children":4920},{"style":1387},[4921],{"type":51,"value":3224},{"type":46,"tag":54,"props":4923,"children":4924},{},[4925,4927,4933,4935,4940,4942,4947,4949,4955,4957,4962],{"type":51,"value":4926},"(Standalone ",{"type":46,"tag":75,"props":4928,"children":4930},{"className":4929},[],[4931],{"type":51,"value":4932},"query run",{"type":51,"value":4934}," bodies still take a ",{"type":46,"tag":75,"props":4936,"children":4938},{"className":4937},[],[4939],{"type":51,"value":591},{"type":51,"value":4941}," — only ",{"type":46,"tag":67,"props":4943,"children":4944},{},[4945],{"type":51,"value":4946},"tile",{"type":51,"value":4948}," queries inside v2 documents omit it.) If the response errors on a field that exists in the shared model (e.g. ",{"type":46,"tag":75,"props":4950,"children":4952},{"className":4951},[],[4953],{"type":51,"value":4954},"order_items.id",{"type":51,"value":4956},"), your write likely used combined mode and ignored the inherited fields. Re-run Step 2 with ",{"type":46,"tag":75,"props":4958,"children":4960},{"className":4959},[],[4961],{"type":51,"value":4547},{"type":51,"value":232},{"type":46,"tag":189,"props":4964,"children":4966},{"id":4965},"dashboard-filters-controls",[4967],{"type":51,"value":3420},{"type":46,"tag":54,"props":4969,"children":4970},{},[4971,4973,4979,4981,4987,4988,4993,4995,5000],{"type":51,"value":4972},"Filters and interactive controls share one envelope slice: ",{"type":46,"tag":75,"props":4974,"children":4976},{"className":4975},[],[4977],{"type":51,"value":4978},"controls: {data, order}",{"type":51,"value":4980},". Each entry is ",{"type":46,"tag":75,"props":4982,"children":4984},{"className":4983},[],[4985],{"type":51,"value":4986},"{config, map}",{"type":51,"value":492},{"type":46,"tag":75,"props":4989,"children":4991},{"className":4990},[],[4992],{"type":51,"value":269},{"type":51,"value":4994}," holds the filter\u002Fcontrol definition, ",{"type":46,"tag":75,"props":4996,"children":4998},{"className":4997},[],[4999],{"type":51,"value":883},{"type":51,"value":5001}," optionally scopes it per tile. Include them at create time or patch them in later (controls merge by key like tiles):",{"type":46,"tag":1334,"props":5003,"children":5005},{"className":1336,"code":5004,"language":1338,"meta":1339,"style":1339},"omni documents v2-create --body '{\n  \"modelId\": \"your-shared-model-id\",\n  \"name\": \"Filtered Dashboard\",\n  \"controls\": {\n    \"data\": {\n      \"date_filter\": {\n        \"config\": {\n          \"type\": \"date\", \"kind\": \"TIME_FOR_INTERVAL_DURATION\", \"ui_type\": \"PAST\",\n          \"left_side\": \"6 months ago\", \"right_side\": \"6 months\",\n          \"fieldName\": \"order_items.created_at\",\n          \"topic\": \"order_items\", \"base_view\": \"order_items\",\n          \"label\": \"Date Range\"\n        },\n        \"map\": {}\n      },\n      \"state_filter\": {\n        \"config\": {\n          \"type\": \"string\", \"kind\": \"EQUALS\",\n          \"fieldName\": \"users.state\",\n          \"topic\": \"order_items\", \"base_view\": \"order_items\",\n          \"label\": \"State\", \"values\": []\n        },\n        \"map\": {}\n      }\n    },\n    \"order\": [\"date_filter\", \"state_filter\"]\n  },\n  \"queryPresentations\": { … }\n}'\n",[5006],{"type":46,"tag":75,"props":5007,"children":5008},{"__ignoreMap":1339},[5009,5036,5043,5051,5059,5066,5074,5082,5090,5098,5106,5114,5122,5129,5137,5145,5153,5160,5168,5176,5183,5191,5198,5205,5212,5219,5227,5235,5243],{"type":46,"tag":1345,"props":5010,"children":5011},{"class":1347,"line":1348},[5012,5016,5020,5024,5028,5032],{"type":46,"tag":1345,"props":5013,"children":5014},{"style":1446},[5015],{"type":51,"value":22},{"type":46,"tag":1345,"props":5017,"children":5018},{"style":1376},[5019],{"type":51,"value":1453},{"type":46,"tag":1345,"props":5021,"children":5022},{"style":1376},[5023],{"type":51,"value":1793},{"type":46,"tag":1345,"props":5025,"children":5026},{"style":1376},[5027],{"type":51,"value":2813},{"type":46,"tag":1345,"props":5029,"children":5030},{"style":1387},[5031],{"type":51,"value":2818},{"type":46,"tag":1345,"props":5033,"children":5034},{"style":1376},[5035],{"type":51,"value":2161},{"type":46,"tag":1345,"props":5037,"children":5038},{"class":1347,"line":1358},[5039],{"type":46,"tag":1345,"props":5040,"children":5041},{"style":1376},[5042],{"type":51,"value":2830},{"type":46,"tag":1345,"props":5044,"children":5045},{"class":1347,"line":33},[5046],{"type":46,"tag":1345,"props":5047,"children":5048},{"style":1376},[5049],{"type":51,"value":5050},"  \"name\": \"Filtered Dashboard\",\n",{"type":46,"tag":1345,"props":5052,"children":5053},{"class":1347,"line":1423},[5054],{"type":46,"tag":1345,"props":5055,"children":5056},{"style":1376},[5057],{"type":51,"value":5058},"  \"controls\": {\n",{"type":46,"tag":1345,"props":5060,"children":5061},{"class":1347,"line":1433},[5062],{"type":46,"tag":1345,"props":5063,"children":5064},{"style":1376},[5065],{"type":51,"value":2854},{"type":46,"tag":1345,"props":5067,"children":5068},{"class":1347,"line":1442},[5069],{"type":46,"tag":1345,"props":5070,"children":5071},{"style":1376},[5072],{"type":51,"value":5073},"      \"date_filter\": {\n",{"type":46,"tag":1345,"props":5075,"children":5076},{"class":1347,"line":1592},[5077],{"type":46,"tag":1345,"props":5078,"children":5079},{"style":1376},[5080],{"type":51,"value":5081},"        \"config\": {\n",{"type":46,"tag":1345,"props":5083,"children":5084},{"class":1347,"line":2873},[5085],{"type":46,"tag":1345,"props":5086,"children":5087},{"style":1376},[5088],{"type":51,"value":5089},"          \"type\": \"date\", \"kind\": \"TIME_FOR_INTERVAL_DURATION\", \"ui_type\": \"PAST\",\n",{"type":46,"tag":1345,"props":5091,"children":5092},{"class":1347,"line":2882},[5093],{"type":46,"tag":1345,"props":5094,"children":5095},{"style":1376},[5096],{"type":51,"value":5097},"          \"left_side\": \"6 months ago\", \"right_side\": \"6 months\",\n",{"type":46,"tag":1345,"props":5099,"children":5100},{"class":1347,"line":2891},[5101],{"type":46,"tag":1345,"props":5102,"children":5103},{"style":1376},[5104],{"type":51,"value":5105},"          \"fieldName\": \"order_items.created_at\",\n",{"type":46,"tag":1345,"props":5107,"children":5108},{"class":1347,"line":2900},[5109],{"type":46,"tag":1345,"props":5110,"children":5111},{"style":1376},[5112],{"type":51,"value":5113},"          \"topic\": \"order_items\", \"base_view\": \"order_items\",\n",{"type":46,"tag":1345,"props":5115,"children":5116},{"class":1347,"line":2909},[5117],{"type":46,"tag":1345,"props":5118,"children":5119},{"style":1376},[5120],{"type":51,"value":5121},"          \"label\": \"Date Range\"\n",{"type":46,"tag":1345,"props":5123,"children":5124},{"class":1347,"line":2918},[5125],{"type":46,"tag":1345,"props":5126,"children":5127},{"style":1376},[5128],{"type":51,"value":2996},{"type":46,"tag":1345,"props":5130,"children":5131},{"class":1347,"line":2927},[5132],{"type":46,"tag":1345,"props":5133,"children":5134},{"style":1376},[5135],{"type":51,"value":5136},"        \"map\": {}\n",{"type":46,"tag":1345,"props":5138,"children":5139},{"class":1347,"line":2936},[5140],{"type":46,"tag":1345,"props":5141,"children":5142},{"style":1376},[5143],{"type":51,"value":5144},"      },\n",{"type":46,"tag":1345,"props":5146,"children":5147},{"class":1347,"line":2945},[5148],{"type":46,"tag":1345,"props":5149,"children":5150},{"style":1376},[5151],{"type":51,"value":5152},"      \"state_filter\": {\n",{"type":46,"tag":1345,"props":5154,"children":5155},{"class":1347,"line":2954},[5156],{"type":46,"tag":1345,"props":5157,"children":5158},{"style":1376},[5159],{"type":51,"value":5081},{"type":46,"tag":1345,"props":5161,"children":5162},{"class":1347,"line":2963},[5163],{"type":46,"tag":1345,"props":5164,"children":5165},{"style":1376},[5166],{"type":51,"value":5167},"          \"type\": \"string\", \"kind\": \"EQUALS\",\n",{"type":46,"tag":1345,"props":5169,"children":5170},{"class":1347,"line":2972},[5171],{"type":46,"tag":1345,"props":5172,"children":5173},{"style":1376},[5174],{"type":51,"value":5175},"          \"fieldName\": \"users.state\",\n",{"type":46,"tag":1345,"props":5177,"children":5178},{"class":1347,"line":2981},[5179],{"type":46,"tag":1345,"props":5180,"children":5181},{"style":1376},[5182],{"type":51,"value":5113},{"type":46,"tag":1345,"props":5184,"children":5185},{"class":1347,"line":2990},[5186],{"type":46,"tag":1345,"props":5187,"children":5188},{"style":1376},[5189],{"type":51,"value":5190},"          \"label\": \"State\", \"values\": []\n",{"type":46,"tag":1345,"props":5192,"children":5193},{"class":1347,"line":2999},[5194],{"type":46,"tag":1345,"props":5195,"children":5196},{"style":1376},[5197],{"type":51,"value":2996},{"type":46,"tag":1345,"props":5199,"children":5200},{"class":1347,"line":3008},[5201],{"type":46,"tag":1345,"props":5202,"children":5203},{"style":1376},[5204],{"type":51,"value":5136},{"type":46,"tag":1345,"props":5206,"children":5207},{"class":1347,"line":3017},[5208],{"type":46,"tag":1345,"props":5209,"children":5210},{"style":1376},[5211],{"type":51,"value":3183},{"type":46,"tag":1345,"props":5213,"children":5214},{"class":1347,"line":3025},[5215],{"type":46,"tag":1345,"props":5216,"children":5217},{"style":1376},[5218],{"type":51,"value":3192},{"type":46,"tag":1345,"props":5220,"children":5221},{"class":1347,"line":3034},[5222],{"type":46,"tag":1345,"props":5223,"children":5224},{"style":1376},[5225],{"type":51,"value":5226},"    \"order\": [\"date_filter\", \"state_filter\"]\n",{"type":46,"tag":1345,"props":5228,"children":5229},{"class":1347,"line":29},[5230],{"type":46,"tag":1345,"props":5231,"children":5232},{"style":1376},[5233],{"type":51,"value":5234},"  },\n",{"type":46,"tag":1345,"props":5236,"children":5237},{"class":1347,"line":3051},[5238],{"type":46,"tag":1345,"props":5239,"children":5240},{"style":1376},[5241],{"type":51,"value":5242},"  \"queryPresentations\": { … }\n",{"type":46,"tag":1345,"props":5244,"children":5245},{"class":1347,"line":3060},[5246,5250],{"type":46,"tag":1345,"props":5247,"children":5248},{"style":1376},[5249],{"type":51,"value":3219},{"type":46,"tag":1345,"props":5251,"children":5252},{"style":1387},[5253],{"type":51,"value":3224},{"type":46,"tag":196,"props":5255,"children":5256},{},[5257,5276,5298,5323,5333,5349],{"type":46,"tag":200,"props":5258,"children":5259},{},[5260,5262,5268,5270,5275],{"type":51,"value":5261},"The keys in ",{"type":46,"tag":75,"props":5263,"children":5265},{"className":5264},[],[5266],{"type":51,"value":5267},"controls.data",{"type":51,"value":5269}," are arbitrary IDs and must match ",{"type":46,"tag":75,"props":5271,"children":5273},{"className":5272},[],[5274],{"type":51,"value":384},{"type":51,"value":232},{"type":46,"tag":200,"props":5277,"children":5278},{},[5279,5284,5286,5291,5293,5297],{"type":46,"tag":67,"props":5280,"children":5281},{},[5282],{"type":51,"value":5283},"Filter shapes",{"type":51,"value":5285}," (date \u002F string \u002F number \u002F boolean, hidden, required) and ",{"type":46,"tag":67,"props":5287,"children":5288},{},[5289],{"type":51,"value":5290},"interactive controls",{"type":51,"value":5292}," (field\u002Ftimeframe switchers) are documented with examples in ",{"type":46,"tag":180,"props":5294,"children":5295},{"href":896},[5296],{"type":51,"value":896},{"type":51,"value":232},{"type":46,"tag":200,"props":5299,"children":5300},{},[5301,5306,5308,5313,5315,5321],{"type":46,"tag":75,"props":5302,"children":5304},{"className":5303},[],[5305],{"type":51,"value":883},{"type":51,"value":5307}," scopes a control per tile: ",{"type":46,"tag":75,"props":5309,"children":5311},{"className":5310},[],[5312],{"type":51,"value":891},{"type":51,"value":5314}," excludes a tile, ",{"type":46,"tag":75,"props":5316,"children":5318},{"className":5317},[],[5319],{"type":51,"value":5320},"{\"\u003CtileKey>\": \"\u003CfieldName>\"}",{"type":51,"value":5322}," remaps it — for both filters and interactive switchers.",{"type":46,"tag":200,"props":5324,"children":5325},{},[5326,5328,5332],{"type":51,"value":5327},"A control renders only where a container places it (filter bar, sidebar, or in-tile) — otherwise it lands in the HIDDEN CONTROLS tray. See ",{"type":46,"tag":180,"props":5329,"children":5330},{"href":438},[5331],{"type":51,"value":438},{"type":51,"value":232},{"type":46,"tag":200,"props":5334,"children":5335},{},[5336,5347],{"type":46,"tag":67,"props":5337,"children":5338},{},[5339,5341],{"type":51,"value":5340},"Every filter MUST include ",{"type":46,"tag":75,"props":5342,"children":5344},{"className":5343},[],[5345],{"type":51,"value":5346},"fieldName",{"type":51,"value":5348}," with the fully qualified field name (no timeframe bracket for date filters), or it won't bind to any column.",{"type":46,"tag":200,"props":5350,"children":5351},{},[5352,5354,5360,5362,5367],{"type":51,"value":5353},"To learn exact shapes, build filters in the Omni UI and read them back with ",{"type":46,"tag":75,"props":5355,"children":5357},{"className":5356},[],[5358],{"type":51,"value":5359},"omni documents v2-get",{"type":51,"value":5361}," — the ",{"type":46,"tag":75,"props":5363,"children":5365},{"className":5364},[],[5366],{"type":51,"value":124},{"type":51,"value":5368}," slice is directly reusable in a patch.",{"type":46,"tag":189,"props":5370,"children":5372},{"id":5371},"document-settings",[5373],{"type":51,"value":5374},"Document Settings",{"type":46,"tag":54,"props":5376,"children":5377},{},[5378,5383,5385,5391,5393,5399,5400,5406,5408,5413,5415,5421,5422,5428,5429,5435,5436,5441,5443,5449,5450,5456],{"type":46,"tag":75,"props":5379,"children":5381},{"className":5380},[],[5382],{"type":51,"value":139},{"type":51,"value":5384}," is a shallow-merged object: ",{"type":46,"tag":75,"props":5386,"children":5388},{"className":5387},[],[5389],{"type":51,"value":5390},"crossfilterEnabled",{"type":51,"value":5392}," (click a value in one tile to filter the others), ",{"type":46,"tag":75,"props":5394,"children":5396},{"className":5395},[],[5397],{"type":51,"value":5398},"facetFilters",{"type":51,"value":118},{"type":46,"tag":75,"props":5401,"children":5403},{"className":5402},[],[5404],{"type":51,"value":5405},"refreshInterval",{"type":51,"value":5407}," (seconds, ",{"type":46,"tag":75,"props":5409,"children":5411},{"className":5410},[],[5412],{"type":51,"value":394},{"type":51,"value":5414}," disables), ",{"type":46,"tag":75,"props":5416,"children":5418},{"className":5417},[],[5419],{"type":51,"value":5420},"runQueriesOn",{"type":51,"value":102},{"type":46,"tag":75,"props":5423,"children":5425},{"className":5424},[],[5426],{"type":51,"value":5427},"\"current-page\"",{"type":51,"value":1957},{"type":46,"tag":75,"props":5430,"children":5432},{"className":5431},[],[5433],{"type":51,"value":5434},"\"all-pages\"",{"type":51,"value":1957},{"type":46,"tag":75,"props":5437,"children":5439},{"className":5438},[],[5440],{"type":51,"value":394},{"type":51,"value":5442},"), and ",{"type":46,"tag":75,"props":5444,"children":5446},{"className":5445},[],[5447],{"type":51,"value":5448},"customText",{"type":51,"value":102},{"type":46,"tag":75,"props":5451,"children":5453},{"className":5452},[],[5454],{"type":51,"value":5455},"{queryError, queryNoResults}",{"type":51,"value":5457}," overrides). Patch only the keys you're changing.",{"type":46,"tag":189,"props":5459,"children":5461},{"id":5460},"layout-containers",[5462],{"type":51,"value":5463},"Layout (containers)",{"type":46,"tag":54,"props":5465,"children":5466},{},[5467,5468,5473,5475,5481,5483,5489,5491,5497,5499,5505,5506,5516,5518,5523,5525,5530,5532,5537,5539,5543],{"type":51,"value":3380},{"type":46,"tag":75,"props":5469,"children":5471},{"className":5470},[],[5472],{"type":51,"value":131},{"type":51,"value":5474}," tree decides where tiles and controls render: a reserved ",{"type":46,"tag":75,"props":5476,"children":5478},{"className":5477},[],[5479],{"type":51,"value":5480},"\"filter-bar\"",{"type":51,"value":5482}," stack, then one ",{"type":46,"tag":75,"props":5484,"children":5486},{"className":5485},[],[5487],{"type":51,"value":5488},"page",{"type":51,"value":5490}," container per page, each holding a 24-column ",{"type":46,"tag":75,"props":5492,"children":5494},{"className":5493},[],[5495],{"type":51,"value":5496},"grid",{"type":51,"value":5498}," of tile stacks with ",{"type":46,"tag":75,"props":5500,"children":5502},{"className":5501},[],[5503],{"type":51,"value":5504},"gridPosition {x,y,w,h}",{"type":51,"value":2348},{"type":46,"tag":67,"props":5507,"children":5508},{},[5509,5511],{"type":51,"value":5510},"Safe default on create: omit ",{"type":46,"tag":75,"props":5512,"children":5514},{"className":5513},[],[5515],{"type":51,"value":131},{"type":51,"value":5517}," and let the server lay out tile ",{"type":46,"tag":75,"props":5519,"children":5521},{"className":5520},[],[5522],{"type":51,"value":455},{"type":51,"value":5524},", then author the full tree when you add more tiles. When editing, ",{"type":46,"tag":75,"props":5526,"children":5528},{"className":5527},[],[5529],{"type":51,"value":131},{"type":51,"value":5531}," is a ",{"type":46,"tag":67,"props":5533,"children":5534},{},[5535],{"type":51,"value":5536},"full replacement",{"type":51,"value":5538}," — round-trip the existing array with your change applied. Multi-page dashboards, page switchers, grouped bands, in-tile controls, and sizing rules: ",{"type":46,"tag":180,"props":5540,"children":5541},{"href":438},[5542],{"type":51,"value":438},{"type":51,"value":232},{"type":46,"tag":189,"props":5545,"children":5547},{"id":5546},"url-patterns",[5548],{"type":51,"value":5549},"URL Patterns",{"type":46,"tag":54,"props":5551,"children":5552},{},[5553],{"type":51,"value":5554},"After creating or finding content, always provide the user a direct link:",{"type":46,"tag":1334,"props":5556,"children":5560},{"className":5557,"code":5559,"language":51},[5558],"language-text","Dashboard: {OMNI_BASE_URL}\u002Fdashboards\u002F{identifier}\nWorkbook:  {OMNI_BASE_URL}\u002Fw\u002F{identifier}\nDraft:     {OMNI_BASE_URL}\u002Fdashboards\u002F{draftIdentifier}\n",[5561],{"type":46,"tag":75,"props":5562,"children":5563},{"__ignoreMap":1339},[5564],{"type":51,"value":5559},{"type":46,"tag":54,"props":5566,"children":5567},{},[5568,5569,5574,5576,5581,5582,5587,5588,5593,5594,5599,5601,5607,5609,5615],{"type":51,"value":3380},{"type":46,"tag":75,"props":5570,"children":5572},{"className":5571},[],[5573],{"type":51,"value":1236},{"type":51,"value":5575}," comes from the ",{"type":46,"tag":75,"props":5577,"children":5579},{"className":5578},[],[5580],{"type":51,"value":424},{"type":51,"value":1259},{"type":46,"tag":75,"props":5583,"children":5585},{"className":5584},[],[5586],{"type":51,"value":1265},{"type":51,"value":982},{"type":46,"tag":75,"props":5589,"children":5591},{"className":5590},[],[5592],{"type":51,"value":3991},{"type":51,"value":5575},{"type":46,"tag":75,"props":5595,"children":5597},{"className":5596},[],[5598],{"type":51,"value":2338},{"type":51,"value":5600}," response or ",{"type":46,"tag":75,"props":5602,"children":5604},{"className":5603},[],[5605],{"type":51,"value":5606},"omni documents list-drafts",{"type":51,"value":5608},".\nReplace ",{"type":46,"tag":75,"props":5610,"children":5612},{"className":5611},[],[5613],{"type":51,"value":5614},"{OMNI_BASE_URL}",{"type":51,"value":5616}," with the actual base URL from the active profile or\nenvironment, normalized without a trailing slash. Do not return the literal\nplaceholder string unless credentials are unavailable and you explicitly say the\nURL is a template.",{"type":46,"tag":189,"props":5618,"children":5620},{"id":5619},"validation-loops",[5621],{"type":51,"value":215},{"type":46,"tag":54,"props":5623,"children":5624},{},[5625,5627,5631,5633,5638,5640,5648],{"type":51,"value":5626},"Every dashboard build or update must be validated ",{"type":46,"tag":67,"props":5628,"children":5629},{},[5630],{"type":51,"value":230},{"type":51,"value":5632}," — broken tiles, bad field references, and misconfigured viz specs fail ",{"type":46,"tag":67,"props":5634,"children":5635},{},[5636],{"type":51,"value":5637},"silently",{"type":51,"value":5639}," (\"Chart unavailable\" \u002F \"No data\") with no API-level error. The full methodology — commands, the viz-spec consistency table, and the post-creation checklist — is in ",{"type":46,"tag":67,"props":5641,"children":5642},{},[5643],{"type":46,"tag":180,"props":5644,"children":5646},{"href":5645},"references\u002Fvalidation-and-testing.md",[5647],{"type":51,"value":5645},{"type":51,"value":5649},". In brief:",{"type":46,"tag":3831,"props":5651,"children":5652},{},[5653,5678,5710,5775],{"type":46,"tag":200,"props":5654,"children":5655},{},[5656,5661,5662,5668,5670,5676],{"type":46,"tag":67,"props":5657,"children":5658},{},[5659],{"type":51,"value":5660},"Validate the model",{"type":51,"value":492},{"type":46,"tag":75,"props":5663,"children":5665},{"className":5664},[],[5666],{"type":51,"value":5667},"omni models validate \u003CmodelId>",{"type":51,"value":5669},"; treat any ",{"type":46,"tag":75,"props":5671,"children":5673},{"className":5672},[],[5674],{"type":51,"value":5675},"is_warning: false",{"type":51,"value":5677}," issue as an error.",{"type":46,"tag":200,"props":5679,"children":5680},{},[5681,5686,5688,5693,5695,5701,5702,5708],{"type":46,"tag":67,"props":5682,"children":5683},{},[5684],{"type":51,"value":5685},"Test every query first",{"type":51,"value":5687}," — run each tile's query via ",{"type":46,"tag":75,"props":5689,"children":5691},{"className":5690},[],[5692],{"type":51,"value":223},{"type":51,"value":5694}," before building (the single most important step). Check for no ",{"type":46,"tag":75,"props":5696,"children":5698},{"className":5697},[],[5699],{"type":51,"value":5700},"error",{"type":51,"value":118},{"type":46,"tag":75,"props":5703,"children":5705},{"className":5704},[],[5706],{"type":51,"value":5707},"summary.row_count > 0",{"type":51,"value":5709},", and include the same filters you'll use on the dashboard.",{"type":46,"tag":200,"props":5711,"children":5712},{},[5713,5718,5719,5725,5727,5732,5734,5739,5741,5746,5747,5753,5755,5761,5763,5769,5770,5774],{"type":46,"tag":67,"props":5714,"children":5715},{},[5716],{"type":51,"value":5717},"Check viz-spec consistency",{"type":51,"value":492},{"type":46,"tag":75,"props":5720,"children":5722},{"className":5721},[],[5723],{"type":51,"value":5724},"prefersChart: true",{"type":51,"value":5726},"; spec nested in ",{"type":46,"tag":75,"props":5728,"children":5730},{"className":5729},[],[5731],{"type":51,"value":1185},{"type":51,"value":5733},"; a valid ",{"type":46,"tag":75,"props":5735,"children":5737},{"className":5736},[],[5738],{"type":51,"value":3255},{"type":51,"value":5740}," with matching ",{"type":46,"tag":75,"props":5742,"children":5744},{"className":5743},[],[5745],{"type":51,"value":1164},{"type":51,"value":156},{"type":46,"tag":75,"props":5748,"children":5750},{"className":5749},[],[5751],{"type":51,"value":5752},"configType",{"type":51,"value":5754},"; correct ",{"type":46,"tag":75,"props":5756,"children":5758},{"className":5757},[],[5759],{"type":51,"value":5760},"_dependentAxis",{"type":51,"value":5762},"; the stack\u002Fcolor dimension in ",{"type":46,"tag":75,"props":5764,"children":5766},{"className":5765},[],[5767],{"type":51,"value":5768},"query.pivots",{"type":51,"value":301},{"type":46,"tag":180,"props":5771,"children":5772},{"href":918},[5773],{"type":51,"value":918},{"type":51,"value":232},{"type":46,"tag":200,"props":5776,"children":5777},{},[5778,5783,5785,5790,5792,5797,5799,5804,5806,5812,5813,5818],{"type":46,"tag":67,"props":5779,"children":5780},{},[5781],{"type":51,"value":5782},"Verify the draft before publishing",{"type":51,"value":5784}," — read it back with ",{"type":46,"tag":75,"props":5786,"children":5788},{"className":5787},[],[5789],{"type":51,"value":1963},{"type":51,"value":5791},", confirm ",{"type":46,"tag":75,"props":5793,"children":5795},{"className":5794},[],[5796],{"type":51,"value":2228},{"type":51,"value":5798}," keys match ",{"type":46,"tag":75,"props":5800,"children":5802},{"className":5801},[],[5803],{"type":51,"value":384},{"type":51,"value":5805},", run ",{"type":46,"tag":75,"props":5807,"children":5809},{"className":5808},[],[5810],{"type":51,"value":5811},"omni documents get-queries",{"type":51,"value":1100},{"type":46,"tag":75,"props":5814,"children":5816},{"className":5815},[],[5817],{"type":51,"value":223},{"type":51,"value":5819}," per tile, and report each tile's status + row count. After one failed corrected patch, discard the draft and report the blocker.",{"type":46,"tag":189,"props":5821,"children":5823},{"id":5822},"recommended-build-workflows",[5824],{"type":51,"value":5825},"Recommended Build Workflows",{"type":46,"tag":2630,"props":5827,"children":5829},{"id":5828},"api-first-full-programmatic-creation",[5830],{"type":51,"value":5831},"API-First (Full Programmatic Creation)",{"type":46,"tag":3831,"props":5833,"children":5834},{},[5835,5852,5869,5893,5929,5971,6000,6018],{"type":46,"tag":200,"props":5836,"children":5837},{},[5838,5843,5845,5850],{"type":46,"tag":67,"props":5839,"children":5840},{},[5841],{"type":51,"value":5842},"Discover fields",{"type":51,"value":5844}," — use ",{"type":46,"tag":75,"props":5846,"children":5848},{"className":5847},[],[5849],{"type":51,"value":80},{"type":51,"value":5851}," to find topic + fields",{"type":46,"tag":200,"props":5853,"children":5854},{},[5855,5860,5862,5867],{"type":46,"tag":67,"props":5856,"children":5857},{},[5858],{"type":51,"value":5859},"Validate model",{"type":51,"value":5861}," — run ",{"type":46,"tag":75,"props":5863,"children":5865},{"className":5864},[],[5866],{"type":51,"value":5667},{"type":51,"value":5868}," and check for errors",{"type":46,"tag":200,"props":5870,"children":5871},{},[5872,5877,5879,5884,5886,5891],{"type":46,"tag":67,"props":5873,"children":5874},{},[5875],{"type":51,"value":5876},"Test each query",{"type":51,"value":5878}," — run every query you plan to include via ",{"type":46,"tag":75,"props":5880,"children":5882},{"className":5881},[],[5883],{"type":51,"value":223},{"type":51,"value":5885}," (using ",{"type":46,"tag":75,"props":5887,"children":5889},{"className":5888},[],[5890],{"type":51,"value":630},{"type":51,"value":5892},") before building the dashboard. Include the same filters you plan to use as controls to confirm they parse correctly. This catches field name typos, missing join paths, bad filter expressions, and permission errors before they become broken tiles.",{"type":46,"tag":200,"props":5894,"children":5895},{},[5896,5901,5903,5908,5909,5914,5916,5921,5922,5927],{"type":46,"tag":67,"props":5897,"children":5898},{},[5899],{"type":51,"value":5900},"Validate viz specs",{"type":51,"value":5902}," — check each tile's ",{"type":46,"tag":75,"props":5904,"children":5906},{"className":5905},[],[5907],{"type":51,"value":3255},{"type":51,"value":156},{"type":46,"tag":75,"props":5910,"children":5912},{"className":5911},[],[5913],{"type":51,"value":1164},{"type":51,"value":5915},"\u002Finner ",{"type":46,"tag":75,"props":5917,"children":5919},{"className":5918},[],[5920],{"type":51,"value":269},{"type":51,"value":156},{"type":46,"tag":75,"props":5923,"children":5925},{"className":5924},[],[5926],{"type":51,"value":1172},{"type":51,"value":5928}," against the consistency rules before assembling the payload",{"type":46,"tag":200,"props":5930,"children":5931},{},[5932,5936,5938,5944,5945,5950,5951,5956,5957,5962,5964,5969],{"type":46,"tag":67,"props":5933,"children":5934},{},[5935],{"type":51,"value":1929},{"type":51,"value":5937}," — single ",{"type":46,"tag":75,"props":5939,"children":5941},{"className":5940},[],[5942],{"type":51,"value":5943},"omni documents v2-create",{"type":51,"value":2558},{"type":46,"tag":75,"props":5946,"children":5948},{"className":5947},[],[5949],{"type":51,"value":116},{"type":51,"value":1100},{"type":46,"tag":75,"props":5952,"children":5954},{"className":5953},[],[5955],{"type":51,"value":124},{"type":51,"value":1100},{"type":46,"tag":75,"props":5958,"children":5960},{"className":5959},[],[5961],{"type":51,"value":139},{"type":51,"value":5963}," (and ",{"type":46,"tag":75,"props":5965,"children":5967},{"className":5966},[],[5968],{"type":51,"value":131},{"type":51,"value":5970}," if multi-tile) in one body",{"type":46,"tag":200,"props":5972,"children":5973},{},[5974,5979,5980,5985,5987,5992,5993,5998],{"type":46,"tag":67,"props":5975,"children":5976},{},[5977],{"type":51,"value":5978},"Verify the dashboard",{"type":51,"value":5784},{"type":46,"tag":75,"props":5981,"children":5983},{"className":5982},[],[5984],{"type":51,"value":5359},{"type":51,"value":5986},", confirm all tiles are present and placed, then run each tile's query via ",{"type":46,"tag":75,"props":5988,"children":5990},{"className":5989},[],[5991],{"type":51,"value":5811},{"type":51,"value":1100},{"type":46,"tag":75,"props":5994,"children":5996},{"className":5995},[],[5997],{"type":51,"value":223},{"type":51,"value":5999}," to verify no broken tiles",{"type":46,"tag":200,"props":6001,"children":6002},{},[6003,6008,6010,6016],{"type":46,"tag":67,"props":6004,"children":6005},{},[6006],{"type":51,"value":6007},"Share the link",{"type":51,"value":6009}," — return ",{"type":46,"tag":75,"props":6011,"children":6013},{"className":6012},[],[6014],{"type":51,"value":6015},"{OMNI_BASE_URL}\u002Fdashboards\u002F{identifier}",{"type":51,"value":6017}," to the user (only after verification passes)",{"type":46,"tag":200,"props":6019,"children":6020},{},[6021,6026],{"type":46,"tag":67,"props":6022,"children":6023},{},[6024],{"type":51,"value":6025},"Refine in UI",{"type":51,"value":6027}," — fine chart styling and pixel-level layout tweaks are still easiest in the Omni UI",{"type":46,"tag":2630,"props":6029,"children":6031},{"id":6030},"update-existing-dashboard-1",[6032],{"type":51,"value":3817},{"type":46,"tag":3831,"props":6034,"children":6035},{},[6036,6058,6072,6112,6129,6152,6182,6205],{"type":46,"tag":200,"props":6037,"children":6038},{},[6039,6044,6045,6050,6051,6056],{"type":46,"tag":67,"props":6040,"children":6041},{},[6042],{"type":51,"value":6043},"Find the dashboard",{"type":51,"value":5844},{"type":46,"tag":75,"props":6046,"children":6048},{"className":6047},[],[6049],{"type":51,"value":88},{"type":51,"value":593},{"type":46,"tag":75,"props":6052,"children":6054},{"className":6053},[],[6055],{"type":51,"value":1265},{"type":51,"value":6057}," to locate it",{"type":46,"tag":200,"props":6059,"children":6060},{},[6061,6066,6067],{"type":46,"tag":67,"props":6062,"children":6063},{},[6064],{"type":51,"value":6065},"Read its current state",{"type":51,"value":492},{"type":46,"tag":75,"props":6068,"children":6070},{"className":6069},[],[6071],{"type":51,"value":3437},{"type":46,"tag":200,"props":6073,"children":6074},{},[6075,6079,6081,6086,6087,6092,6093,6098,6100,6105,6107],{"type":46,"tag":67,"props":6076,"children":6077},{},[6078],{"type":51,"value":3858},{"type":51,"value":6080}," — merge-by-key edits to ",{"type":46,"tag":75,"props":6082,"children":6084},{"className":6083},[],[6085],{"type":51,"value":116},{"type":51,"value":156},{"type":46,"tag":75,"props":6088,"children":6090},{"className":6089},[],[6091],{"type":51,"value":124},{"type":51,"value":156},{"type":46,"tag":75,"props":6094,"children":6096},{"className":6095},[],[6097],{"type":51,"value":139},{"type":51,"value":6099},"; full ",{"type":46,"tag":75,"props":6101,"children":6103},{"className":6102},[],[6104],{"type":51,"value":131},{"type":51,"value":6106}," tree if layout changes; re-author inner vis configs nested under ",{"type":46,"tag":75,"props":6108,"children":6110},{"className":6109},[],[6111],{"type":51,"value":269},{"type":46,"tag":200,"props":6113,"children":6114},{},[6115,6120,6122,6127],{"type":46,"tag":67,"props":6116,"children":6117},{},[6118],{"type":51,"value":6119},"Validate changes",{"type":51,"value":6121}," — run new\u002Fmodified queries via ",{"type":46,"tag":75,"props":6123,"children":6125},{"className":6124},[],[6126],{"type":51,"value":223},{"type":51,"value":6128},"; check viz specs against the consistency rules",{"type":46,"tag":200,"props":6130,"children":6131},{},[6132,6137,6138,6144,6146,6151],{"type":46,"tag":67,"props":6133,"children":6134},{},[6135],{"type":51,"value":6136},"Patch the draft",{"type":51,"value":492},{"type":46,"tag":75,"props":6139,"children":6141},{"className":6140},[],[6142],{"type":51,"value":6143},"omni documents v2-patch-draft \u003Cidentifier> --body …",{"type":51,"value":6145}," (with a ",{"type":46,"tag":75,"props":6147,"children":6149},{"className":6148},[],[6150],{"type":51,"value":3999},{"type":51,"value":1990},{"type":46,"tag":200,"props":6153,"children":6154},{},[6155,6160,6161,6166,6168,6174,6175,6180],{"type":46,"tag":67,"props":6156,"children":6157},{},[6158],{"type":51,"value":6159},"Verify the draft",{"type":51,"value":492},{"type":46,"tag":75,"props":6162,"children":6164},{"className":6163},[],[6165],{"type":51,"value":1963},{"type":51,"value":6167},", then ",{"type":46,"tag":75,"props":6169,"children":6171},{"className":6170},[],[6172],{"type":51,"value":6173},"get-queries",{"type":51,"value":1100},{"type":46,"tag":75,"props":6176,"children":6178},{"className":6177},[],[6179],{"type":51,"value":4932},{"type":51,"value":6181}," on modified tiles",{"type":46,"tag":200,"props":6183,"children":6184},{},[6185,6189,6190,6195,6197,6203],{"type":46,"tag":67,"props":6186,"children":6187},{},[6188],{"type":51,"value":4039},{"type":51,"value":492},{"type":46,"tag":75,"props":6191,"children":6193},{"className":6192},[],[6194],{"type":51,"value":4046},{"type":51,"value":6196},"; on failure, ",{"type":46,"tag":75,"props":6198,"children":6200},{"className":6199},[],[6201],{"type":51,"value":6202},"discard-draft",{"type":51,"value":6204}," and report",{"type":46,"tag":200,"props":6206,"children":6207},{},[6208,6212,6213,6218],{"type":46,"tag":67,"props":6209,"children":6210},{},[6211],{"type":51,"value":6007},{"type":51,"value":6009},{"type":46,"tag":75,"props":6214,"children":6216},{"className":6215},[],[6217],{"type":51,"value":6015},{"type":51,"value":6017},{"type":46,"tag":2630,"props":6220,"children":6222},{"id":6221},"ui-first-hybrid-approach",[6223],{"type":51,"value":6224},"UI-First (Hybrid Approach)",{"type":46,"tag":3831,"props":6226,"children":6227},{},[6228,6244,6254],{"type":46,"tag":200,"props":6229,"children":6230},{},[6231,6236,6237,6242],{"type":46,"tag":67,"props":6232,"children":6233},{},[6234],{"type":51,"value":6235},"Prepare the Model",{"type":51,"value":5844},{"type":46,"tag":75,"props":6238,"children":6240},{"className":6239},[],[6241],{"type":51,"value":645},{"type":51,"value":6243}," for shared fields, or the workbook-model flow above for dashboard-specific fields",{"type":46,"tag":200,"props":6245,"children":6246},{},[6247,6252],{"type":46,"tag":67,"props":6248,"children":6249},{},[6250],{"type":51,"value":6251},"Build in UI",{"type":51,"value":6253}," — add tiles, choose viz types, arrange the grid, set filters",{"type":46,"tag":200,"props":6255,"children":6256},{},[6257,6262,6264,6269],{"type":46,"tag":67,"props":6258,"children":6259},{},[6260],{"type":51,"value":6261},"Iterate via API",{"type":51,"value":6263}," — read the structure back with ",{"type":46,"tag":75,"props":6265,"children":6267},{"className":6266},[],[6268],{"type":51,"value":246},{"type":51,"value":6270},", update model fields, extract queries for reuse",{"type":46,"tag":189,"props":6272,"children":6274},{"id":6273},"dashboard-downloads",[6275],{"type":51,"value":6276},"Dashboard Downloads",{"type":46,"tag":1334,"props":6278,"children":6280},{"className":1336,"code":6279,"language":1338,"meta":1339,"style":1339},"# Start async download\nomni dashboards download \u003CdashboardId> --body '{ \"format\": \"pdf\" }'\n\n# Poll job\nomni dashboards download-status \u003CdashboardId> \u003CjobId>\n",[6281],{"type":46,"tag":75,"props":6282,"children":6283},{"__ignoreMap":1339},[6284,6292,6342,6349,6357],{"type":46,"tag":1345,"props":6285,"children":6286},{"class":1347,"line":1348},[6287],{"type":46,"tag":1345,"props":6288,"children":6289},{"style":1352},[6290],{"type":51,"value":6291},"# Start async download\n",{"type":46,"tag":1345,"props":6293,"children":6294},{"class":1347,"line":1358},[6295,6299,6303,6308,6312,6317,6321,6325,6329,6333,6338],{"type":46,"tag":1345,"props":6296,"children":6297},{"style":1446},[6298],{"type":51,"value":22},{"type":46,"tag":1345,"props":6300,"children":6301},{"style":1376},[6302],{"type":51,"value":1742},{"type":46,"tag":1345,"props":6304,"children":6305},{"style":1376},[6306],{"type":51,"value":6307}," download",{"type":46,"tag":1345,"props":6309,"children":6310},{"style":1387},[6311],{"type":51,"value":1558},{"type":46,"tag":1345,"props":6313,"children":6314},{"style":1376},[6315],{"type":51,"value":6316},"dashboardI",{"type":46,"tag":1345,"props":6318,"children":6319},{"style":1566},[6320],{"type":51,"value":2671},{"type":46,"tag":1345,"props":6322,"children":6323},{"style":1387},[6324],{"type":51,"value":2676},{"type":46,"tag":1345,"props":6326,"children":6327},{"style":1376},[6328],{"type":51,"value":2813},{"type":46,"tag":1345,"props":6330,"children":6331},{"style":1387},[6332],{"type":51,"value":2818},{"type":46,"tag":1345,"props":6334,"children":6335},{"style":1376},[6336],{"type":51,"value":6337},"{ \"format\": \"pdf\" }",{"type":46,"tag":1345,"props":6339,"children":6340},{"style":1387},[6341],{"type":51,"value":3224},{"type":46,"tag":1345,"props":6343,"children":6344},{"class":1347,"line":33},[6345],{"type":46,"tag":1345,"props":6346,"children":6347},{"emptyLinePlaceholder":1427},[6348],{"type":51,"value":1430},{"type":46,"tag":1345,"props":6350,"children":6351},{"class":1347,"line":1423},[6352],{"type":46,"tag":1345,"props":6353,"children":6354},{"style":1352},[6355],{"type":51,"value":6356},"# Poll job\n",{"type":46,"tag":1345,"props":6358,"children":6359},{"class":1347,"line":1433},[6360,6364,6368,6373,6377,6381,6385,6389,6393,6398,6402],{"type":46,"tag":1345,"props":6361,"children":6362},{"style":1446},[6363],{"type":51,"value":22},{"type":46,"tag":1345,"props":6365,"children":6366},{"style":1376},[6367],{"type":51,"value":1742},{"type":46,"tag":1345,"props":6369,"children":6370},{"style":1376},[6371],{"type":51,"value":6372}," download-status",{"type":46,"tag":1345,"props":6374,"children":6375},{"style":1387},[6376],{"type":51,"value":1558},{"type":46,"tag":1345,"props":6378,"children":6379},{"style":1376},[6380],{"type":51,"value":6316},{"type":46,"tag":1345,"props":6382,"children":6383},{"style":1566},[6384],{"type":51,"value":2671},{"type":46,"tag":1345,"props":6386,"children":6387},{"style":1387},[6388],{"type":51,"value":2676},{"type":46,"tag":1345,"props":6390,"children":6391},{"style":1387},[6392],{"type":51,"value":1558},{"type":46,"tag":1345,"props":6394,"children":6395},{"style":1376},[6396],{"type":51,"value":6397},"jobI",{"type":46,"tag":1345,"props":6399,"children":6400},{"style":1566},[6401],{"type":51,"value":2671},{"type":46,"tag":1345,"props":6403,"children":6404},{"style":1387},[6405],{"type":51,"value":1574},{"type":46,"tag":189,"props":6407,"children":6409},{"id":6408},"docs-reference",[6410],{"type":51,"value":6411},"Docs Reference",{"type":46,"tag":196,"props":6413,"children":6414},{},[6415,6458],{"type":46,"tag":200,"props":6416,"children":6417},{},[6418,6426,6428,6434,6435,6442,6443,6450,6451],{"type":46,"tag":180,"props":6419,"children":6423},{"href":6420,"rel":6421},"https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fdocuments.md",[6422],"nofollow",[6424],{"type":51,"value":6425},"Documents API",{"type":51,"value":6427}," · ",{"type":46,"tag":180,"props":6429,"children":6432},{"href":6430,"rel":6431},"https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fdashboard-downloads.md",[6422],[6433],{"type":51,"value":6276},{"type":51,"value":6427},{"type":46,"tag":180,"props":6436,"children":6439},{"href":6437,"rel":6438},"https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fqueries.md",[6422],[6440],{"type":51,"value":6441},"Query API",{"type":51,"value":6427},{"type":46,"tag":180,"props":6444,"children":6447},{"href":6445,"rel":6446},"https:\u002F\u002Fdocs.omni.co\u002Fapi\u002Fschedules.md",[6422],[6448],{"type":51,"value":6449},"Schedules API",{"type":51,"value":6427},{"type":46,"tag":180,"props":6452,"children":6455},{"href":6453,"rel":6454},"https:\u002F\u002Fdocs.omni.co\u002Fvisualize-present\u002Fvisualizations.md",[6422],[6456],{"type":51,"value":6457},"Visualization Types",{"type":46,"tag":200,"props":6459,"children":6460},{},[6461,6466,6467,6472,6473,6478,6479,6484,6485,6490,6491,6496,6497,6503,6504,6509,6510,6515,6516,6521,6522],{"type":46,"tag":67,"props":6462,"children":6463},{},[6464],{"type":51,"value":6465},"Skill references",{"type":51,"value":820},{"type":46,"tag":180,"props":6468,"children":6469},{"href":304},[6470],{"type":51,"value":6471},"documents-v2.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6474,"children":6475},{"href":438},[6476],{"type":51,"value":6477},"containers.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6480,"children":6481},{"href":896},[6482],{"type":51,"value":6483},"controls.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6486,"children":6487},{"href":737},[6488],{"type":51,"value":6489},"queryPresentations.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6492,"children":6493},{"href":918},[6494],{"type":51,"value":6495},"visConfig.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6498,"children":6500},{"href":6499},"references\u002Fmarkdown-tiles.md",[6501],{"type":51,"value":6502},"markdown-tiles.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6505,"children":6506},{"href":1036},[6507],{"type":51,"value":6508},"mustache.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6511,"children":6512},{"href":4066},[6513],{"type":51,"value":6514},"updating-dashboards.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6517,"children":6518},{"href":2364},[6519],{"type":51,"value":6520},"branch-bound-drafts.md",{"type":51,"value":6427},{"type":46,"tag":180,"props":6523,"children":6524},{"href":5645},[6525],{"type":51,"value":6526},"validation-and-testing.md",{"type":46,"tag":189,"props":6528,"children":6530},{"id":6529},"related-skills",[6531],{"type":51,"value":6532},"Related Skills",{"type":46,"tag":196,"props":6534,"children":6535},{},[6536,6545,6554,6563,6572],{"type":46,"tag":200,"props":6537,"children":6538},{},[6539,6543],{"type":46,"tag":67,"props":6540,"children":6541},{},[6542],{"type":51,"value":80},{"type":51,"value":6544}," — understand available fields",{"type":46,"tag":200,"props":6546,"children":6547},{},[6548,6552],{"type":46,"tag":67,"props":6549,"children":6550},{},[6551],{"type":51,"value":645},{"type":51,"value":6553}," — create shared model fields",{"type":46,"tag":200,"props":6555,"children":6556},{},[6557,6561],{"type":46,"tag":67,"props":6558,"children":6559},{},[6560],{"type":51,"value":630},{"type":51,"value":6562}," — test queries before adding to dashboards",{"type":46,"tag":200,"props":6564,"children":6565},{},[6566,6570],{"type":46,"tag":67,"props":6567,"children":6568},{},[6569],{"type":51,"value":88},{"type":51,"value":6571}," — find existing dashboards to learn from",{"type":46,"tag":200,"props":6573,"children":6574},{},[6575,6580],{"type":46,"tag":67,"props":6576,"children":6577},{},[6578],{"type":51,"value":6579},"omni-embed",{"type":51,"value":6581}," — embed dashboards you've built in external apps",{"type":46,"tag":6583,"props":6584,"children":6585},"style",{},[6586],{"type":51,"value":6587},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":6589,"total":2900},[6590,6599,6611,6626,6634,6647,6662,6674,6689,6702,6717],{"slug":750,"name":750,"fn":6591,"description":6592,"org":6593,"tags":6594,"stars":29,"repoUrl":30,"updatedAt":6598},"administer Omni Analytics","Administer an Omni Analytics instance — manage connections, users, groups, user attributes, permissions, schedules, and schema refreshes via the Omni CLI. Use this skill whenever someone wants to manage users or groups, set up permissions on a dashboard or folder, configure user attributes, create or modify schedules, manage database connections, refresh a schema, set up access controls, provision users, or any variant of \"add a user\", \"give access to\", \"set up permissions\", \"who has access\", \"configure connection\", \"refresh the schema\", or \"schedule a delivery\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6595,6596,6597],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},"2026-04-06T18:10:58.235995",{"slug":6600,"name":6600,"fn":6601,"description":6602,"org":6603,"tags":6604,"stars":29,"repoUrl":30,"updatedAt":6610},"omni-ai-eval","evaluate Omni AI query accuracy","Evaluate Omni AI accuracy using Omni's built-in eval system — define a prompt set, run a judged eval against a model (or branch), and read the accuracy-judge verdicts. Use this skill whenever someone wants to evaluate Omni AI, benchmark Blobby, run regression tests, compare AI output across branches or model-context changes, measure AI quality, run A\u002FB tests on model changes, assess the impact of an ai_context or modeling change, or any variant of \"run evals\", \"test Blobby\", \"benchmark query generation\", \"compare AI results\", \"regression test\", \"how accurate is the AI\", or \"measure the impact of my changes\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6605,6606,6609],{"name":27,"slug":28,"type":16},{"name":6607,"slug":6608,"type":16},"Evals","evals",{"name":21,"slug":22,"type":16},"2026-04-06T18:10:59.485921",{"slug":6612,"name":6612,"fn":6613,"description":6614,"org":6615,"tags":6616,"stars":29,"repoUrl":30,"updatedAt":6625},"omni-ai-optimizer","optimize Omni models for AI","Optimize your Omni Analytics model for Blobby, the Omni Agent — configure ai_context, ai_fields, synonyms, sample_queries, and AI-specific topic extensions. Use this skill whenever someone wants to improve AI accuracy in Omni, make Blobby smarter, add AI context or example questions, curate which fields the AI sees, personalize AI context by user attribute, scope context to a model tier or agent, diagnose context-window pruning or truncation, control which topics AI can reach, troubleshoot why Blobby gives wrong answers, or any variant of \"make the AI better\", \"Blobby isn't answering correctly\", \"optimize for AI\", or \"teach the AI about our data\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6617,6620,6621,6624],{"name":6618,"slug":6619,"type":16},"AI Context","ai-context",{"name":27,"slug":28,"type":16},{"name":6622,"slug":6623,"type":16},"Data Modeling","data-modeling",{"name":21,"slug":22,"type":16},"2026-07-27T06:09:42.358967",{"slug":4,"name":4,"fn":5,"description":6,"org":6627,"tags":6628,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6629,6630,6631,6632,6633],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"slug":88,"name":88,"fn":6635,"description":6636,"org":6637,"tags":6638,"stars":29,"repoUrl":30,"updatedAt":6646},"find and organize Omni Analytics content","Find, browse, and organize content in Omni Analytics — dashboards, workbooks, folders, and labels — using the Omni CLI. Use this skill whenever someone wants to find an existing dashboard, search for content, list workbooks, browse folders, see what dashboards exist, find popular reports, download a dashboard as PDF or PNG, favorite content, manage labels on documents, or any variant of \"find the dashboard about\", \"what reports do we have\", \"show me our dashboards\", \"where is the sales report\", or \"download this dashboard\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6639,6640,6641,6642,6643],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},{"name":6644,"slug":6645,"type":16},"Search","search","2026-04-06T18:11:04.516766",{"slug":6579,"name":6579,"fn":6648,"description":6649,"org":6650,"tags":6651,"stars":29,"repoUrl":30,"updatedAt":6661},"embed Omni Analytics dashboards","Embed Omni Analytics dashboards in external applications — URL signing, custom themes, iframe events, entity workspaces, and permission-aware content — using the @omni-co\u002Fembed SDK and Omni CLI. Use this skill whenever someone wants to embed a dashboard, sign an embed URL, customize the embedded theme, handle embed events, listen for clicks or drills in the iframe, send filters to an embedded dashboard, set up entity workspaces, look up embed users, build a permission-aware content list, white-label an embedded dashboard, or any variant of \"embed this dashboard\", \"customize the iframe theme\", \"handle click events from the embed\", \"filter the embedded dashboard\", \"set up embedding\", or \"what dashboards can this user see\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6652,6653,6654,6657,6658],{"name":27,"slug":28,"type":16},{"name":14,"slug":15,"type":16},{"name":6655,"slug":6656,"type":16},"Frontend","frontend",{"name":21,"slug":22,"type":16},{"name":6659,"slug":6660,"type":16},"SDK","sdk","2026-04-06T18:10:55.739544",{"slug":645,"name":645,"fn":6663,"description":6664,"org":6665,"tags":6666,"stars":29,"repoUrl":30,"updatedAt":6673},"build Omni Analytics semantic models","Create and edit Omni Analytics semantic model definitions — views, topics, dimensions, measures, relationships, and query views — using YAML through the Omni CLI. Use this skill whenever someone wants to add a field, create a new dimension or measure, define a topic, set up joins between tables, modify the data model, build a new view, add a calculated field, create a relationship, edit YAML, work on a branch, promote model changes, or any variant of \"model this data\", \"add this metric\", \"create a view for\", or \"set up a join between\". Also use for migrating modeling patterns since Omni's YAML is conceptually similar to other semantic layer definitions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6667,6668,6669,6670,6671],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":6622,"slug":6623,"type":16},{"name":21,"slug":22,"type":16},{"name":6672,"slug":4618,"type":16},"YAML","2026-04-06T18:11:05.775943",{"slug":80,"name":80,"fn":6675,"description":6676,"org":6677,"tags":6678,"stars":29,"repoUrl":30,"updatedAt":6688},"discover and inspect Omni Analytics models","Discover and inspect Omni Analytics models, topics, views, fields, dimensions, measures, and relationships using the Omni CLI. Use this skill whenever someone wants to understand what data is available in Omni, explore their semantic model, find specific fields or views, check how tables join together, see what topics exist, or asks any variant of \"what can I query\", \"what fields are available\", \"show me the model\", \"what data do we have\", or \"how is this data modeled\". Also use when you need to understand the Omni model structure before building or modifying anything.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6679,6680,6681,6684,6687],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":6682,"slug":6683,"type":16},"Data Analysis","data-analysis",{"name":6685,"slug":6686,"type":16},"Knowledge Management","knowledge-management",{"name":21,"slug":22,"type":16},"2026-04-06T18:11:00.739003",{"slug":630,"name":630,"fn":6690,"description":6691,"org":6692,"tags":6693,"stars":29,"repoUrl":30,"updatedAt":6701},"query Omni Analytics semantic layer","Run queries against Omni Analytics' semantic layer using the Omni CLI, interpret results, and chain queries for multi-step analysis. Use this skill whenever someone wants to query data through Omni, run a report, get metrics, pull numbers, analyze data, ask \"how many\" \u002F \"what's the trend\" \u002F \"show me the data\", retrieve dashboard query results, or extract data from an existing dashboard or workbook. Also use for table calculations and computed columns (running totals, percent-of-total, month-over-month \u002F period-over-period change, moving averages, rankings), open-ended multi-step analysis via agentic AI jobs, and running raw SQL through the semantic layer — even when the user doesn't say \"query\" (e.g. \"add a running total column\", \"what's our MoM growth\", \"analyze revenue trends\"). For building or editing a dashboard or chart use omni-content-builder; for adding a field or measure to the model use omni-model-builder — this skill retrieves and computes over data.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6694,6695,6696,6697,6698],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":6682,"slug":6683,"type":16},{"name":21,"slug":22,"type":16},{"name":6699,"slug":6700,"type":16},"SQL","sql","2026-04-06T18:10:56.974412",{"slug":6703,"name":6703,"fn":6704,"description":6705,"org":6706,"tags":6707,"stars":29,"repoUrl":30,"updatedAt":6716},"omni-to-databricks-metric-view","convert Omni topics to Databricks Metric Views","Convert an Omni Analytics topic into a Databricks Metric View definition in Unity Catalog. Use this skill whenever someone wants to export Omni metrics to Databricks, create a Metric View from an Omni topic, harden BI metrics into Unity Catalog, or bridge Omni's semantic layer with Databricks AI\u002FBI dashboards and Genie spaces.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6708,6709,6712,6715],{"name":27,"slug":28,"type":16},{"name":6710,"slug":6711,"type":16},"Data Engineering","data-engineering",{"name":6713,"slug":6714,"type":16},"Databricks","databricks",{"name":21,"slug":22,"type":16},"2026-04-09T04:47:50.695014",{"slug":6718,"name":6718,"fn":6719,"description":6720,"org":6721,"tags":6722,"stars":29,"repoUrl":30,"updatedAt":6730},"omni-to-snowflake-semantic-view","convert Omni topics to Snowflake views","Convert an Omni Analytics topic into a Snowflake Semantic View YAML definition. Use this skill whenever someone wants to export Omni metrics to Snowflake, create a Semantic View from an Omni topic, harden BI metrics into the warehouse, or bridge Omni's semantic layer with Snowflake Cortex Analyst.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6723,6724,6725,6726,6729],{"name":27,"slug":28,"type":16},{"name":6710,"slug":6711,"type":16},{"name":21,"slug":22,"type":16},{"name":6727,"slug":6728,"type":16},"Snowflake","snowflake",{"name":6672,"slug":4618,"type":16},"2026-04-06T18:11:25.009706",{"items":6732,"total":2900},[6733,6739,6745,6752,6760,6768,6776],{"slug":750,"name":750,"fn":6591,"description":6592,"org":6734,"tags":6735,"stars":29,"repoUrl":30,"updatedAt":6598},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6736,6737,6738],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":6600,"name":6600,"fn":6601,"description":6602,"org":6740,"tags":6741,"stars":29,"repoUrl":30,"updatedAt":6610},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6742,6743,6744],{"name":27,"slug":28,"type":16},{"name":6607,"slug":6608,"type":16},{"name":21,"slug":22,"type":16},{"slug":6612,"name":6612,"fn":6613,"description":6614,"org":6746,"tags":6747,"stars":29,"repoUrl":30,"updatedAt":6625},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6748,6749,6750,6751],{"name":6618,"slug":6619,"type":16},{"name":27,"slug":28,"type":16},{"name":6622,"slug":6623,"type":16},{"name":21,"slug":22,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":6753,"tags":6754,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6755,6756,6757,6758,6759],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"slug":88,"name":88,"fn":6635,"description":6636,"org":6761,"tags":6762,"stars":29,"repoUrl":30,"updatedAt":6646},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6763,6764,6765,6766,6767],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},{"name":6644,"slug":6645,"type":16},{"slug":6579,"name":6579,"fn":6648,"description":6649,"org":6769,"tags":6770,"stars":29,"repoUrl":30,"updatedAt":6661},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6771,6772,6773,6774,6775],{"name":27,"slug":28,"type":16},{"name":14,"slug":15,"type":16},{"name":6655,"slug":6656,"type":16},{"name":21,"slug":22,"type":16},{"name":6659,"slug":6660,"type":16},{"slug":645,"name":645,"fn":6663,"description":6664,"org":6777,"tags":6778,"stars":29,"repoUrl":30,"updatedAt":6673},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[6779,6780,6781,6782,6783],{"name":27,"slug":28,"type":16},{"name":24,"slug":25,"type":16},{"name":6622,"slug":6623,"type":16},{"name":21,"slug":22,"type":16},{"name":6672,"slug":4618,"type":16}]