v1.9.0 - Legible ABS payloads and leaner responses
v1.9.0 - Legible ABS payloads and leaner responses
This release implements the four High-priority findings from the 11 June code review,
all aimed at what the LLM consumer actually receives: ABS payloads a model can read
without a second lookup, responses that stop repeating themselves, and an MCP server
card that reports the full surface.
✨ ABS responses now carry labels, not codes
ABS data is now requested with format=csvfilewithlabels, so every retrieval returns
human-readable labels instead of bare SDMX codes:
| Field | Before | After |
|---|---|---|
| Series label | 1 / 10001 / 10 / 50 / Q |
Index numbers / All groups CPI / Original / Australia / Quarterly |
unit |
IN |
Index Numbers |
frequency |
Q |
Quarterly |
REGION dimension |
{"code": "50", "label": "50"} |
{"code": "50", "label": "Australia"} |
base_period |
25 |
Sep 2025 = 100.0 |
ABS metadata also gains a title field (e.g. "Consumer Price Index (CPI)"),
matching what RBA payloads already provided.
The labelled layout pairs every code column with an adjacent label column and replaces
DATAFLOW with STRUCTURE/STRUCTURE_ID/STRUCTURE_NAME — verified against the live
API. The parser detects the paired-column layout automatically and still parses the
legacy code-only layout unchanged, with dual-format fixtures proving both paths.
series_id is unaffected — it is still built from dimension codes, so existing
series references keep working.
📉 Per-observation dimensions are gone by default
Every observation used to repeat the full dimension dict already present on its series
descriptor — measured at ~3.5× payload inflation on the most common ABS calls, and it
would have grown further once labels landed. Observations are now slim by default:
{ "date": "2025-Q3", "series_id": "MEASURE=1|INDEX=10001|TSEST=10|REGION=50|FREQ=Q", "value": 141.1 }- Dimensions remain on each series descriptor and are encoded in
series_id. - Pass
include_observation_dimensions=truetoget_abs_data,get_rba_table,
get_apra_data, orget_economic_seriesto restore the per-observation dicts —
served from the same cache, no refetch. - The response schema no longer lists
dimensionsas required on observations; the
property stays defined for the opt-in case.
🛠 The server card now reports the full surface
/.well-known/mcp/server-card.json previously hard-coded "resources": [] and
"prompts": []. It now enumerates everything the server registers:
- 2 resources —
ausecon://catalogue,ausecon://concepts - 3 resource templates — including the previously missing
ausecon://apra/{publication_id}, which now exposes curated APRA catalogue
entries like its ABS and RBA counterparts - 8 prompts — with names, descriptions, and arguments
🧹 Housekeeping
- Removed two git-tracked file-sync collision artefacts (
* 2.py) and added a
repository-hygiene test that rejects the pattern so it cannot recur. - Backfilled the missing 1.7.0, 1.7.1, and 1.8.0 changelog sections and reconciled
server.jsonand the docs with the actual release history.
⚠️ Behavioural changes
- Label-bearing fields change value on ABS responses:
frequencyis now"Quarterly"
rather than"Q",unitis"Index Numbers"rather than"IN", and dimension
labels are human-readable. Consumers matching on short codes should use
dimensions[*].code(unchanged) instead. - Observations no longer include a
dimensionskey unless explicitly requested. - No tool names or existing inputs changed; the new
include_observation_dimensions
parameter is additive and defaults tofalse.series_idconstruction and
chronological observation ordering are unchanged.
🧪 Verification
- 803 tests passing, including new dual-format parser coverage, slim/opt-in service
tests, server-card enumeration tests, and schema validation for both observation shapes. - ABS fixtures regenerated from live
csvfilewithlabelscaptures. - Live smoke against the ABS API confirming labelled, slim, chronologically ordered
CPI retrieval end-to-end.
Full changelog: v1.8.0...v1.9.0