---
name: decomposing-data-questions
description: Decomposes an economic or statistical question into the minimal set of data units — one dataflow plus a partial key each — before any Aard MCP retrieval. Use whenever an answer needs more than one number or is not a single-series lookup — ratios, shares, per capita, growth, contributions, correlations, rankings, composite indices, comparisons across countries, periods or sectors — even when no breakdown was requested. Does not judge combinability (reasoning-linkage-confidence), run arithmetic (guarding-derived-indicators) or format citations (citing-official-statistics).
license: CC-BY-4.0
metadata:
  author: Aard
  homepage: https://aard.ai
---

# Decomposing data questions

Retrieval is the expensive, irreversible step. Everything this skill does happens before it, so that the download plan is the smallest one that answers the question — and so that the hidden methodological choices buried in a plain-English request become explicit unit attributes rather than silent assumptions.

## When to use

Any question that is not a single-series lookup. Surface signals: "ratio", "share", "per capita", "growth", "contribution", "decompose", "versus", "compared to", "as a % of", two or more countries, two or more periods, or a named composite index.

Run before the Aard MCP server's `discover` or `ask` tools.

## What a data unit is

One dataflow plus one partially specified key returning a coherent series or slice. Full schema, including the attribution, provenance and citation-identity fields, in `references/units-and-tiers.md`.

The citation-identity fields are populated here and carried unchanged from here on. They come from four different places, and the distinction is what stops one of them being quietly invented:

- `resource_title`, `resource_kind`, the full ordered `selected_members` and both availability states come from the Aard MCP server's `inspect` tool or its labelled output where present; otherwise from the provider's own dataflow, DSD and codelist metadata.
- `citation_role`, `role_evidence`, `selection_basis`, `selection_labels` and `notes` are the deterministic display projection defined by `citing-official-statistics`. The default role is always `identity` with `role_evidence=default_identity` unless bound-concept or provider-aggregate metadata justifies another role.
- `response_format`, `query_url` and `extracted_at` come from the actual data request and its response.
- `licence_label` and `licence_url` come from verified per-product provider terms — never from the agency name, and never from an assumed portal default.

This is a **skill decision-record contract, not a change to the Aard MCP, gateway or website API schema.** Where the current tool response omits a required title, label or licence field, resolve the linked provider metadata before publication, or record the field as `unavailable` and refuse the publication-ready rendering. Nothing here implies a change to any service.

**Ownership is explicit, because two skills touch these fields.** Retrieval enriches the unit with the raw `selected_members`. `citing-official-statistics` owns the citation-role assignment and the display projection, immediately before emission; `sdmx_cite.py` recomputes `selection_labels` and the interpretation notes from the supplied roles and rejects a caller-supplied projection that differs from what the roles imply. Linkage and arithmetic only preserve the fields.

## Procedure

**1. Name the analytical operation.** Exactly one of: level, comparison, ratio, share, growth rate, contribution/decomposition, correlation, ranking. Ambiguity here propagates through everything downstream, so resolve it before proceeding.

**2. Work backwards from the operation to its operands.**

- Ratio → one numerator unit, one denominator unit.
- Contribution or decomposition → the aggregate *and* its components, as previous-year-price values or published contribution-to-growth keys. Never chain-linked levels.
- Per capita → measure unit plus population base, matched on residence/territory concept and reference period.
- Share → part unit and whole unit on the same basis.

**3. Test for hidden multiplicity.** Named quantities smuggle unstated choices, and the point of this step is to convert each into a recorded attribute rather than a default nobody chose:

- "Real GDP growth" presumes a deflator and price-base choice.
- "Trade as a share of GDP" mixes a balance-of-payments or customs numerator with a national-accounts denominator, raising FOB/CIF and residence issues.
- "Debt-to-GDP" mixes a stock (end-period) with a flow (full-year).
- "Unemployment rate" presumes an age scope and an adjustment method.

**4. Test for collapse to a single dataflow, first and actively.** Component plus aggregate, level plus growth rate, or two countries of the same indicator are usually one key family within one dataflow — the cheapest and safest outcome, because it skips linkage entirely. Confirm with the Aard MCP server's `inspect` tool — if the operands differ only in one dimension whose codes live in the same codelist, emit a single unit with a multi-valued key rather than two units.

This step is worth doing properly. A decomposition that produces two units where one would do triggers a tier assessment, caveats and escalation machinery for a question that never needed them.

**5. Emit the minimal unit set**, every field populated per the schema — including the citation-identity fields, each from the source named for it above rather than from whichever response happened to be in hand.

## Worked examples

**Cross-country real GDP growth, AU vs DE.** Operation: comparison of growth rates. The collapse test succeeds — the OECD QNA expenditure growth-rates-and-contributions dataflow holds both countries as `REF_AREA` codes and growth as a `TRANSFORMATION` code, so this is one unit with key `REF_AREA=AU+DE`. No cross-source linkage, no PPPs or exchange rates needed for growth rates.

**R&D per capita.** Two units: R&D expenditure (numerator) and population (denominator), matched on `REF_AREA`, reference period and residence concept.

**Debt-to-GDP.** Two units: gross debt (stock, end-period) and GDP (flow, full-year, same currency). Record the stock/flow reference-period mismatch as an attribute for the guard skill.

**Trade share of GDP.** Two units: trade (BoP or customs) and GDP (national accounts). Record FOB/CIF and residence divergence for the linkage skill.

**Euro-area contribution analysis.** Aggregate plus components as contribution-to-growth keys, not chain-linked levels.

## Handoff

Emit the unit set to `reasoning-linkage-confidence` where two or more units must be combined; go straight to retrieval only where the question collapsed to a single unit. Preserve every provenance attribute regardless — it is the seam between skills and the anchor for attribution downstream, and it is worth carrying even when nothing downstream consumes it.

The citation-identity fields — `resource_title`, `resource_kind`, `resource_title_status`, `selected_members`, `selection_basis`, `selection_labels`, `selection_status`, `response_format`, `licence_label`, `licence_url`, `notes`, alongside `query_url` and `extracted_at` — are provenance in that same sense. They must survive retrieval, linkage and arithmetic **unchanged**. A downstream skill that rewrites a provider label to read better has destroyed the one property the field exists for.

Where two or more units must be combined and that skill is **not** available, the assessment is still owed — its absence does not make the combination safe. Do not combine silently. Either decline to combine and say why, or state plainly that the combination is unassessed, name the divergence axes you can see in the metadata (agency, unit, price base, adjustment, reference period), and let the user decide. Proceeding as though a missing assessment were a passing one is the specific failure this seam exists to prevent.

Dataflow IDs in examples are illustrative. Resolve them with the Aard MCP server's `discover` and `inspect` tools rather than hard-coding.
